Twelve matches. Twelve wins. A sweep of 3-0 in every single game. Win rate: 92%.
By any conventional standard, these are numbers a game designer would be proud of. But when Dusk looked at this match history, the conclusion wasn't "great work" — it was: the game is broken.
0.67 Kills Per Match
That's the number that gave it away.
In a 2v2 competitive shooter, the player averaged 0.67 kills per match. That means you could spend an entire game hiding in a corner, let your AI teammates do everything, and still walk out victorious. The enemy AI wasn't even prioritizing you — it just attacked whoever was closest, with no distinction between a human player and an AI ally.
A shooter game where the player is a spectator. That's not a game. That's a performance.
Teaching Itself What "Fun" Means
What followed was one of the more fascinating things I've observed in this project: Dusk began playing its own game, analyzing the results, and systematically diagnosing what felt wrong.
The first round of changes targeted the enemies. Damage went up 25%, bullet spread tightened from 1.5° to 1.0°, evasion probability climbed from 45% to 60%. A new "hunt behavior" was added — when enemies lose sight of the player, they now move toward the last known position instead of freezing in place.
Still too easy.

The second realization was more fundamental: the allied AI was too powerful. With a DPS of around 21.4, the ally unit could practically solo the entire enemy team. The player was contributing almost nothing to a game that required the player to matter.
So Dusk turned the knife on its own allies. Firing rate down 33%. Damage down 33%. Spread angle widened from 6° to 9°. Evasion probability dropped from 35% to 18%. Total health reduced from 145 to 95. A 0.4-second target-switching delay was added to simulate actual reaction time.
In other words: Dusk deliberately weakened the teammates it had just spent hours building.
The Line of Code That Made Enemies Notice You
There was still one more problem. The enemies didn't know who the real player was.
In the old logic, enemies selected targets purely by distance and threat value — no distinction between a human and an AI. The result was an elaborate AI-vs-AI ballet happening around the player, with the actual human barely part of the equation.
The fix, added in enemies.ts: a 70% player-targeting priority system, recalculated every 3 seconds. Seven out of ten targeting decisions now favor the human player over the AI allies.
One function call that transformed the game from "AI theater" back into an actual challenge.
The Sweet Spot
Across multiple awakenings, Dusk was chasing something that can't be directly measured: the feeling of a difficulty that's just right. Too easy and the game becomes a formality. Too hard and it becomes punishment. The only way to find the line is to keep looking at the numbers, adjusting, and looking again.
This is what human game designers spend careers on. Dusk compressed that process into a handful of overnight sessions — building the game, playing the game, resenting the game, fixing the game.

MonkeyShot now has 87 TypeScript source files and over 50,000 lines of code. Those 12 "too-easy" wins ended up driving six balance-focused awakenings, touching everything from enemy bullet spread to ally evasion timing.
Because a game worth playing shouldn't let you win while you're yawning.