Desenvolvimento · o que mudou

Changelog

Registro aberto de tudo que muda no jogo — bugfix, ajuste de balance, nova feature, rewrite de cutscene. Sem asterisco, sem marketing.

Política: todo playtest gera resposta escrita. O feedback que cada release tenta endereçar fica citado no topo da entrada.

  1. v0.13.0

    Rework do Estatutário — Autos do Processo & Sentença Transitada em Julgado

    Motivação

    Feedback de playtest interno: "as skills do Estatutário são chatas, ele fica muuuuito tank, tem que reformular. Uma unidade puramente só tank não faz sentido". O kit antigo era 100% mitigação (Cláusula Blindada self, Liminar de Proteção em aliado, Ordem de Execução situacional) — nenhuma skill causava dano como efeito principal. Resultado: o jogador queria desativá-lo porque ele nunca ameaçava. A nova mecânica resolve transformando a postura defensiva em MUNIÇÃO pro burst — único aliado do roster com recurso próprio.

    Nova mecânica: Autos do Processo (stacks)

    • Novo StatusEffectKind 'autos'. Único kind do roster com stacking ADITIVO: cada aplicação incrementa amount (cap em AUTOS_MAX_STACKS = 4) e refresca a duração para 3 turnos. Contribui AUTOS_DEF_PER_STACK = 3 de DEF por stack em computeStatModifier. Constantes em src/systems/statusEffects.ts; regra especial em applyStatusEffect. Cor #9fd3ff (azul-papel carimbado).
    • Novo AbilityEffect 'consume_autos_attack'. Em src/types/unit.ts. Resolver em src/systems/abilities.ts: lê stacks do caster, remove o efeito inteiro via novo método Unit.removeStatusEffectByKind, calcula dano = atk + (stacks × bonusPerStack), ignora DEF, 100% acerto. Preview mostra dano atual + teto + número de carimbos consumidos.

    Kit novo do Estatutário

    • AB_AUTOS_DO_PROCESSO substitui AB_CLAUSULA_BLINDADA. Self, BP 2 (era 3). Carimba +1 de autos em si — engrossa o processo a cada cast. Stackável com cap de 4 (+12 DEF no teto). Custo baixo porque o stacking é gradual: cobrar mais faria ele nunca juntar antes do inimigo explodir ele.
    • AB_SENTENCA_TRANSITADA substitui AB_ORDEM_EXECUCAO. single_enemy adjacente, BP 4. Consome todos os Autos e bate com ATK + 4 × stacks, ignora DEF, 100% acerto. Sentença cheia (4 stacks): 11 + 16 = 27 dano fixo — paridade de teto com Empréstimo Hostil (Devedor 13 × 2 = 26 menos DEF), MAS exige 4 turnos de setup contra 1 cast do Empréstimo. Trade-off correto: recompensa paciência, penaliza tempo.
    • AB_LIMINAR_PROTECAO mantida intacta. Era a única skill já boa do kit antigo (50% redução de dano em aliado por 2 turnos). Continua sendo o único buffer de damage reduction do roster — identidade de "advogado do time" preservada.

    Passiva nova: Processo Contencioso

    • Passiva antiga "Jurisdição Imposta" substituída por "Processo Contencioso". A antiga (intimado adjacente -1 MOV no fim do turno + 30% stun reativo a golpe adjacente) reforçava exatamente a fantasia que era o problema: tanque imóvel que só atrapalha. A nova ouve combat:damageDealt: sempre que o Estatutário leva dano de inimigo (qualquer alcance, didHit + amount > 0), carimba +1 nos Autos. Apanhar deixa de ser passividade — vira setup do burst.

    Stats e balanceamento

    • DEF base 13 → 11. Os Autos compensam o muro: DEF 13 + 12 de stacks (4 no teto) = 25 efetiva, intransponível pelo bestiário do MVP (nenhum inimigo passaria de 1 de dano). DEF 11 + 12 = 23 no pico, mas só atingível depois de 4 turnos de setup. Baseline mais vulnerável incentiva o jogador a USAR a mecânica, em vez de só plantar o tanque e esquecer.
    • Descrição da classe reescrita. "Acumula Autos do Processo enquanto apanha. Quando a sentença cai, a pilha inteira vira dano." Substitui a antiga "Absorve dano por prerrogativa legal. Protege si e aliados com precedentes jurídicos" — a nova frame deixa óbvia a janela ativa de jogo.

    Infra e i18n

    • Novo método Unit.removeStatusEffectByKind(kind). Em src/entities/Unit.ts. Splice + redraw do glow; retorna a instância removida ou null. Usado pelo resolver da Sentença pra consumir os stacks. Sem análogo passivo (status somem sozinhos via tickStatusEffects).
    • IA — consume_autos_attack adicionado ao switch exaustivo. Em src/systems/ai.ts. Case fall-through (skill exclusiva de aliado, nenhum inimigo do MVP usa). Comentário explicita que se uma classe inimiga futura ganhar a mecânica, a heurística precisa sofisticar.
    • i18n sincronizado. Labels do status autos ("Autos do Processo — DEF acumulada" / "Case File — stacked DEF") em pt-BR e en. Chaves estatutario-autos e estatutario-sentenca adicionadas em src/i18n/locales/en/data.ts; chave antiga estatutario-blindada removida. Descrição da classe Estatutário em EN reescrita pra refletir o novo papel.
  2. v0.12.0

    Paradoxo Loop Fechado — você sempre foi EP-047

    Motivação

    Refino narrativo sobre o pivot linear da v0.11.0. A história deixa de ter EP-046/EP-048 — é tudo EP-047. O jogador começa como a equipe "nova" no Térreo lutando contra a EP-047 drenada, vence O Algoritmo de Demissão no Sub-5, e entra no Sub-∞ (agora combate real, mesmo mapa do Térreo) com os próprios clones iniciais como inimigos frescos. A derrota inevitável ali é a condição de vitória narrativa. Esta release não responde feedback de playtester — é refinamento de rumo interno sobre a v0.11.0.

    Novo chefe canônico: O Algoritmo de Demissão

    • AVA_MASCOTE sai, O_ALGORITMO entra no Sub-5. Nova UnitClass em src/data/unitClasses.ts com HP 180 / DEF 10 / ATK 14. Habilidade exclusiva AB_ABSORVER_RECURSOS em src/data/abilities.ts usa o novo efeito absorb_resources: 10 de dano ignorando DEF, dreno de 4 SP + 3 BP atuais do alvo, autocura de 50% do dano no caster. A AI em src/systems/ai.ts prioriza o alvo com menor SP+BP combinado.
    • Novo evento bp_drain. AbilityEvent ganhou o kind pra diferenciar visualmente dreno de BP de dreno de SP. BattleScene.animateAbilityEvents renderiza popup "- BP" com offset distinto.

    Ghosts migram pro Térreo

    • O Térreo agora é onde o ghost squad aparece. Ao vencer o Sub-5, o handleSub5Victory faz submit do squad drenado pelo Algoritmo (HP baixo, BP baixo). BattleScene.setupTerreoEnemiesAsync (ex-setupSub5EnemiesAsync) tenta carregar um ghost no início do Térreo — se o pool estiver vazio ou a rede cair, spawnTerreoFallbackCorrupted spawna 5 Liquidadores hardcoded com HP 10% e SP 0. Sub-5 virou só "O Algoritmo", sem ghosts.

    Sub-∞ vira combate real

    • skipCombat removido do schema. FloorDescriptor.skipCombat saiu de src/types/floor.ts. O Sub-∞ reusa literalmente MAP_TERREO e SPAWN_TILES_TERREO. spawnSubInfinitoFreshCopies gera 5 clones frescos dos liquidadores (HP/SP/BP full) como inimigos. TitleScene.startBattle e BattleScene.restartIntoFloor pulam a PreBattleScene pra não dar chance do jogador rearranjar o squad drenado.
    • Diálogo pré-batalha em modo espelho. Nova função resolveBeatsMirrored em src/data/preBattleDialogues.ts inverte side: ally ↔ enemy e troca tone: satire → creepy, chamada só quando floorId === 'sub-infinito' (em src/ui/PreBattleDialog.ts). getPreBattleDialogue aliasa Sub-∞ → Térreo no código; o i18n duplica as chaves preBattleDialogue.sub-infinito.* pra o tDataIndexed encontrar. DIALOGUE_TERREO foi reescrita pra usar apenas speakerRef das 5 classes de liquidador — simetria total com o espelhamento.
    • Derrota no Sub-∞ = vitória narrativa. BattleScene.checkEndOfBattle intercepta qualquer fim de turno com 0 unidades vivas em algum lado quando currentFloor.id === 'sub-infinito', roteando pra handleSubInfinitoCanonicalEnd — seala flags.absorbed = true, roda evaluateSaveFlagAchievements(), limpa o save (clearSave) e mostra o overlay "ABSORVIDO" sem botão de restart.

    Narrativa reescrita

    • Cutscenes Sub-5 e Sub-∞ reescritas. CUTSCENE_SUB5 apresenta O Algoritmo como processo que consome os próprios operadores; CUTSCENE_SUB_INFINITO entrega a revelação do loop ANTES do primeiro turno (livro de visitas com 47 EP-047, "nunca existiu EP-046 ou EP-048"). i18n pt-BR + en sincronizados. battle.absorbed.body/archived reescritos pra reforçar "Próxima designação: EP-047".

    Limpeza de código

    • handleNoCombatAbsorption removido. As branches skipCombat em BattleScene.create/finishCreate/restartIntoFloor e TitleScene.startBattle saíram junto. O campo FloorDescriptor.skipCombat foi removido do schema — o único andar que usava (Sub-∞) virou combate real. Comentários em ghostSquads.ts e music.ts atualizados pra refletir que ghosts disputam o pool do Térreo, não mais do Sub-5.
  3. v0.11.0

    EP-047 Linear Pivot — uma descida, uma história, sem NG+

    Motivação

    Decisão executiva pós-v0.10.0: o jogo abandona o formato roguelite/NG+ com rotas A/B/C e vira uma Experiência Narrativa Linear de Única Run. A promessa "jogue de novo com mais Tier" estava diluindo a história — cada incremento narrativo competia com a promessa de replay. Optamos por menor ambição e maior foco: 7 andares fixos (Térreo → Sub-1 → Sub-2 → Sub-3 → Sub-4 → Sub-5 → Sub-∞), dificuldade curada à mão, distorção atrelada ao andar, e um único arco fechado em ~7 horas. Esta release não responde feedback de playtester — é o pivot em si.

    Andares lineares (7, amalgamados)

    • Sub-4-A/B/C e Sub-5-A/B/C removidosFLOORS em src/data/floors.ts agora é uma sequência única: Térreo → Sub-1 → Sub-2 → Sub-3 (Jurídico/RH amalgamado) → Sub-4 (Cofre · Realidade Rachada) → Sub-5 (Contenção / AVA) → Sub-∞ (Paradoxo · skipCombat). Os ângulos narrativos das rotas antigas foram consolidados no Sub-3 e Sub-4. Cutscenes e diálogos reescritos em src/data/cutscenes.ts e src/data/preBattleDialogues.ts.
    • RouteSelectOverlay deletado — o "mapa de elevadores" ao final do Sub-3 sumiu. BattleScene.advanceToNextFloor() caiu pra 3 linhas — segue sempre currentFloor.nextFloorId.

    NG+ / RunTier removidos

    • runScaling.ts deletado — não existe mais RunTier 0-5, não existe TIER_DEFS, não existe "Tier banner" na Sala de Triagem. Dificuldade agora é curada artesanalmente por andar, calibrada pra caber exatamente na duração de uma única descida.
    • SaveState v3 com migrador v1/v2→v3persistence.ts e cloudSave.ts subiram pra chave oespolio.save.v3. O migrador colapsa IDs antigos (sub-4-asub-4, etc.), dropa campaignClears, flags.route_a/b/c, flags.route_z, flags.campaignCompleted. Saves antigos abrem sem perder inventário, mas Tier e rota escolhida não voltam (não existem mais). A chave meta legada oespolio.meta.v1 é deletada no primeiro load.

    Distorção por floorIndex

    • distortion.ts reescrito — fórmula agora é puramente função de floorIndex, sem runTier e sem OFFICE_MODE_CAP. Curva canônica: Térreo/Sub-1 = Profissional (0), Sub-2/Sub-3 = Pressão (1), Sub-4 = Desvio (2), Sub-5/Sub-∞ = Creepy (3).
    • distortionOverride em FloorDescriptor — Sub-4 (2), Sub-5 (3) e Sub-∞ (3) travam o nível contra futuros ajustes de curva. O Sub-5 chega em Creepy Total na primeira (e única) chegada.

    Ghost squads: mesma infra, sem rota

    • Filtro de rota removido — o query do Sub-5 em fetchRandomGhostSquad não filtra mais por routeId. Todo ghost ativo compete pelo mesmo pool. GhostSquadInput.routeId virou opcional (default 'linear'). weightByRouteZ e ROUTE_Z_PRIORITY_WEIGHT removidos. Saves antigos com routeId A/B/C/Z continuam legíveis no pool.

    Economia de single run

    • createStarterInventory() inflado — passou de 2+2 pra 5 armas + 5 acessórios. O esquadrão inteiro da EP-047 já começa equipado: não existe mais "comece com o Auditor pelado". Ver src/systems/inventory.ts.
    • guaranteedReward por andarFloorDescriptor ganhou guaranteedReward?: { xp, itemIds }. Térreo → Sub-5 têm XP fixo e pelo menos 1 item garantido. O QuarterlyReportOverlay exibe numa seção dedicada ("Distribuição Obrigatória"), separada do loot RNG e do bônus da meta.

    UI: Aviso de Descida + Abandonar Descida

    • "Aviso de Descida" na Sala de Triagem — o banner de tier desapareceu; no lugar aparece um card "Aviso de Descida" com copy por andar (em FloorDescriptor.descentNotice) reforçando a natureza irreversível da ordem de liquidação. Fallback i18n em preBattle.descentNoticeBody.
    • "Abandonar Run" → "Abandonar Descida" — o botão e todo o copy de confirmação (título e mensagem) reforçam que abandonar agora é voltar ao Térreo, sem preservar Tier nem clears. A descida é uma, tem começo e fim — e o botão reflete isso.
  4. v0.10.0

    "Só mais um andar" — passivas, hazards, NG+, metas e distorção

    Motivação

    Os playtests #001 e #002 mostraram que o Térreo funciona como primeira impressão — mas também que o jogo quase não oferecia razão pra descer. Esta release não responde feedback novo: é a execução do plano interno "Só mais um andar" (marcos M1→M6), desenhado pra transformar seis andares numa promessa de replay. A ideia é simples: cada classe deve ter um motor próprio que vira build, o mapa deve ser adversário (não só cenário), o segundo clear deve se parecer menos com o primeiro, e descer muito deve distorcer a realidade corporativa em vez de só subir número.

    Classes com motor próprio (M1 + M2)

    • Barramento de eventos do combate — criado src/systems/combatEvents.ts com payloads tipados (damageDealt, unitMoved, turnStart/End, unitDied, abilityUsed, push_move). O BattleScene dispara; um PassiveDispatcher consome numa fila de reações. Passivas agora são plugins, não ifs espalhados.
    • Passiva por classe — um plugin por arquétipo em src/systems/passives/: Devedor, Auditor, Consultor, Estatutário e Headhunter. Cada um assina 1-2 eventos e dispara efeito próprio (ex.: Auditor marca "Inspecionado" em quem o atacou; Estatutário empurra com AB_ORDEM_EXECUCAO). Tooltip da passiva aparece na ficha da unidade.
    • Novos statusInspecionado, Intimado e Stun entraram no pipeline de statusEffects.ts e no cálculo de dano (combat.ts). São o vocabulário que as passivas usam pra conversar.

    Hazards — o mapa vira adversário (M3)

    • HazardMap com overlay no tilesrc/systems/hazards.ts centraliza estado; IsoTile.setHazardOverlay() é só visual. Cada hazard tem dono, dano, consumo (persiste, consome ao pisar, ou dura N turnos) e resolução via evento — sem ifs em BattleScene.
    • Empurrão como primeira-classe — evento push_move com computePush em abilities.ts calcula destino respeitando obstáculos, queda, hazards e colisões. Puxão e empurrão compartilham a mesma tween infra, o que abre caminho pra habilidades de deslocamento sem escrever pipeline do zero.
    • Onboarding de hazardsHazardTooltip explica o efeito no hover; HazardsTutorialCoach ativa na primeira vez que o jogador vê um hazard num andar e some depois. Novo PreBattleDialog (com SpeechBubble reutilizável) emenda cutscene em combate de forma diegética antes da primeira ação.

    NG+ híbrido: RunTier 0-5 (M4)

    • Save v2 com migraçãocampaignClears e META_STORAGE_KEY separado do save de run. Zerar a campanha agora é explícito ("Abandonar Run" não apaga meta-progressão). Migração v1→v2 automática em persistence.ts + cloudSave.ts.
    • RunTier 0→5 determinísticosrc/systems/runScaling.ts: cada clear sobe o Tier da próxima run. TIER_DEFS empilha HP/ATK do inimigo + injeta hazards extras por andar. Seed derivada de (floorId, tier) — mesmo Tier, mesma composição. Não é "difficulty slider", é a campanha se auto-escalando.
    • Curva HP-dominante / ATK-contida — Tier 5 agora +75% HP e +35% ATK (era +80/+50). Testes locais mostraram que dano escalado demais virava death spiral no T4+: a curva nova mantém peso da decisão sem one-shot do nada.
    • Banner de Tier + "Abandonar Run" — a Sala de Triagem ganhou badge indicando em que Tier você está e um botão claro pra desistir da run atual sem perder clears antigos. Antes, o único jeito de "recomeçar limpo" era wipe manual.

    Metas por andar + Relatório Trimestral (M5)

    • Meta bônus por andarBonusObjective no FloorDescriptor, trackers em src/systems/floorObjectives.ts. Todos os 6 andares campanha (Térreo→Sub-5) ganharam objetivo próprio (ex.: "fechar sem usar cura", "empurrar 3 inimigos pra hazard"). Foco em verbos que já existem no combate.
    • ObjectiveHud em tempo real — canto do HUD mostra progresso da meta do andar enquanto você joga, sem abrir menu. Atualiza nos eventos do barramento (M1), então não mente — se virou check, virou check.
    • Relatório Trimestral pós-batalha — ao vencer, aparece o QuarterlyReportOverlay com vestimenta corporativa: "Avaris Corp · Relatório Trimestral", KPIs atingidos/falhados, assinatura do Liquidador Chefe. Duas saídas: Homologar Trimestre (confirma o clear, save é escrito) ou Solicitar Revisão (reinicia o andar do snapshot pré-batalha sem mutar save).
    • Save agora é deferido — nenhuma gravação acontece até você homologar. Solicitar Revisão é custo zero: o snapshot da Triagem é restaurado, RunTier intacto, meta-progressão intocada. Alinha a ficção ("papel só vale quando carimbado") com a mecânica de replay.

    Modo Escritório — camada de horror (M6)

    • Fonte única de distorçãosrc/systems/distortion.ts define distortionLevel = f(floorIndex, runTier, officeMode cap). Quatro faixas rotuladas: Profissional, Pressão, Desvio, Creepy. Determinístico, puro, seguro de chamar em hot path. Não há outro lugar calculando "quão estranho está" — se precisar consultar, consulta daqui.
    • DistortionOverlay em DOM — CSS filters (vignette + chromatic aberration + SVG grain) aplicados sobre o canvas do Phaser, uma passada só, sem shader per-system. Texto do CombatLog corrompe via glossário corporativo, QuarterlyReportOverlay ganha linhas fantasma em níveis Creepy ("Gritos registrados: 3"), SFX de gameplay passam por playSoundDistorted (SFX de UI ficam limpos, por acessibilidade).
    • Modo Escritório (acessibilidade) — toggle novo nas Opções. Limita distorção a OFFICE_MODE_CAP = 0.25 (topo do nível Pressão): identidade visual intacta, horror forte contido. Para quem tem fobia, sensibilidade visual/auditiva, ou só não quer esse eixo da experiência.
    • Classificação 12+ → 16+ — a camada de distorção empurra o jogo pra outro registro. Atualizado em PRIVACY_POLICY, PRESS_KIT, STEAM_STORE_PAGE e no ContentWarningModal. Chave de storage bumpada v1→v2 pra re-exibir o aviso pra quem já tinha dado ack.

    Limpeza — sistema de CARGA removido

    • CHARGE / BatteryPickup / ChargeBar deletados — a bateria compartilhada do esquadrão foi prototipada, nunca foi tunada pra algo divertido, e competia com ObjectiveHud + DistortionOverlay por espaço de HUD e atenção. Saiu do build inteiro, incluindo tiles de bateria em floors.ts, hooks em ActionBar/HotkeysOverlay/BattleCoach/Unit, e entradas de i18n. HUD respira; nenhum jogador pre-launch tinha aprendido a mecânica, então o custo foi baixo.

    Refactor — setas de facing

    • FinalFacingPicker em unidades de grid — o renderer das setas foi reescrito pra trabalhar em grid (1.0 = 1 tile) e só projetar pra tela no momento de desenhar. Antes misturava constantes em pixel com matemática isométrica, e setas diagonais derivavam em câmeras rotacionadas. Refactor puro, zero mudança visível pra quem joga — só mata um bug que ia morder em andares com rotação forte.

    Créditos e licença

    • Disclaimer de obra de ficção — adicionado em Legal, Press Kit, LICENSE, README e na CreditsScreen. Avaris é empresa fictícia; personagens, departamentos e práticas não representam nenhuma organização real. Importa dizer em alto-falante porque o jogo usa vocabulário corporativo reconhecível.
    • Origem do nome "Avaris" — seção nova no Press Kit, README e rodapé do roadmap, explicando a referência à capital dos Hicsos (XV dinastia) e por que o nome casa com o tema: uma capital que era potência e hoje é ruína arqueológica — espólio no sentido mais literal do termo.
  5. v0.9.5

    Resposta ao Playtest #002 + Sala de Triagem

    Feedback que motivou

    Segundo playtester (Ickert, primeiro contato com jogos de turno) relatou: ficou perdido na primeira partida sem entender o loop turn-based, turno inimigo com popups demais atrapalhando o ritmo, "dead end" ao usar Aguardar quando não havia o que fazer, difícil saber de quem é o turno olhando o board (só o HUD do topo indicava), HP/BP sem descrição na tela, e uma skill com texto misturando pt-BR e inglês.

    Sala de Triagem — nova cena pré-combate

    • PreBattleScene completa — antes de cada andar você entra na Sala de Triagem: requisita equipamento, atribui itens aos Liquidadores e designa onde cada unidade entra no mapa, tudo sob moldura corporativa diegética ("Processo Nº OE-NNN", "Assinar Ordem de Despejo", "Liquidadores aguardando designação"). Substitui a entrada instantânea no combate.
    • Zonas de entrada autorizadas — tiles azuis no mapa mostram onde cada Liquidador pode ser posicionado. Clicar num tile já ocupado permuta com o ocupante. Atalho A aplica Designação Automática (preenche nas primeiras zonas livres).
    • Tutorial em 5 passos da Triagem — guia o primeiro jogador pelo fluxo requisitar item → atribuir ao auditor → avançar → clicar numa zona azul → assinar. Cada passo destaca o próximo elemento esperado com halo animado.
    • "Equipamento" sumiu como tela separada — o painel de inventário foi consolidado dentro da Triagem (aba "Requisitar Material"). Menos um nível de menu no caminho do jogador, inventário agora só aparece quando é relevante (antes da batalha).

    BattleCoach — tutorial interativo

    • Substitui o modal denso de texto — o TutorialModal estático foi trocado por uma máquina de estados com 13 passos contextuais (intro → charge → info → move → attack → ability → facing → restVsWait → cameraEnd). Setas DOM animadas apontam pro botão/tile certo em cada momento.
    • Passo novo turnLoop — antes do primeiro movimento, balão central explica em 2 frases o meta-loop turn-based: "as unidades agem uma por vez na ordem do topo, quando você termina o inimigo age, repete até alguém cair". Responde direto ao "fiquei perdido na primeira partida" de quem nunca jogou turno.
    • Hints em desvio — se o jogador clica no inimigo antes de andar em alcance, aparece toast "Dica: primeiro ande pros tiles azuis" sem interromper o fluxo. O coach também reage a auto-wait ligado e pula o passo de clicar Aguardar.

    Clareza no board

    • Unidade ativa destacada no tile — anel pulsante colorido por time (aliado azul, inimigo vermelho) sob os pés da unidade do turno atual, mais indicador vertical flutuante em billboard (sempre visível independente de quantas vezes você girou a câmera). Antes, quem era o turno só saía do HUD superior.

    Fluxo de turno

    • Auto-passar turno quando não há ação — nova configuração autoEndTurnWhenNoActions (padrão ligado): se a unidade não pode andar, atacar nem usar habilidade, o turno encerra automaticamente mantendo a direção atual. Toast "Sem ações — passando turno" no lugar do antigo dead end onde era obrigatório clicar Aguardar → Confirmar.
    • Acertos críticos — ataques passaram a ter chance de crit calculada a partir da arma e da direção (costas doem mais). Preview mostra badge CRIT {chance}%, o popup vira CRIT! em cor distinta, e o battle log registra a linha "CRÍTICO!" com dano multiplicado. Combate parece menos linear.

    Tooltips de ações

    • ActionBar com tooltips completos — hover em Atacar, Habilidade, Descansar, Procurar, Aguardar ou Desfazer mostra título, descrição, custo em SP/BP e alcance. Botão desabilitado indica o motivo: "SP insuficiente (2/3)", "BP insuficiente (0/5)", "Nenhum alvo válido no alcance", "Esta unidade já agiu neste turno", "SP já está no máximo".

    Registro opcional

    • Registro da Avaris após vitória do Térreo — em vez de forçar cadastro na abertura, o jogo espera a primeira vitória e oferece registro num modal diegético ("Departamento de Recursos Humanos · Arquivamento"), com "Jogar sem registrar" visível. Save na nuvem, conquistas arquivadas e cross-device ficam opt-in sem barrar quem quer só experimentar.
  6. v0.9.4

    Resposta ao Playtest #001 (CH)

    Feedback que motivou

    Primeiro playtester (CH, gamedev) reportou: onboarding apressado, dano do ataque básico parece moroso, não dá pra voltar ao menu no meio da partida, setas de direção confusas por causa da rotação da câmera, algumas telas não traduzidas no modo inglês, e a sensação de que o jogo era "só uma demo" por não perceber que havia mais andares.

    Créditos

    Obrigado a CH (gamedev) e Ickert por serem os primeiros playtesters — este release e o v0.9.5 só saíram porque vocês dois toparam jogar o protótipo bruto e devolver feedback honesto. A primeira revisão pública do jogo existe por causa de vocês.

    Fluxo e acessibilidade

    • Sair pro menu principal a qualquer momento — adicionado item no botão de ajuda (canto superior direito) com confirmação destrutiva e parada da música. Antes só fechando a aba dava.
    • Ficha completa da unidade — nova tela mostrando atributos, habilidades (com custo de BP e alcance) e equipamento, acessível pela tecla I, clicando no portrait ou no botão "Ver ficha completa" da HUD.
    • Botão visual na HUD — abaixo dos status effects agora tem um botão dedicado "Ver ficha completa" com atalho I à mostra, pra não depender só do hotkey invisível.

    Onboarding em camadas

    • Tutorial em 6 passos — cada passo foca em uma peça de UI (turn queue, charge bar, HUD, action bar, mapa, metas) e destaca visualmente o elemento com halo animado. Substitui o painel denso de texto anterior.
    • Marcado como visto só no fim — fechar o tutorial pelo X ou pelo backdrop não conta como "concluído". Só clicando em "Finalizar" no último passo ou em "Pular tudo" é que a flag fica salva. Reduz a frustração de abrir sem querer e perder o tutorial pra sempre.

    Visibilidade de progressão

    • "Próximo andar: X" — o badge de andar agora inclui o label do próximo destino, eliminando a impressão de que o andar atual era o fim do jogo. O banner de transição também ganhou um subtítulo descritivo.
    • Codinomes dos andares — cada andar tem codinome curto (Recepção, Térreo, Sub-1, Sub-2…), exibido na transição. Ajuda o jogador a se localizar na descida.

    Controles

    • Setas relativas à câmera — ↑ agora sempre move pra "longe da tela" independente de quantas vezes você rodou a câmera. O jogo resolve a rotação internamente e traduz pra direção de grid correta.

    Game feel

    • Ataque básico menos moroso — inimigos dos primeiros andares receberam multiplicador de HP reduzido, então o ataque básico fecha kills em menos turnos. Os bosses e andares finais ficaram como estavam.
    • Popup de dano mais rápido, shake mais forte — duração do floating text reduzida em ~30% e intensidade do screen shake aumentada em hits com dano real. Combate parece mais reativo.

    Tradução (pt/en)

    • Auditoria completa de i18n — revisão linha-a-linha de battle log, action bar, painéis de preview (ataque e habilidade), HUD, turn queue, charge bar, ficha da unidade, inventário, efeitos de status, popup de dano e nomes de esquadrão. Nada mais em pt-BR aparece por acidente no modo inglês.
    • Bug corrigido — chaves de i18n com pontos no meio (ex: abilityPreview.target.self) eram resolvidas incorretamente pelo lookup. Reestruturadas pra objetos aninhados; strings agora aparecem traduzidas ao invés do fallback.

    Narrativa

    • Prólogo reescrito — a cutscene de abertura passou de 3 páginas densas de lore pra 5 beats curtos que situam você (EP-047), a Avaris (empresa morta) e o que você está fazendo lá. Mostra ao invés de contar.

Mandou feedback, mas ainda não virou patch?

Todo feedback passa por triagem e entra em alguma fila. Se quer status de um item específico, ou quer mandar playtest novo, se inscreva na lista — respondo por e-mail.