A week before the deadline, I had a great idea: create a simple combat mode where I could test the AI and showcase it to others. The concept was simple: a wave-based arena mode where you fight off waves of enemies. Between rounds, you level up, but so do your enemies.
I planned to build it in one day (optimistic, I know). I only needed:
Three menus: character upgrades, weapon selection, and the game over screen.
A spawner for enemy bots.
A round manager to handle progression.
Long story short: I didn’t (in time).
Another one, another one, another one If I had to pinpoint what went wrong the most, it was definitely poor planning. Altogether, I spent about 2–3 full workdays just on the arena. On top of that, the end of the holidays hit my motivation pretty hard.
But the shortcomings in the platform also had an impact. Here’s what went wrong:
Project Naming Bug – When setting up my s&box project, I used uppercase letters in the package ident. This caused issues, I forgot which exactly. Later, when I added a period (".") to the ident, all my components disappeared. It took me an hour to realize the project name was the culprit.
Editor Glitches – I followed the official docs to add an in-editor tool… but nothing happened. After 30 minutes of restarting the editor, the tool suddenly appeared. Also a redundant prefab spawns on the scene each time I open the editor.
NavMesh Broke – A week before submission, the NavMesh suddenly stopped working. After debugging for days, I found out it wasn’t my fault—many people had the same issue. The fix? Regenerate the NavMesh.
Exceptions – As I was refactoring the project and hunting for bugs in the final days, I suddenly discovered that the NRE wasn’t caused by my code, but happened when calling `NavMesh.GetSimplePath` and `GetComponent`. The exception from the former breaks the mode since the bots can no longer find paths.
Networking Bugs – In the final days, duplicate player instances started spawning randomly, leading to such amusing bugs:
Players get extra guns. I noticed it when I fixed a bug in networking, but the problem remained. Co-op mode is still unfinished.
There were more straightforward situations too—like when I was debugging multiplayer and couldn’t figure out why the `IsProxy` property was returning the wrong result. Who would’ve known that you need to call it after `OnStart`, not `OnAwake`, especially when the documentation doesn’t mention it (just a reminder, I’m an amateur in game dev).
Change of concept At this point, I realized it was time to change the idea because all I had ready were just interfaces. And submitting a jam entry with a library that only had this to offer:
public interface ISbokuState
{
public void Think();
public void OnSet();
public void OnUnset();
}
Well, that seemed... questionable. It became clear that I probably wouldn’t be able to pull off that “smart” AI in time, so I decided to focus on two things:
Finish the arena.
Make the existing logic portable to any weapon base.
The second point was necessary because during development, I had glued everything to SWB and I didn’t consider it might backfire.
To fix this, I had to turn `SbokuBase` into an abstract class and detach it from SWB, then inherit `BotAdapter` from it. During development, these were two unrelated components, both nailed to the weapon pack (the first was my implementation of the NavMesh agent, and the second was my implementation of the controller for SWB). On top of that, the states were also tightly bound to SWB. So, I decided to settle on the “minimum” version. With the new plan, I could at least submit something functional. In soviet Russia, deadlines hit you With three days left, I still didn’t have a proper arena (despite my "one-day" plan). It was crunch time. The game mode was almost finished, so there’s not much to say here—I just had to sit down, get it done, test it, and repeat.
Creating the Map Until now, I had been testing on a rough prototype—a bunch of resized cubes. But I needed a real map.Fortunately, I had experience with Hammer Editor (from Counter-Strike: Source map-making). Unfortunately, Source 2’s Hammer is completely different.
Jokes aside, the editor has really leveled up. Now it’s more like Blender. The new Hammer is great, but it has one downside—there's not enough guides online. Learning the new tools took time, but I eventually built a spectacular box with slight verticality. Adding some props and fog made it look halfway decent. And I’m happy with the result. There’s definitely room to grow, though.
Final Steps: Modular AI Library With the game mode finished, I returned to my original goal—creating a reusable AI framework. Overall, I already described my plan in the "Change of Concept" section. And it turned out to be a bit easier than I expected. So, the last day for me was spent in relaxed tweaks and refactoring.