Challenge Mode

Challenge Mode is an extended 10-level run variant unlocked per-planet after the player clears that planet’s normal-mode final boss. It is twice as long as a normal run, hits harder across the board, and pays out twice the rewards. The toggle is a single isChallenge flag plumbed from the hub through assembleRunDef() into runDef.context and worldKnobs.

Unlock & gating

Challenge Mode is unlocked per planet, not globally. The gate is held by HubScreen (the caller of assembleRunDef) and depends on:

  • The player having cleared the normal-mode final boss for that planet.
  • The planet not being a leaderboard planet (leaderboard planets are explicitly excluded).

Once both hold, the hub surfaces a Challenge toggle for that planet, and the player can launch a Challenge run by passing isChallenge: true to assembleRunDef. Everything downstream of that flag is mechanical.

Level sequence (10 levels)

Normal mode is a 5-level arc (normal, normal, mini_boss, hard, boss). Challenge Mode doubles that to 10 levels, with the same per-level difficulty curve and a mini-boss gating every three-level segment:

LevelKindNotes
1normal4-min biome level, normal ramp
2normalsame biome/palette, normal ramp
3mini_bosssealed square arena, mini boss + roster, ends on boss death
4normalnormal ramp
5normalnormal ramp
6mini_bosssecond mini-boss gate
7hardramp pinned at 1.0, basics-only window skipped
8hardramp pinned at 1.0, basics-only window skipped
9mini_bossthird mini-boss gate
10bosssealed square arena, final boss with 2× HP/damage, ends on boss death → results

The mini-boss every three levels gives Challenge Mode a different rhythm than normal: short normal stretches punctuated by repeated arena fights, then a hard-hard-mini run-in to the final boss. Hard levels in slots 7–8 skip the basics-only window so the player faces the full enemy roster immediately.

The sequence is fixed at data/level-progression.ts in CHALLENGE_LEVEL_SEQUENCE. resolveLevelKind(currentLevel, isChallenge) picks the array based on the run flag, and isFinalLevel(currentLevel, isChallenge) returns true at level 10 (vs. level 5 for normal).

Difficulty & reward multipliers

Challenge Mode applies two multipliers at run-assembly time in services/assembleRunService.ts:

MultiplierValueApplied to
challengeDiffMult1.5×enemyCountMult, enemyHpMult, enemyDamageMult
challengeRewardMult2.0×rewardMult

The 1.5× difficulty bump lands between a normal run and a Voidstar pressure run — the longer run actually punches harder, not just lasts longer. The 2× reward multiplier is the headline incentive: the run takes twice as long, so it pays out twice as much.

These stack multiplicatively with the existing per-planet enemyCountMult (e.g. Voidstar = 2×) and the hidden ship-rarity scale (common: 0.5legendary: 1.0). So a Challenge run on a hard planet with a legendary ship multiplies all three difficulty knobs simultaneously.

The isChallenge flag is also persisted onto runDef.context.isChallenge so the engine (boss scaling, enemy spawner, telemetry sampler, bridge) can read it during the run.

What stays the same

Challenge Mode does not change:

  • Per-level timing (levels are still 4 minutes for normal, sealed-arena until-boss-dies for mini/boss kinds).
  • The basics-only spawn window on normal levels (only hard levels skip it; this matches normal mode).
  • Biome, world-gen, weapon pool, artifact pool, or reward card pool.
  • Boss-kind HP/damage multipliers (BOSS_KIND_HP_MULT_MINI = 4.0, BOSS_KIND_HP_MULT_BOSS = 8.0, etc.) — those apply regardless of mode.

The only differences from normal mode are: sequence length (10 vs 5), the every-3-levels mini-boss cadence, the 1.5× difficulty multipliers, and the 2× reward multiplier.