CoOp:Anything
Search any game and see how much of it you can play with friends: every co-op mod, its stage, quality and community rating.
SKULL ARENA — arena brawler em pixel art 16-bit pra celular. 500+ personagens, 500+ pets, 10 vs 10.
Translation pending
GamesTypeScript · CSSGitHub @jeanvicenOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Arena brawler de celular (deitado/paisagem) em pixel art 16-bit, no estilo dos "brawlers" de partida rápida: twin-stick, arbustos, paredes que quebram, super que carrega no dano, Guerra de Gangues 10 vs 10, Todos contra Todos, eventos, baús, passe e muita caveira.
Versão do documento: 2.0 · Tudo neste README foi testado (
npm test,npm run validar,npm run e2e).
Precisa de Node.js 20+ (recomendado 22).
npm install # instala as dependências (uma vez)
npm run dev # abre em http://localhost:5173 (e no IP da sua rede, pra testar no celular)
Outros comandos:
| Comando | O que faz |
|---|---|
npm run dev | servidor de desenvolvimento com recarga automática |
npm run build | confere os tipos e gera o jogo pronto em dist/ |
npm run preview | testa o dist/ como se estivesse publicado |
npm test | testes automáticos (simulação, economia, conteúdo, pixel art, rede) |
npm run validar | confere TODO o conteúdo (personagens, pets, mapas, baús, eventos, códigos, sons) |
npm run e2e | abre o jogo no Chromium, passa por todas as telas e joga uma partida (prints em e2e-shots/) |
npm run novo:personagem | cria um personagem novo (ver seção 7) |
npm run novo:pet / novo:evento / novo:codigo | cria pet / evento / código de prêmio |
npm run audio | regera os sons a partir das gravações CC0 (seção 9) |
npm run icons | regera os ícones do app |
npm run server | sobe o servidor online (seção 10) |
npm run format | arruma a formatação do código (Prettier) |
Testar no celular na mesma rede: rode npm run dev, veja o endereço "Network" no terminal
(ex.: http://192.168.0.10:5173) e abra no celular.
dist/ (qualquer hospedagem estática com HTTPS: Netlify, Vercel, GitHub Pages, Cloudflare Pages) ou use npm run server.Detalhes:
vite.config.ts + src/sw-template.js) com a lista de todos os arquivos.| Celular | PC | |
|---|---|---|
| Andar | joystick à esquerda (nasce onde o dedão encosta) | WASD / setas |
| Mirar + atirar | botão vermelho à direita: arraste pra mirar, solte pra atirar | mouse mira, clique atira (segurar = rajada) |
| Mira automática | toque rápido no botão de ataque | — |
| Habilidades | botões azuis (até 3): arraste pra mirar, solte pra usar | Q / E / R |
| SUPER | botão amarelo (brilha quando carregou) | Espaço (ou botão direito) |
| Pausa | ❚❚ no canto | Esc / P |
Configurações → Controles: tamanho, transparência, canhoto (inverte lados), vibração e dificuldade dos BOTs.
*), altares de cura (+) e pads de salto (^) espalhados pelos mapas.| Modo | Como ganha |
|---|---|
| Guerra de Gangues (10 vs 10) | Eliminou? Cai uma caveira. Pegue as caveiras dos inimigos pra pontuar (e as do seu time pra negar). 40 pontos ou mais pontos em 4:00. |
| Todos contra Todos (10) | 1 ponto por eliminação. 3 seguidas = PROCURADO (vale 2). Mais pontos em 3:00. |
| Jogar com Amigos | Sala com código: todo mundo da sala no mesmo time, BOTs completam (online). No modo local, os nomes dos amigos entram como BOTs aliados. |
| Treino | Bonecos que mostram o dano. Dá pra testar qualquer personagem (até os que você não tem). |
| Eventos | Chuva de Meteoros, Só Supers (super 4x mais rápido), Caveira Gigante (chefão coop) — aparecem no seletor quando o evento está ativo. |
BOTs são sempre identificados (etiqueta BOT no nome, no placar e no feed).
| Tela | O que tem |
|---|---|
| Abertura | Caveira pixel que ri com risada "quebrada" (glitch). Toque pra começar (o toque libera o som). |
| Login / Criar conta | Modo local (conta no aparelho, senha com hash PBKDF2) ou online (conta no servidor). |
| Menu | Seu personagem grande e animado (faz gestos sozinho; toque nele), JOGAR, seletor de modo e mapa, prêmio diário, Drop da Caveira, baús guardados, eventos, Estrada da Morte, perfil, moedas. |
| Personagens | Os 527 com filtro por raridade/função, busca, "só os meus", ordenação. |
| Detalhes | Todas as animações (parado, correndo, ataque, habilidade, dano, arrancada, vitória, derrota, costas), história de vida, habilidades com números, atributos, subir de nível, selecionar, testar no Treino. |
| Pets | Os 524 pets animados, bônus e escolher qual te acompanha. |
| Loja | Baús (com botão CHANCES), baús guardados, ofertas do dia (renovam à meia-noite), troca de moedas por Isvoid. |
| Abertura de baú | O baú cai, você toca pra sacudir (a cor do brilho entrega a raridade), ele explode em luz e as cartas viram uma a uma. Vicen₹ tem efeito especial. |
| Skull Pass | 50 níveis, trilha grátis + premium (liberada com Isvoid ganho jogando). |
| Missões e Eventos | Eventos ativos, missões diárias (3), semanais (3) e de evento. |
| Estrada da Morte | Prêmios por troféus totais + 9 ligas (Osso → Vazio). |
| Social | Amigos por TAG, chat geral e privado, salas (online). |
| Estúdio | Ver qualquer personagem, visual aleatório + copiar código, exportar a folha de sprite (PNG), modelo vazio e testar seu próprio PNG. |
| Configurações | Som, gráficos, controles, conta/backup, código de prêmio, servidor online e Painel do Criador. |
| Resultado | Vitória/derrota, suas estatísticas, prêmios contando, missões que andaram, Drop ganho, placar completo. |
SKULL-ARENA/
├─ index.html página única do jogo
├─ public/
│ ├─ audio/ 129 sons .mp3 (gerados por `npm run audio`) + CREDITS.txt
│ ├─ icons/ ícones do app (gerados por `npm run icons`)
│ ├─ sprites/ (opcional) seus desenhos PNG de personagem/pet
│ └─ manifest.webmanifest instalação PWA (paisagem, tela cheia)
├─ src/
│ ├─ main.ts entrada: abertura → login → menu
│ ├─ content/ ★ TUDO QUE É CONTEÚDO (edite aqui) ★
│ │ ├─ characters/ personagens feitos à mão (handmade/) + registro (index.ts)
│ │ ├─ generator/ gerador dos personagens procedurais (nomes, histórias, kits)
│ │ ├─ pets/ pets feitos à mão + gerador
│ │ ├─ maps/ mapas desenhados em texto
│ │ ├─ abilities.ts as "peças de LEGO" das habilidades (ataques, skills, supers)
│ │ ├─ rarities.ts raridades (cor, poder, preço, conversão de repetido)
│ │ ├─ modes.ts modos de jogo (tempo, pontos, renascimento)
│ │ ├─ chests.ts baús e chances, Drop da Caveira
│ │ ├─ events.ts eventos (datas, multiplicadores, modos especiais)
│ │ ├─ codes.ts códigos de prêmio + PIN do Painel do Criador
│ │ ├─ pass.ts Skull Pass
│ │ ├─ missions.ts missões diárias e semanais
│ │ ├─ progression.ts Estrada da Morte, ligas, prêmio diário
│ │ ├─ economy.ts TODOS os números da economia
│ │ └─ types.ts o "contrato" de tudo (com comentários)
│ ├─ sim/ simulação da partida (sem tela: roda no navegador, teste e servidor)
│ │ ├─ world.ts o mundo: movimento, dano, status, modos, pontuação
│ │ ├─ abilities.ts executa os efeitos das habilidades
│ │ ├─ projectiles.ts tiros (arco, teleguiado, ricochete, bumerangue, corrente…)
│ │ ├─ map.ts grade, colisão, destruição
│ │ ├─ nav.ts pathfinding (A*) dos BOTs
│ │ └─ bots.ts cérebro dos BOTs (mesma entrada que um humano)
│ ├─ pixel/ pixel art 16-bit: personagens, pets, animação, sprites
│ ├─ art/ esqueleto (rig) e clipes de animação usados pela pixel art
│ ├─ render/ desenho da partida (mapa, tiros, partículas, efeitos, câmera)
│ ├─ game/ sessão de partida, HUD, elenco (BOTs)
│ ├─ input/controls.ts controles touch + teclado/mouse
│ ├─ audio/ motor de áudio + catálogo de sons
│ ├─ meta/ perfil, economia (regras puras), ações, armazenamento
│ ├─ net/ cliente online, snapshots, partida online
│ ├─ ui/ telas e componentes de interface
│ └─ styles/main.css visual da interface (cores e fontes no topo)
├─ server/ servidor online (Node + WebSocket)
├─ tools/ comandos de terminal (criar conteúdo, validar, áudio, ícones, e2e)
├─ tests/ testes automáticos (vitest)
├─ dev/pixel.html visualizador de pixel art pra desenvolvimento
└─ docs/PROMPT_MESTRE_SKULL_ARENA.txt pesquisa do gênero + prompt mestre
Controles ─┐ ┌─► Renderer pixel (canvas) ─► tela
BOTs ──────┼─► FighterInput ─► World.step() 60 Hz ─► eventos ─► Fx (partículas, câmera, som, HUD)
Rede ──────┘ (intenções) (simulação)
src/sim/): mesma semente + mesmas entradas = mesmo resultado
(testado). Não usa DOM, então roda igual no navegador, nos testes e no servidor.FighterInput
(andar, mirar, atirar). Os BOTs não trapaceiam: veem o mesmo que um jogador (arbustos inclusos).src/pixel/): cada personagem é desenhado por código a partir do
seu look (pele, cabelo, roupa, tênis, óculos, arma…), com rampas de cor com hue shift,
sombreamento automático, contorno de 1 px e animação por esqueleto em quadros (8–16 fps).
Quadros vão pra um cache. Quadro: 72×84 px, pés em (36, 76). Pet: 32×32.src/render/worldRenderer.ts): o mundo é desenhado
num buffer pequeno (1 pixel de arte = 2 px do mundo) e ampliado com escala inteira, sem borrar.
Nomes e números de dano vão por cima em resolução cheia com fonte pixel.src/meta/economy.ts) + lista de ações (src/meta/actions.ts):
no modo local rodam no aparelho; no modo online o servidor roda exatamente as mesmas funções
(ninguém edita moeda no cliente).src/net/snapshot.ts, src/net/match.ts).npm run novo:personagem -- "Zé Neon" epico atacante
# nome raridade função
comum incomum raro extremo epico god creatorsatacante tanque suporte assassino atirador controle lancadorIsso cria src/content/characters/handmade/ze_neon.ts completo (história, atributos, ataque,
habilidade, super, passiva e um visual 16-bit aleatório) e registra no jogo. Depois:
bio), mude o título, a frase e os atributos.src/content/abilities.ts (veja 7.2).npm run validar.Exemplo completo e comentado: src/content/characters/handmade/kaze.ts.
Em src/content/abilities.ts:
| Grupo | Peças |
|---|---|
atk.* (ataque) | burst shotgun sniper lob melee boomerang chain wave homing spray ricochet fan punch |
skill.* (botões Q/E/R) | dash blink heal shield haste rage armor grenade nova zone turret minions healTotem wall trap hook stealth clone barrage laser blades rewind cleanse reload freeze |
sup.* (SUPER) | rain bigShot quake charge healField storm army megaLaser fortress shadowStrike nuke frenzy |
st.* (status) | slow stun burn poison freeze root silence mark weaken |
attack: atk.shotgun({ name: 'Estouro', dmg: 300, range: 420, n: 5, color: '#ff3df2' }),
skills: [skill.dash({ name: 'Arrancada', dist: 300, cd: 6 }), skill.freeze({ dmg: 600, cd: 10 })],
super: sup.storm({ name: 'Tempestade', dps: 700, kind: 'electric', color: '#3df2ff', status: st.slow(2) }),
Quer algo que não existe? Monte direto com efeitos (EffectDef em src/content/types.ts):
projectile, melee, dash, blink, leap, aoe, zone, heal, shield, buff, summon,
wall, beam, trap, stealth, clone, rewind, orbit, cleanse, ammo — dá pra combinar
vários no mesmo botão (ex.: pular + explosão ao cair).
src/content/rarities.ts → power) e o nível dá +5% por nível.Opção A — gerador (sem desenhar nada): no look você escolhe espécie, corpo, cabelo, olhos,
boca, roupa (hoodie, varsity, puffer…), calça (baggy, cargo…), tênis (chunky, hightop…),
acessórios (óculos, fone, corrente, mochila, boné, asas…), arma e aura. Todas as opções estão
listadas em src/content/types.ts (Look). Dica: ESTÚDIO → 🎲 VISUAL ALEATÓRIO → COPIAR CÓDIGO
e cole no arquivo.
Opção B — seu próprio desenho (Piskel/Aseprite/LibreSprite):
ESTÚDIO → EXPORTAR FOLHA DESTE (ou MODELO VAZIO) pra pegar o PNG no formato certo.
Formato da folha: quadros 72×84 px, pés no ponto (36, 76), uma animação por linha:
| linha | animação | quadros |
|---|---|---|
| 0 | parado | 8 |
| 1 | correndo | 8 |
| 2 | ataque | 6 |
| 3 | habilidade | 6 |
| 4 | dano | 3 |
| 5 | vitória | 8 |
| 6 | derrota | 4 |
| 7 | arrancada | 2 |
Teste no próprio jogo: ESTÚDIO → TESTAR MEU PNG.
Salve em public/sprites/ze_neon.png e no personagem coloque sheet: 'sprites/ze_neon.png'.
Tamanho de quadro diferente? Use sheet: { src, frameW, frameH, originX, originY, frames: { idle: 4 } }.
Desenhe olhando pra direita (o jogo espelha sozinho).
Pets com desenho próprio: PNG 128×32 (4 quadros de 32×32 lado a lado) + sheet: 'sprites/x.png'.
npm run novo:pet -- "Bafo" epico dragon damage=0.05 spark=260
Corpos: bat crow cat ghost slime drone skull dragon jelly frog snake eye flame robot bunny fox spider fish owl crystal.
Bônus: speed damage hp regen reload superCharge coinBonus revealRadius lowHpShield spark · cores: cor1= cor2= cor3=.
Fica em src/content/pets/index.ts (lista HANDMADE_PETS).
src/content/characters/index.ts → GENERATED_COUNT (hoje 506).src/content/pets/index.ts → GENERATED_PETS (hoje 512).O gerador é determinístico: o nº 37 é sempre o mesmo; aumentar o número só adiciona novos no fim.
Em src/content/maps/index.ts, mapas são desenhados em texto (cada caractere = bloco 64×64):
. chão # parede B tijolo (quebra) = vidro (quebra fácil)
W água " arbusto ~ lava/ácido ^ pad de salto
x caixa o barril (explode) t pneu + altar de cura * power-up
A nascimento time A Z time B S nascimento livre (FFA)
Desenhe só metade e use symmetry: 'mirror_x' | 'mirror_y' | 'point' (ou 'none').
Escolha o tema (theme) e em quais modos ele aparece (modes). Rode npm run validar.
npm run novo:evento -- "Carnaval Caveira" 2027-02-05 2027-02-17 moedas=2 emoji=🎭 presente_moedas=300
Opções: modo= (meteoro, so_super, chefao…), moedas= xp= trofeus= passe= (multiplicadores),
bau=, destaque= (personagem com chance x2), presente_moedas= presente_isvoid=, semanal=0,6
(repete toda semana nesses dias), emoji= cor= cor2=. Fica em src/content/events.ts.
Testar antes da data: Configurações → Painel do Criador → "viajar no tempo".
Três jeitos:
npm run novo:codigo -- VICEN100 moedas=500 isvoid=20 titulo="Fã do Vicen" usos=1 ate=2026-12-31
npm run novo:codigo -- --apagar VICEN100
npm run novo:codigo -- --listar
src/content/codes.ts.⚠️ Troque o PIN (
ADMIN_PINemsrc/content/codes.ts). No modo local o PIN fica no código do jogo (serve pra impedir que alguém no seu aparelho mexa sem querer, não é segurança de verdade). No servidor use a variável de ambienteADMIN_PIN.
src/content/missions.ts — diárias/semanais (o jogo sorteia 3 de cada, igual pra todo mundo no mesmo dia).src/content/pass.ts — níveis, XP por nível, prêmios grátis/premium (OVERRIDES pra níveis especiais).src/content/progression.ts — Estrada da Morte, ligas e os 7 dias do prêmio diário.Cores e fontes no topo de src/styles/main.css (--yellow, --pink, --cyan…). Fontes:
Pixelify Sans (textos) e Press Start 2P (títulos/números), embutidas (funcionam offline).
Todos os números ficam em src/content/economy.ts:
| Valor padrão | |
|---|---|
| Começo | 500 Moedas da Morte, 20 Isvoid, 3 personagens (Kaze, Marreta, DJ Kiko) e o pet Chiclete |
| Partida | vitória 40 · derrota 18 · empate 25 · +2 por eliminação · +1 por caveira · teto 120 (antes de evento/pet) |
| Troféus | +10/+0 até 100, depois sobe menos e desce mais; FFA por colocação |
| Nível do personagem | 1 → 10, custo em moedas (40 … 1.400), +5% vida e dano por nível |
| Drop da Caveira | 1 por vitória (top 3 no FFA), até 5 por dia; a raridade "sobe" na animação |
| Skull Pass Premium | 250 Isvoid (ganho jogando) |
Baús (src/content/chests.ts) — cada carta sorteia, em ordem: personagem por raridade → pet por
raridade → senão moedas. Personagens que você ainda não tem pesam 4x mais. Repetido vira moedas
(e Isvoid nas raridades altas).
| Baú | Preço | Cartas | Destaque |
|---|---|---|---|
| Baú de Osso | 150 moedas | 2 | dia a dia |
| Baú da Caveira | 600 moedas | 4 | garantia de Épico em 25 |
| Mega Baú Neon | 1.800 moedas | 8 | garantia de GOD em 30 |
| Drop do Vazio | 120 Isvoid | 5 | Vicen₹ 1% por abertura, garantido em 100 |
| Abóbora Maldita | 900 moedas | 5 | só no evento Noite das Caveiras |
O botão CHANCES de cada baú mostra a tabela completa (porcentagem por carta).
public/audio/ — gravações reais CC0 (tiros, ricochetes, madeira/vidro
quebrando, voz de dor, locutor "3, 2, 1, FIGHT", moedas, baús…), músicas CC0 (trilha hip-hop no menu).src/audio/catalog.ts: cada som tem volume, variação de tom, canal
(efeitos/interface/voz/música), limite de vozes simultâneas e intervalo mínimo.src/audio/audio.ts): Web Audio com compressor, som posicional (volume e lado pela
distância até a câmera), música abaixa quando o locutor fala, troca de música com fade.Trocar um som: coloque seu .mp3 em public/audio/ e mude o nome no catálogo.
Regerar tudo a partir das fontes:
git clone --depth 1 https://github.com/lavenderdotpet/CC0-Public-Domain-Sounds fontes/L
git clone --depth 1 https://github.com/jupixels/game-sounds fontes/J
git clone --depth 1 https://github.com/Shunding-L/tauhuke-assets fontes/S
AUDIO_SRC=fontes npm run audio # precisa do ffmpeg
O mapa "som do jogo → arquivo de origem" está em tools/build-audio.mjs (e em public/audio/CREDITS.txt).
Sem servidor o jogo é 100% local (conta e progresso no aparelho, partidas contra BOTs) — e as telas dizem isso claramente. Com servidor você ganha:
scrypt), progresso salvo lá (dá pra jogar em outro aparelho)npm run build # gera o jogo em dist/
ADMIN_PIN=um-pin-forte npm run server
# → http://localhost:8787 (o servidor também serve o jogo; abrindo por ele, o modo online liga sozinho)
Ou aponte um jogo publicado em outro lugar pro servidor: Configurações → Servidor online.
| Variável | Padrão | |
|---|---|---|
PORT | 8787 | porta |
ADMIN_PIN | (o do arquivo) | troque! |
DATA | server-data | pasta do banco (db.json) — faça backup dela |
Produção: npm run server:build gera dist-server/index.mjs (Node 20+, precisa do pacote ws).
Rode atrás de HTTPS (Caddy/Nginx ou plataformas como Render/Fly/Railway) — celulares exigem HTTPS
pra PWA, e o WebSocket vira wss:// automaticamente.
npm test # 24 testes: simulação (determinismo, todos os mapas), economia (chances do Vicen₹,
# garantia, códigos, diário, missões, passe, loja), conteúdo (500+), pixel art, rede
npm run validar # confere conteúdo + roda uma partida curta em cada mapa
npm run e2e # navegador de verdade: todas as telas + uma partida (prints em e2e-shots/)
npm run build # inclui checagem de tipos (TypeScript estrito)
| Problema | Solução |
|---|---|
| Sem som | Toque na tela uma vez (navegadores só liberam áudio depois de um toque). Veja Configurações → Som. |
| Travando no celular | Configurações → Gráficos → Qualidade Baixa (ou deixe "Automática"). |
| Não instala como app | Precisa de HTTPS (ou localhost). No iPhone use o Safari. |
| Atualização não aparece | Feche e abra o app de novo (a versão nova entra na próxima abertura). |
| Esqueci a senha (modo local) | A senha não é guardada (só o hash). Use Exportar backup com antecedência. |
npm run validar acusou erro | A mensagem diz o arquivo/id. Arrume e rode de novo. |
| Meu PNG não aparece | Confira o caminho (public/sprites/...) e o formato (seção 7.3); teste no Estúdio. |
Sendo direto sobre o que não é perfeito:
server/db.ts está isolado pra isso).public/audio/CREDITS.txt
(Kenney, Warfork/Team Forbidden, OpenGameArt: Tabasco, vitalezzz, Sudocolon, packs "CC0 SFX";
Freesound: qubodup, nooly; Ben Burnes/Abstraction Music).@fontsource).docs/PROMPT_MESTRE_SKULL_ARENA.txt.