Os melhores roguelikes não apenas matam você. Eles fazem você querer morrer.

Isso soa estranho, mas qualquer pessoa que já perdeu uma partida à meia-noite e começou outra às 00:03 conhece a sensação. A morte dói. Sua vida cai para zero. A tela é inundada pelo fracasso. No entanto, seu dedo já está pairando sobre o botão de jogar. Algo nos últimos vinte minutos importou o suficiente para que você não possa deixar o jogo onde ele terminou.

Este é o loop de "só mais uma partida", e não é acidental. É projetado. Se você está construindo um roguelike ou qualquer jogo com morte permanente (permadeath), seu trabalho inteiro é equilibrar duas forças opostas. O jogador deve perder o suficiente para sentir tensão. Ele deve manter o suficiente para sentir esperança.

A Moeda do Fracasso

No meu projeto mais recente, Neon Survivor, eu queria exatamente essa tensão. Quando o jogador morre, tudo o que foi coletado durante a partida desaparece, exceto uma coisa: ouro. Esse ouro é guardado automaticamente. De volta ao menu, ele o gasta em melhorias permanentes. Então, ele mergulha novamente, um pouco mais forte do que antes.

Este loop simples sustenta o jogo inteiro. Sem ele, a morte é um ponto final. O jogador vai embora porque a última partida não lhe rendeu nada. Com ele, a morte é uma vírgula. A partida tornou-se uma viagem de coleta (farming). A perda dói, mas também pagou pelo amanhã.

O truque é simples. Você mantém algo mesmo quando perde todo o resto. A dificuldade é garantir que a coisa que você mantém importe sem destruir o desafio. Se as melhorias forem muito fracas, o jogador para de se importar. Se forem muito fortes, o jogo joga sozinho. O loop colapsa de qualquer maneira.

Dois Relógios, Zero Confusão

Para construir isso adequadamente, tive que gerenciar duas linhas do tempo separadas.

O Relógio da Partida (Run Clock) reinicia toda vez que você aperta play. Ele rastreia a vida, a pontuação atual, a contagem de ondas de inimigos e quaisquer power-ups temporários coletados durante a sessão. Quando o personagem morre, este relógio volta para zero.

O Relógio Meta (Meta Clock) nunca reinicia. Ele guarda o ouro total ganho em cada tentativa, a onda mais alta já alcançada e cada melhoria permanente comprada. Este relógio continua correndo, não importa quantas vezes o navegador seja atualizado.

Misture esses dois e você terá bugs difíceis de rastrear e dolorosos de corrigir. Já vi desenvolvedores apagarem acidentalmente o progresso do jogador durante um reset de cena de rotina porque uma função de limpeza tocou no armazenamento de dados errado. Os dados do Relógio Meta evaporam. O jogador retorna a zero de ouro e zero de melhorias. Nesse ponto, a relação entre você e seu jogador está quebrada. Eles não estão começando uma nova partida; eles estão começando um novo rancor.

Manter os relógios separados não é apenas uma escolha de estilo. É uma estratégia de sobrevivência.

Como o Phaser v4 lida com essa divisão

Eu construí Neon Survivor no Phaser v4, que oferece duas ferramentas específicas para esse problema.

O Registry mantém dados ao vivo na memória para a sessão atual. É rápido. É simples. Ele também evapora no momento em que o jogador atualiza a página.

O LocalStorage salva dados no próprio navegador. Ele sobrevive ao fechamento de abas, reinicializações do navegador e quedas de energia. Também é mais lento e menos confiável. Os navegadores podem bloqueá-lo, limitá-lo ou apagá-lo se as cotas de armazenamento estiverem cheias.

Minha escolha de design foi rigorosa. O Registry é a única fonte da verdade durante a jogabilidade. O jogo lê dele, escreve nele e confia nele completamente. O LocalStorage não atua como um coautor. Ele atua como um espelho.

