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:
| Level | Kind | Notes |
|---|---|---|
| 1 | normal | 4-min biome level, normal ramp |
| 2 | normal | same biome/palette, normal ramp |
| 3 | mini_boss | sealed square arena, mini boss + roster, ends on boss death |
| 4 | normal | normal ramp |
| 5 | normal | normal ramp |
| 6 | mini_boss | second mini-boss gate |
| 7 | hard | ramp pinned at 1.0, basics-only window skipped |
| 8 | hard | ramp pinned at 1.0, basics-only window skipped |
| 9 | mini_boss | third mini-boss gate |
| 10 | boss | sealed 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:
| Multiplier | Value | Applied to |
|---|---|---|
challengeDiffMult | 1.5× | enemyCountMult, enemyHpMult, enemyDamageMult |
challengeRewardMult | 2.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.5 → legendary: 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
normallevels (onlyhardlevels 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.
Related
gameplay/concepts/level-kinds— the fourLevelKindtypes (normal,mini_boss,hard,boss).gameplay/concepts/sealed-arena-geometry— sealed-square arenas used bymini_bossandbosslevels.gameplay/concepts/boss-kind-multipliers— boss HP/damage scaling.gameplay/code/data/level-progression—CHALLENGE_LEVEL_SEQUENCE,resolveLevelKind,isFinalLevel.gameplay/code/services/assembleRunService— whereisChallengebecomes multipliers onworldKnobs.