Types that explain themselves.
I built a lightweight RTTI layer for safe casting, type lookup, factory hooks, and attributed fields. It lets designers add runtime properties through JSON while C++ systems still receive typed data.
I built a modular C++ game engine around external data, clean separation of concerns, and fast content iteration. It later became the foundation for a team built Bloons TD5 recreation.
I designed game objects, components, behaviors, and sequences to be defined through JSON and assembled at runtime. I kept engine clients on stable interfaces while the services behind them remained replaceable.


I separated loading, object construction, behavior, and memory so each part could evolve without forcing gameplay code to know every implementation detail.



I built each foundation to improve iteration while keeping ownership and performance visible.
I built a lightweight RTTI layer for safe casting, type lookup, factory hooks, and attributed fields. It lets designers add runtime properties through JSON while C++ systems still receive typed data.
I built a Service Manager that exposes subsystems by interface, while factories construct objects from reflected type names. That keeps client code stable when an implementation changes.
I implemented named heaps and coalescing allocators to expose usage data and control fragmentation. I used Action lists to turn external content into ordered gameplay behavior that can be reused and extended.
The engine mattered because it made a complete gameplay project easier to author, test, and optimize.
I used this engine’s content and service architecture to support towers, upgrades, behaviors, paths, and collision data in a six person game project. The companion case study focuses on the systems I personally owned.