Como funciona uma partida
- Três lanes, cada uma com linha de frente e reserva, então onde a criatura entra faz parte da decisão.
- Palavras-chave (Escudo, Provocar, Ímpeto, Letal, Veneno) e habilidades ativadas que custam SP.
- 151 cartas em 10 facções, da Ordem do Véu à Legião do Abismo, mais cartas neutras que qualquer deck usa. Cada facção joga de um jeito: agressão, controle, cura, veneno, invocação.
- Montagem de deck com 30 cartas, com um perfil que mostra o "DNA" do deck: agressão, defesa, controle e recursos.
- Offline contra a IA a qualquer momento, sem conexão, ou PvP online com rating que sobe a cada vitória.
- Progressão sem pagar: moedas ganhas jogando, missões diárias e semanais, pacotes para abrir. As compras são opcionais e só encurtam o caminho.
O que eu construí
- As regras do jogo como pacote independente, em TypeScript puro com vitest, sem interface e sem rede dentro dele.
- O conjunto de cartas e o conteúdo: 151 cartas, os decks e o i18n do conteúdo, em pacote próprio.
- O app em Expo e React Native, com as telas, os componentes e o store do jogo.
- A camada online como Edge Functions do Supabase (achar partida, jogar ação, timeout) que rodam o mesmo engine no servidor.
- A economia no cliente: partidas contra a IA creditam um valor diário com teto, partidas online pagam o dobro e são as únicas que contam missão.
- Compras no app pelo Google Play Billing, com o recibo validado no servidor.
- O pipeline de pixel art: cartas, tokens e o pacote, gerados e cortados por scripts no repositório.
Decisões técnicas e trade-offs
- Um conjunto de regras, rodando no app e no servidor. As Edge Functions importam o engine empacotado para elas, em vez de manter uma segunda implementação no servidor. Trade-off: um passo de build a mais, porque o artefato do servidor é gerado e não importado do fonte, e uma disciplina: mudança de regra precisa chegar aos dois lados, senão a partida online joga um jogo diferente da offline.
- Três canais de entrega, escolhidos por mudança. Interface e JS saem como update over-the-air, servidor como deploy de function, e qualquer coisa nativa precisa de build novo e upload na loja. Trade-off: mais caminhos para lembrar, em troca de corrigir uma carta quebrada sem esperar a revisão da loja.
- Offline-first, com o online como caminho recompensado. A partida contra a IA funciona sem conexão; o online paga o dobro e é o único que conta missão, com a recompensa validada no servidor. Trade-off: a economia precisa de regra de servidor e de teto diário; em troca, não dá para farmar recompensa editando o cliente.
- Google Play Billing para itens digitais, e nada mais. O jogo é freemium e não pay-to-win: nenhuma compra é necessária para montar um deck competitivo. Trade-off: a loja fica com a parte dela e dita a integração; a alternativa é contra as regras da plataforma.
- Uma regra de balanceamento em vez de ajuste carta a carta: stat alto tem que custar caro, e toda mecânica que sobe stat ou SP precisa de teto. Trade-off: o design das cartas fica mais restrito, em troca de um set em que uma carta não decide a partida.
Onde está
Publicado no Google Play: 10 facções, 151 cartas com arte finalizada, partidas online, desafios diários e semanais, e as compras no app construídas com a validação de recibo publicada. O repositório continua privado.