Case study
1 min de leituraUnholy Bastion
Roguelike turn-based em Godot, exportado para WebAssembly
Roguelike por turnos com cinco atos, trinta andares e dois finais possíveis dependendo do que o jogador decide carregar até o boss. Servido no navegador via WebAssembly, atrás de Caddy com cross-origin isolation.
Export e entrega no navegador
Decisões
Caddy como reverse proxy com headers de isolation
Cross-Origin-Embedder-Policy: require-corp e Cross-Origin-Opener-Policy: same-origin servidos como condição de carregamento. Decisão operacional: isolar o subdomínio em vez de poluir o headers do site principal.
GDScript em vez de C# no Godot
Para um roguelike por turnos a vantagem do C# em performance é marginal. GDScript tem turnaround maior dentro do editor, melhor docs first-party, e menos atrito no export para Web.
Dois finais como teste do replay
Decisões de carregamento até o boss alteram a final. Métrica de design: jogador que completa uma run quer ver o outro final, não chega lá por sorte.
“Game design é o exercício mais honesto de constraint design: cada regra que você adiciona é uma decisão sobre onde a fricção deve viver.”
Tradeoffs
Bundle WASM grande
Godot Web exporta um bundle considerável. Compressão Brotli no Caddy mitiga. Aceitável para um jogo dedicado; inviável para um widget genérico.
Save state no localStorage
Sem auth nem backend o save é local. Limita progressão entre dispositivos. Para um roguelike onde a permamorte importa, é uma característica, não bug.
Estado atual
O export para WebAssembly é um exercício de operação tanto quanto de game dev. Os headers certos num Caddyfile valem mais que a próxima feature mecânica.