Map Generation
To make each run feels distinct, I created a two-pass procedural generation algorithm that separates dungeon layouts from specific room placement. The first pass uses a random-walk strategy with constraint checks to build the grid arrangement, using backtracking loops to handle dead ends. The second pass looks over the layout to swap standard rooms with focal points like boss, shop, and challenge rooms. To maximize efficiency given the tight scope, the algorithm selects from a pool of pre-built rooms and places them after a layout is decided.
Combat System
For combat, I implemented a system which uses 2D box colliders to handle separate hitbox and hurtbox logic. Decoupling this from the player or specific enemy components let me have environmetal hazards that interact with damage events as well. I synced combat colliders with attack animations using Unity's Animation system, exposing damage and knockback variables to give designers more control.
Enemy AI
All enemies, including the boss, use a state machine combined with trigger boxes and periodic raycasts. When the player is outside the detection threshold, enemies navigate idly and send collision-avoiding raycast along ledges and walls. When a target enters the trigger's bounds and a line-of-sight raycast hits, depending on contextual factors like the target's location, attack cooldowns, and if they were recently attacked to determine their moves.
Credits/Concept Art Menu
To show off team contributions, I wanted to showcase unused concept art assets in its own menu. I collaborated with our UI artist on a split-screen layer showing credits with an interactive gallery. To handle the unconventional asset alignment and sizing, I programmed a scroll rect control script that takes menu navigation inputs and automatically centers the selected concept art button while not using the scroll rect's bounds to not go off-screen.