Visão geral
Quarto jogo do portfólio, e o primeiro numa linguagem que não roda nativa em navegador nenhum: Lua. O jogo inteiro (a lógica de Sokoban e toda a interface: tabuleiro, teclado, botões de toque) é escrito em Lua puro. A única peça de JavaScript no projeto é o fengari, uma VM de Lua 5.3 compilada pra JavaScript, vendorizada no repositório — inevitável, já que navegador só executa JS e WASM nativamente (equivale a precisar de uma JVM-em-JS pra rodar Java no navegador).
Sokoban clássico: empurre cada caixa até o alvo certo, sem travar contra parede nem contra outra
caixa. 4 fases fixas, desfazer (Z), reiniciar (R), setas no desktop e botões na tela no
celular.
Arquitetura
A lógica (logica/sokoban.lua) é Lua sem nenhuma dependência: roda igual num interpretador de
linha de comando e dentro do fengari no navegador, testada com um runner próprio sem framework
(lua logica/testes.lua). As 4 fases foram verificadas como solucionáveis por um solver de busca
em largura escrito à parte, que também extraiu a sequência de movimentos mais curta de cada uma —
viraram testes de integração reais, jogando a fase inteira através da própria lógica do jogo.
Dois bugs reais de interop entre Lua e o navegador foram encontrados testando com navegador
headless antes do lançamento (documentados no código): um callback de evento em Lua recebe
(self, evento), não só (evento); e chamar um método nativo do DOM com ponto em vez de
dois-pontos quebra silenciosamente com "Illegal invocation".
Stack
Lua 5.3 (via fengari), zero framework, zero motor de jogo. HTML/CSS/Lua estático, sem build.