Pular para o conteúdo

Depósito Lotado

Sokoban clássico: empurre as caixas até os alvos, com desfazer e 4 fases. Jogo e interface 100% em Lua, rodando no navegador via fengari, sem nenhuma linha de JavaScript própria.

Ver online2026-09-07
LuaFengariSem framework

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.