| name | validate-controls |
| description | Valida os dois caminhos de input (teclado + touch D-pad) após mudanças em controles, arena, exploração ou timing. Execute antes de commitar. |
| disable-model-invocation | true |
Validação Dual de Controles
Execute esta checklist completa. Os dois caminhos devem funcionar de forma idêntica.
Passo 1 — Testes automatizados
make test
Confirmar: test_touch_controls.gd (4 testes), test_controls_hud.gd (3 testes) e
test_floating_dpad.gd (11 testes) passam.
Se qualquer desses falha, NÃO commitar — corrigir primeiro.
Passo 2 — Exploração: Teclado
Rodar o jogo (~/.local/bin/godot --path .) e validar na tela de exploração:
Passo 3 — Exploração: Touch D-pad flutuante
Ativar D-pad (Options → Touch Controls → Always) e validar (com mouse no desktop o
gesto é clicar-e-arrastar; o pad responde igual ao dedo):
Passo 4 — Combate (Arena): Teclado
Entrar em combate e validar:
Passo 5 — Combate (Arena): Touch D-pad flutuante
Diagnóstico Rápido
Falha só no touch, passa no teclado:
ControlsHud._feed_event() não está chamando Input.parse_input_event() corretamente
- A action string no D-pad não coincide com
TimingSystem._expected_action
_on_pressed() chamado sem _on_released() correspondente (action presa)
Falha só no teclado, passa no touch:
_get_cardinal_input() usando action string diferente da que o D-pad injeta
- InputMap não tem a tecla física mapeada para a action
Arquivos Críticos
| Arquivo | Função-chave | Responsabilidade |
|---|
scripts/ui/controls_hud.gd | _on_pressed(action) | Injeção dupla D-pad |
scripts/ui/floating_dpad.gd | resolve_action(offset) | Gesto → direção cardinal |
scripts/entities/caipora.gd | _get_cardinal_input() | Polling exploração |
scripts/systems/timing_system.gd | _input(event) | Event listener combate |
scripts/arena/arena_manager.gd | _is_under_dpad() | Posicionamento bolhas |
tests/unit/test_touch_controls.gd | 4 testes | Contrato injeção dual |