Most jam games escalate by addition. Night two adds a new enemy, night three adds a new weapon, and by the deadline you are debugging four mechanics instead of finishing one. For I Won’t Be Abducted I made the opposite bet before writing any code: the player’s kit stays constant for the whole game, and difficulty comes from the world.
The boy you control on night three is exactly the boy from night one. Move cooldown 0.18 seconds, kick cooldown 0.4 seconds, three Nerve pips. The dawn draft lets you pick one upgrade between nights, but that is the player’s choice, not the curve. The curve never touches your hands.
Where the curve actually lives
Every gameplay number sits in a Godot Resource (.tres file), editable from the inspector without touching a script. Four resource types drive the whole game: PlayerConfig, EnemyData, AugmentData, and the one doing the difficulty work, NightConfig:
duration(how long until dawn)spawn_interval(seconds between alien drops)max_on_board(population cap)enemy_pool(whichEnemyDataresources can spawn, with per-enemy spawn weights)enemy_speed_scale(a global multiplier on alien step timers)intensity_ramp(how spawn pressure climbs within a night)gift_interval/gift_amount(Scrap pickups: worth 3, then 4, then 5 across the nights)
Night one and night three are the same scene, the same code, the same rules. They differ only in those numbers and in which enemies are in the pool. Rebalancing the game means opening a .tres and turning a dial: make night one gentler by raising spawn_interval and lowering max_on_board. In the last hours of a 63-hour jam, that mattered more than any feature. Tuning time is the scarcest resource a jam has, and a curve made of inspector fields is the cheapest curve to iterate.
When a number can’t fix it, the rule is wrong
Twice during the jam, no knob produced the right feel, and both times the fix was a rule change rather than a bigger number.
First: aliens only leave the board through real exits (the door and two windows are specific cells, not abstract directions). Players quickly learned to hug corners, where a kick had no exit lane and accomplished nothing. The dials could not fix wasted kicks. The rule could: a kick that slams a chain of aliens into a wall now stuns the whole chain. Every kick does something. Then, with kicks reliably useful, the population numbers came back down (night two dropped from 5 aliens to 4, night three from 6 to 5).
Second: the Lobber’s ray-gun dealt direct Nerve damage at range, which on a 15-cell board read as unfair, since there is nowhere honest to hide. Changing its damage number just moved the unfairness around. The rule change: the first ray-gun hit stuns you, and only a hit while you are already stunned costs a pip. Same enemy, same range, but now the threat is readable and the punishment requires two mistakes.
That became my working test for the whole project: tune with numbers until the numbers stop helping, then change one rule and go back to numbers.
What this buys at jam scale
Three concrete wins. Designers (in this case, me at 2 a.m.) balance in the inspector instead of in code. New content is data first: the rare ray-gun alien is mostly a spawn weight (about 15%) in an existing pool, not a scripted wave. And the difficulty story stays legible to the player, because nothing new is ever introduced mid-run. The game gets harder the way a board game gets harder when you add pieces: same rules, turned up.
The full resource schema and the EventBus architecture that goes with it are in the game’s design wiki, which shipped in the repo alongside the game.