Aqui está como o fluxo funciona. O jogo escreve uma compra de melhoria no Registry. Uma única classe gerenciadora observa o Registry. Quando apropriado, esse gerenciador espelha os dados do Registry no LocalStorage. Se o navegador bloquear a escrita, o jogo não trava. Se o armazenamento falhar, a sessão atual ainda roda perfeitamente. O jogador pode perder o progresso apenas se fechar a aba exatamente no mesmo segundo, mas a sessão em si nunca trava.

Este padrão evita um desastre sutil. Se você permitir que cada sistema escreva diretamente no LocalStorage, você criará dependências de uma API frágil. Um jogador com configurações de privacidade altas ou um dispositivo com pouco armazenamento pode ver o jogo desacelerar ou travar durante o combate porque alguma função de segundo plano tentou salvar estatísticas. Ao tornar o Registry a única fonte da verdade, você mantém a ação rápida e o risco contido.

Deixe o Código Respirar

Eu também usei eventos para desacoplar os sistemas. Quando uma partida termina, o GameScene não cuida do seu próprio funeral. Ele não chama uma função de salvamento. Ele não importa um utilitário de armazenamento. Ele simplesmente emite um evento "run-ended" com um payload dos dados relevantes.

Um listener separado cuida da gestão de dados. Ele recebe o evento, atualiza o Meta Clock e diz ao gerenciador para espelhar os novos totais no LocalStorage.

Essa separação traz resultados imediatos. Posso reescrever toda a GameScene, trocar o personagem do jogador, mudar o ângulo da câmera ou até mudar o gênero de survival para bullet hell sem tocar no sistema de salvamento. Os sistemas são independentes. Eles se comunicam por meio de eventos, não por chamadas diretas de função. Isso significa menos conflitos de merge, menos bugs e uma base de código que não se transforma em um código espaguete após seis meses.

Upgrades que Mudam o Jogo

Ter uma estrutura técnica sólida é inútil se as recompensas parecerem uma planilha. Passei muito tempo pensando em como os upgrades realmente parecem na hora de jogar.

Alguns upgrades são seguros. Velocidade de movimento extra. Bônus de vida. Recarga mais rápida. Eles dão ao jogador mais margem para erro. São reconfortantes. Eles diminuem a dificuldade do jogo sem mudar suas regras.

Outros upgrades reescrevem as regras inteiramente. Em Neon Survivor, adicionei "Piercing Rounds". Antes desse upgrade, uma bala parava no primeiro inimigo que atingia. Depois do upgrade, ela atravessa os inimigos, potencialmente limpando linhas inteiras com um único tiro.

A diferença é dramática. Velocidade e vida podem permitir que você sobreviva por mais tempo, mas o Piercing Rounds muda a forma como você se posiciona. Você começa a alinhar os inimigos. Você para de kitar pelas bordas e começa a cortar pelo centro. O espaço de decisão do jogo se expande.

Uma boa progressão deve mudar as decisões do jogador, não apenas aumentar seus números. Se cada upgrade for apenas um aumento percentual, o jogador para de ler as descrições. Eles clicam, melhoram e esquecem. Se um upgrade os faz repensar sua estratégia, eles se lembram dele. Eles falam sobre isso. Eles voltam para ver o que mais pode virar o jogo de cabeça para baixo.

A Real Recompensa

O loop de "só mais uma partida" não é um sistema único. É uma relação entre perda e ganho, construída sobre uma arquitetura limpa e recompensas significativas.

Construa duas linhas do tempo distintas e proteja o Meta Clock como se ele detivesse a confiança dos seus jogadores, porque ele detém. Use as ferramentas da sua engine para manter os dados em tempo real rápidos e os dados persistentes seguros. Desacople suas cenas do seu armazenamento para que você possa iterar sem medo. E quando projetar upgrades, pergunte-se se eles dão ao jogador mais tempo ou escolhas mais interessantes.

Acerte nisso, e seus jogadores não apenas tolerarão a morte. Eles dependerão dela. Cada partida se torna um investimento na próxima. O jogo deixa de ser uma série de reinícios e se torna uma única e contínua ascensão.