Posted June 17, 2025 by Cat's box
Hey everyone, and welcome to our first devlog!
When we started this project, we had something fun: a frantic prototype where you, a powerful hero, faced down hordes of enemies. It was chaotic, it was a blast, but under the hood, things were a mess. The game would lag, crash, and worst of all, every new idea felt like a monumental task that risked breaking everything else.
The last few weeks have been less about adding new content and more about performing deep-tissue surgery on the game's core architecture. We wanted to share that journey with you.
The first symptom was obvious: the longer you played, the more the game choked. Our EnemySpawner
was operating blind, just pumping out 75 enemies every 5 seconds, no matter how many were already on screen or how badly the framerate was suffering.
Our first intervention was to give the spawner some eyes and a brain:
These two changes turned the spawner from a dumb repeater into a conscious scene director, making for a much smoother experience.
The deeper problem was in our code structure. We had "God Components"—massive scripts that tried to do everything at once. The main EnemyAI
script handled movement, health, status effects, physics, and decision-making. The GameManager
handled game state, UI, upgrades, player abilities... you name it. It was a house of cards.
Our solution was a complete architectural teardown, breaking these monoliths into focused specialists:
Modular Enemies: The old EnemyAI
was retired. In its place, we now have a component-based system. Each enemy is built from smaller parts:
EnemyHealth
: Only manages health and death.
EnemyMovement
: Only controls physics and movement.
StatusEffectHandler
: Only manages states like slow, freeze, and shock.
EnemyAI_...
: A lean "brain" script, unique to each enemy type, that simply gives commands to the other components.
Specialized Managers: The GameManager
was "fired" from most of its jobs.
UIManager
that only handles UI elements.
AbilityManager
that only handles the logic for player skills.
To make them all talk to each other intelligently without creating new dependencies, we introduced an IEnemy
interface. Now, our game systems (like projectiles) don't need to know if they're hitting a "Square" or a "Diamond"; they just interact with anything that has an "Enemy" contract.
All that foundational work was tough, but it paid off immediately.
With a solid architecture in place, we've finally started building the game mode we've been dreaming of:
That's the journey so far. It was a massive undertaking, but we've gone from a brittle prototype to a robust, scalable, and performant platform. The foundational work is done. Now, the real fun begins.
Stay tuned for what's next! We will be putting up the new version for download soon.