Nutty Pursuit
A Robotron 2084-inspired 2.5D arena shooter - a squirrel chasing an acorn thief across three arena levels. Built from scratch in C++ on the Vulkan API. No commercial engine.
overview
Nutty Pursuit is a classic-arcade recreation built for Full Sail's Project & Portfolio V: 3D-rendered models,
2D top-down gameplay, three arena rooms, wave-based enemies, powerups, and a persistent top-10 high-score table.
The whole game runs on a custom C++ stack - Vulkan rendering through the Gateware framework, an EnTT
entity-component-system for gameplay, HLSL shaders, and JSON levels exported from Blender. Every sprint ended
with a packaged, demo-ready NuttyPursuit.exe. A playable Windows build is available on request.
what I built
- 8-directional player combat. Twin-stick-style firing on arrow keys and numpad (diagonals via simultaneous arrows or numpad corners), with the aim vector normalized so diagonal shots aren't faster. Each shot assembles a bullet entity from components - velocity, lifetime, collidable, a mesh instance cloned from the model manager - gated by a fire-rate cooldown component that the rapid-fire powerup swaps out.
- All three enemy AI archetypes. Melee enemies chase with randomized perpendicular jitter so they don't stack into a conga line; ranged enemies kite in distance bands (chase beyond 1.2× shooting range, retreat inside 0.8×, strafe between); the boss switches from melee to ranged behavior at 50% health via a phase component.
- Wave spawning and level progression. A level-driven enemy spawner, plus arena-exit detection that freezes the player and scrolls the camera to the next arena over 1.5 seconds.
- Procedural animation system. Smooth look-at rotation using
atan2with shortest-arc interpolation, a sine-eased damage pulse that scales enemies on hit, and a wing-bob for the flying enemies - all without an animation package. - Scoring with combos. Per-enemy-type points with a combo multiplier (3s window), kill streaks (5s), and time bonuses, persisting across level transitions.
- Collision handling. The OBB-vs-OBB collision pass (Gateware
GCollision) differentiating player and enemy bullets and applying contact damage. - Integration and release work. Made the teammate-built powerup system functional (collection collision, visual sync, effect wiring into player speed and fire rate), fixed the high-score config loading, and handled release packaging so the game ran outside the dev environment.
architecture
Gameplay is pure ECS: almost everything in the game is a small data component (Player,
MeleeEnemy, BossPhase, Lifetime, ToDestroy…) processed
by free-function systems connected to EnTT registry signals. There are no object hierarchies - behavior comes
from component composition. Every tunable - player speed, per-enemy health and fire rates, bullet models,
powerup multipliers, per-level settings - lives in an INI config with fallback defaults, so designers could
re-balance the game without recompiling.
Debugging story: the silent collision failure
Mid-project, enemy hits stopped registering with no errors anywhere. I traced it to the mesh colliders: models exported with offset bounding-box centers, so the OBB tests were happening in the wrong place. Resetting each collider's center to the entity origin at spawn fixed detection for every enemy type at once.
Debugging story: the diagonal speed bug
Player movement originally rotated the character and translated in local space - which made diagonal movement faster and direction-dependent. I replaced it with normalized global-space movement and removed the rotation system entirely; the procedural look-at animation took over facing instead.
process
I wrote the team's Git workflow document - main for sprint releases, dev for daily
integration, per-developer branches, and feature branches, with pull requests reviewed by one or two teammates -
and the team actually followed it through 20+ PRs. Work ran from Jira epics with story points and acceptance
criteria across four weekly sprints, each one ending in a packaged release build.
team credits
Team Orange: Aiden Huber (level pipeline - Blender-to-JSON arenas and the level manager), Alexander Drummond-Henking (powerups, high-score manager, audio), Rosalie Rancourt (menus, splash screens, audio), Maxwell Kelly, and me. Credit where due - the systems above are the ones I built or fixed, verified against the git history.