Commit 0ef6446
PC: make the route a decision and the boss a fight
Two complaints, one cause: nothing that happened on the way to a boss mattered,
and the boss did not either.
The map
Sector maps were filled by column -- column 4 always a trader, column 6 always
a repair bay. Every route crossed both, and the last node before the boss handed
back the hull. Measured across 400 generated sectors: 1.87 repair bays each,
100% of routes crossing one, 100% with one in the column before the boss. That
is not a branching map, it is a corridor with decorations.
Special nodes are now placed one at a time. A trader, and less than half the
time a repair bay -- and when both exist they go in the same column on different
rows, so it is one or the other and the choice was really made a column earlier
by taking the row that could reach the one you wanted. The approach to the boss
is always a patrol or an elite. Now: 0.41 repair bays a sector, 42% of sectors
offering one at all, 11% forcing it, 0% before the boss. A repair bay is worth
the detour instead: 45% of the bar rather than a flat five.
Attrition
Chasing "why is the ship always full at the boss" turned up something worse: a
patrol was worth -0.13 hull. Negative. Two leaks, both invisible without
counting. Every kill had a 9% chance of dropping a hull patch, and at eighteen
kills a fight that healed more than the fight cost; now 3%. NANOREPAIR healed
per node per level, and the Void does not end, so neither did it -- a maxed one
outhealed everything the game could do. It heals once a sector.
The bosses
Each already owned a mechanic; they were all too slow and too sparse to be a
fight. New vocabulary shared by all five: walls with exactly one gap, rotating
spirals, unaimed rain, pod bursts, beam combs that sweep the arena, and
destructible guns bolted to the arena walls -- the edges were where you went to
be safe, and a fight with a safe corner is one you win by sitting in it. The
campaign ramp is much shallower: sector 1 used to fire at two thirds the rate of
sector 5, which made the first boss a formality that taught none of the patterns
the second then expected.
None of it is random. Same spiral every rotation, always exactly one gap, beam
fixed where it aimed when charging began -- hard and unfair are different, and
the difference is whether the pattern can be read.
Rhythm
The first cut of this simply never stopped firing, and that was the mistake:
with no window to shoot back a fight stops being something you read and becomes
arithmetic. 60 seconds of dodging. They breathe now -- a storm of 3 to 4.4
seconds, then a window of 1.7 to 1.1 where boss, pods and wall guns all fall
silent, marked by cyan corner ticks (a full box already means "armoured", and
two states that matter cannot share a shape). That took the fight to 45 seconds
and let the storm be far nastier than it could otherwise have dared.
Difficulty tiers
They were set mostly by enemy count -- but an enemy is also salvage, so ACE
fielded 35% more of them, banked 35% more crystals, and won more often than
CADET. The knob was fighting itself. Tiers now separate on rate of fire, which
returns nothing to the player, over a deliberately deep hull bar: a boss that can
take a third of your hull in one mistake needs a hull you can afford mistakes
with, or "hard" just means "the first hit ends the run".
The pilot, which had to be fixed first
The test pilot was a repulsion field, and that is exactly the wrong shape for
bullet hell: a wall with a gap pushes it along the wall instead of into the
hole, a spiral surrounds it so the vectors cancel and it stops. Tuning against
it would have meant deleting the good attacks. It now evaluates all nine stick
directions by proper closest approach, position against velocity. Validated on
the unchanged game: the old pilot scored 7/4/1, the new one 7/6/5 -- never
worse, much better where the old one lost to patterns it could not read, which
also means the previous balance figures were partly measuring the robot.
Measured, twelve seeds a tier: CADET 8/12, PILOT 5/12, ACE 2/12. Boss damage
0.6 -> 4.5 hull, untouched boss fights 57% -> 18%, boss fights 30s -> 45s.
Worst frame measured, WARDEN phase 3 in co-op with 102 bullets live: 0.94 ms
p99 against 16.7.
pc/tools/balance.py is the bench all of that comes from, and it reports the map
as well as the fights, because "every route crosses a repair bay" is a fact a
win rate will never show you.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKLqS4PgnCXrzKHDH8Cnzy1 parent d439216 commit 0ef6446
22 files changed
Lines changed: 959 additions & 191 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
36 | | - | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
37 | 41 | | |
38 | 42 | | |
39 | 43 | | |
| |||
Loading
Loading
Loading
Loading
Loading
Loading
Loading
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
196 | 196 | | |
197 | 197 | | |
198 | 198 | | |
199 | | - | |
200 | | - | |
201 | | - | |
202 | | - | |
203 | | - | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
204 | 204 | | |
205 | 205 | | |
206 | 206 | | |
207 | 207 | | |
208 | 208 | | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
209 | 245 | | |
210 | 246 | | |
211 | | - | |
212 | | - | |
213 | | - | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
214 | 311 | | |
215 | 312 | | |
216 | 313 | | |
| |||
236 | 333 | | |
237 | 334 | | |
238 | 335 | | |
| 336 | + | |
239 | 337 | | |
240 | 338 | | |
241 | 339 | | |
| |||
245 | 343 | | |
246 | 344 | | |
247 | 345 | | |
| 346 | + | |
248 | 347 | | |
249 | 348 | | |
250 | 349 | | |
| |||
279 | 378 | | |
280 | 379 | | |
281 | 380 | | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
282 | 412 | | |
283 | 413 | | |
284 | 414 | | |
285 | 415 | | |
286 | | - | |
287 | | - | |
288 | | - | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
289 | 423 | | |
290 | 424 | | |
291 | | - | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | 425 | | |
296 | 426 | | |
297 | 427 | | |
0 commit comments