stealth puzzle programmer

Crush the Hero

image coming key art

ABOUT THIS PROJECT

A turn-based stealth puzzle where you help the demon, not the hero.

You are the demon princess, tired of blind dates, and your father has just captured a charming and extremely gullible hero. The twist is that you never control him directly: You solve the puzzles, dodge his attacks, and rearrange the tower so he walks himself to safety. Built in Scala on LibGDX with Matchmaker Studios, an eight-person team, for Cornell's introduction to game architecture course, and shown in the Desktop division of the 2026 GDIAC showcase.

The hero decides, the player does not

Added the FSM, the win and lose resolution, and the first version of the hero's AI in Scala on LibGDX. The hero is never player-controlled, so his logic is the puzzle itself, and it had to be deterministic enough that a player can plan three moves ahead rather than react.

image coming level select

Priority-based line of sight

On each turn he casts along all four directions and takes back the first entity seen, its distance, and the mirrors the sightline passed through. Each candidate is scored by getPriority, the highest wins, and ties are broken by the shortest distance so he commits to the nearer of two equal targets. Looking back along his own facing is flagged as sound rather than sight, so what he can hear behind him and what he can see ahead are handled separately.

image coming sightlines

Making his reasoning visible

A hero the player cannot control is only fair if you can see what he noticed. Every mirror on the winning sightline is set to reflect that entity type and all the others are cleared each turn, so the mirrors color themselves to show the path his attention actually travelled. A popup animation fires over his head naming what he locked onto, whether that was a demon, a chest or the goal.

image coming tower

Tooling and the art pipeline

Levels are authored in a separate Svelte and TypeScript editor with grid operations, an entity palette, a toolbar and level import and export, so designers on the team built levels as data without touching Scala. On the art side, make_spritesheet.py packs sheets out of the sprites submodule and was refactored to emit multiple sheets as the set grew, and auto-tiling with flood fill means a room's floors and walls fill themselves in rather than being placed tile by tile.