A first-person 3D tower defense game built on a custom C++ engine. Programmed from the ground up to support dynamic AI state machines, deterministic rigid-body physics, and flexible data-driven YAML tooling pipelines.
Role: Gameplay & Systems Programmer (Project Lead)
BOTS TD is a first-person tower defense hybrid inspired by action-defense classics like "Orcs Must Die!" and "Sanctum". Players are plunged directly onto the battlefield, physically navigating the 3D map to construct, upgrade, and repair defensive turrets while engaging waves of mechanized enemies in real-time combat.
Built from the ground up without commercial game engines, the project runs on a custom C++ architecture. As the Project Lead and Systems Programmer across a 13-person multidisciplinary team, I engineered the deterministic game loop, integrated Jolt Physics for collision resolution, developed modular AI finite state machines, and authored a data-driven YAML pipeline for wave scaling and cinematic sequences.
The core game loop separates logic and physics updates into discrete, fixed time steps using an accumulator pattern. This guarantees deterministic physics behavior and simulation stability across variable hardware refresh rates, while the graphics pipeline smoothly interpolates transforms between ticks.
Enemy bots utilize a modular Finite State Machine (Move, Shoot, Stun, Die). The navigation loop continuously evaluates waypoint vectors, checks dynamic line-of-sight and range thresholds against defensive targets (Gates, Nexus, Player), and seamlessly coordinates FMOD movement audio fading before transitioning into active combat.
To script cinematic sequences and win states without hardcoding timelines in C++, I engineered a custom cutscene event sequencer. Leveraging the engine's existing YAML parser, I built a runtime system that reads sequential data to execute timed actions such as camera lerping, screen fades, audio triggers, and UI text displays.
The engine needed to support several distinct enemy types such as grunts, kamikaze bombers, and gun turrets, each with different interruptible behaviors: waypoint navigation, line-of-sight shooting, burst-fire cooldowns, stun-locks, and death sequences. Hardcoding each type's logic as one-off scripts meant duplicated code and no safe way to interrupt a behavior mid-execution without leaking memory. That had to hold up under dozens of active enemies during wave spawns without dropping frames.
I built a modular Finite State Machine using the State Pattern: a single AIComponent holds one polymorphic AIState* pointer, and behaviors like Move, Shoot, Stun, and Die are self-contained state objects that plug in per enemy type. State transitions are centralized in a single ChangeState() call that calls Exit(), frees the old state memory, and triggers Enter() on the incoming state. This ensures interrupting a grunt mid-chase to stun or destroy it never leaks memory, even under rapid transitions.
For performance, all AI updates execute through a centralized AIManager that iterates over a contiguous std::vector<AIComponent> every frame rather than performing scattered per-object lookups. This cache-friendly traversal keeps orientation matrix calculations, waypoint tracking, and burst-fire timers running at a stable 60 FPS across active wave spawns.
BOTS TD served as an intensive milestone in low-level systems programming and multidisciplinary team leadership. Building a 3D game on a proprietary C++ engine provided deep practical experience in cache-friendly memory layouts, strict object lifecycles, and cross-subsystem interface design.
Leading a 13-person team reinforced the necessity of robust data-driven pipelines. Providing decoupled YAML data formats for wave spawning and scripted cutscenes eliminated engineering bottlenecks and allowed designers to iterate rapidly while keeping runtime performance stable.
Custom C++ Engine Systems: Deterministic gameplay loop running stably at 60 FPS without commercial engines
Modular FSM Architecture: State-pattern AI system supporting diverse enemy archetypes with zero memory leaks
Data-Driven Tooling: YAML-driven cutscene sequencer and wave spawner pipeline for rapid designer iteration
Engineering Leadership: Managed cross-discipline dependencies, profiling, and milestone execution across a 13-person team
AI Combat, Raycast Shooting, and Hit Reaction Feedback
Radial Menu & Tower Placement Pipeline
Gameplay Teaser & Feature Overview