Obsession Challenge is the game's boss-rush menu. It lets you fight the "Obsessed Ones" you have already met in the story again, one at a time, in a short arena fight where the only goal is speed. There are no items, experience or drops: a win writes a fastest-time record for that hero, difficulty and boss, optionally marks it as a "perfect" (untouched) win, and feeds an online score and ranking. The menu is reached from the lobby; the game's internal name for it is the StoryChallenge system ("boss time challenge" mode in code).
Overview#
- You choose a sub-mode, a hero (five buttons), a difficulty (Custom Mode only) and a boss from a scroll list of 15.
- A boss is only clickable if you have beaten it in the story (see the unlock rules below). Otherwise the game says you have not met this Obsessed One yet.
- You start next to the boss at full health. The fight is over when the boss takes its final hit (win) or you die (fail, nothing is recorded).
- Your time is stored per (difficulty, hero, boss). The best time per boss across all heroes at a difficulty is what counts towards your total score.
- The global Casual/Normal/Expert setting is ignored: the mode forces the Normal global difficulty when it starts (
FS_SaveStory:BossTimeChallenge). Boss strength comes only from the tables below.
The two sub-modes#
The game calls the two sub-modes Normal and Custom in code, and the menu text and achievements call them Custom Mode and Standard Mode. The mapping is easy to mix up, so here it is in one place:
| Menu / achievement name | Code name | Menu description (paraphrased) | Hero | Difficulty levels | Challenge level number |
|---|---|---|---|---|---|
| Custom Mode | Normal (ChallengeMode.Normal = 1) | Fight with the hero from your own save; difficulty can be chosen | Your save: your level, attributes, talents, trophies and consumables | Easy, Normal, Hard, Very Hard (button names; the in-game labels are not in the text tables) | 1, 2, 3, 4 |
| Standard Mode | Custom (ChallengeMode.Custom = 2) | Fight with a given hero of a fixed level and equipment; standard difficulty | A preset hero (table below) | one fixed level | 5 |
The Very Hard level is the "Colossus Difficulty" named by the achievement Eternal Colossus. The "Custom Mode under Colossus Difficulty" in that achievement therefore means the own-save mode at level 4.
Custom Mode (your own save)#
Your hero keeps everything it has in the save. When the fight starts the game resets the story state, restores the hero to full health and spends one Egg of the Bearer (item 10018, named NoobItem in code) from the bag if you hold one (UseBagItem; the purpose is not stated, probably to keep the beginner item from affecting the run, inferred). The boss levels are fixed by the chosen difficulty (see the next section), so a strong build can trivialise the lower levels.
Standard Mode (preset heroes)#
FS_UserData.ResetToChallenge wipes your inventory, trophies, hero list and story state for the fight and then builds a fixed hero:
- all five heroes are set to level 30;
- the chosen hero gets every talent at maximum level;
- the seven attributes are overwritten with the preset values below;
- six preset trophies are equipped (slot 1 to 6).
| Hero | Level | Str | Dex | Vig | Int | Vit | End | Hidden | Total | Trophies (slots 1-6) |
|---|---|---|---|---|---|---|---|---|---|---|
| Terrence | 30 | 28 | 9 | 21 | 8 | 13 | 22 | 1 | 101 | Savage Reaper, Knight's Spear, Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie |
| Viola | 30 | 9 | 34 | 18 | 11 | 10 | 20 | 1 | 102 | Active Niter Pot, Knight's Spear, Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie |
| Benita | 30 | 14 | 15 | 20 | 20 | 12 | 20 | 1 | 101 | Mutated Claw, Knight's Spear, Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie |
| Norwood | 30 | 30 | 8 | 22 | 6 | 15 | 18 | 1 | 99 | Active Niter Pot, Mutated Claw, Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie |
| Jerold | 30 | 14 | 14 | 20 | 12 | 13 | 27 | 1 | 100 | Savage Reaper, Fully-hilted Bone Sword, Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie |
Attributes are listed in slot order 1 to 6, using the labels the Attributes article gives the slots (those labels are inferred; the code names are Strength, Spirit, Brave, Dexterous, Tolerant, Generous); the seventh is the hidden attribute (1 for everyone). The "Total" column excludes the hidden attribute. Slots 3 to 6 are the same for every hero (Church Hangings, Knight's Armor, Demiurge's Will, Tristram's Lie); only slots 1 and 2 differ. Arcade mode uses the same attribute numbers without the trophies.
When you pick The First Messenger (Teresa) in Standard Mode, the game also puts 10 Throwing Knife (item 30001) into the bag and assigns them to the first quick slot.
Boss level and difficulty#
Every boss in the list uses the same level table. The level used for a boss is the column Level_<n> of its row in StoryChallenge, where n is the challenge level number (1 to 4 in Custom Mode, 5 in Standard Mode):
| Challenge level | Mode | Boss level |
|---|---|---|
| 1 (Easy) | Custom Mode | 20 |
| 2 (Normal) | Custom Mode | 40 |
| 3 (Hard) | Custom Mode | 60 |
| 4 (Very Hard / Colossus) | Custom Mode | 89 |
| 5 | Standard Mode | 15 |
In addition, each level adds flat bonuses to the boss's base stats from the StoryChallengeMonsterProperty table (see the stat bonus section below).
Bosses#
| # | Boss (hero id) | Boss id | Arena (Area) | Time limit | Max score | Unlock flag | Unlocked in New Game Plus |
|---|---|---|---|---|---|---|---|
| 1 | Maddened Ascetic (20007) | 501001 | 1 | 480s (8:00) | 66667 | quest flag 91201 | yes |
| 2 | Holy Father (20014) | 502001 | 1 | 480s (8:00) | 66667 | quest flag 91202 | yes |
| 3 | Jenny of Exilium (20022) | 503001 | 1 | 480s (8:00) | 66667 | quest flag 91203 | yes |
| 4 | Rosen Cavalier Patrick (20017) | 599001 | 1 | 480s (8:00) | 66666 | quest flag 91203 | yes |
| 5 | Fused Sprenger (20034) | 505001 | 1 | 480s (8:00) | 66667 | quest flag 91205 | yes |
| 6 | Frollo (20028) | 599002 | 2 | 480s (8:00) | 66666 | quest flag 91204 | yes |
| 7 | Edith (20027) | 504001 | 1 | 720s (12:00) | 66667 | quest flag 91204 | yes |
| 8 | Elena (20039) | 599003 | 3 | 480s (8:00) | 66666 | quest flag 91206 | yes |
| 9 | Proxy Higgins (20040) | 506001 | 1 | 480s (8:00) | 66667 | quest flag 91206 | yes |
| 10 | Usurper (20044) | 507001 | 1 | 480s (8:00) | 66667 | quest flag 91207 | yes |
| 11 | The First Messenger (10006) | 8001 | 1 | 960s (16:00) | 66667 | quest flag 88888 | yes |
| 12 | Terror Obsession (20045) | 599004 | 4 | 480s (8:00) | 66666 | Maze DLC flag | no |
| 13 | The First Fallen: Handel (20053) | 9078 | 5 | 480s (8:00) | 66667 | quest flag 91209 | no |
| 14 | Guderian the Guardian (20054) | 9068 | 6 | 480s (8:00) | 66666 | quest flag 91209 | no |
| 15 | Treasure Thieves (20055) | 9070 | 4 | 480s (8:00) | 66666 | quest flag 91209 | no |
All 15 rows share the same four level values. "Unlock flag" is the story flag the menu tests (see below). The 15 ScoreMax values add up to 999,999 (nine bosses give 66,667 and six give 66,666), so a perfect board is worth one million points minus one.
Unlocking bosses#
A boss is selectable when any of these holds (ChallengeCtrl.GetMonsterCanChallenge):
- You are in New Game Plus (story loop above 1) and the row has "Unlocked in NG+" set. This covers the first eleven rows, including Teresa, even if you have not killed them in that save. See New Game Plus#What it adds.
- The row's quest flag is set. These flags are the permanent "boss killed, never reset" markers 91201 to 91207 and 91209 (there is no 91208 quest row; the data comment calls them BOSS kill, no reset), plus 88888 for The First Messenger. For example 91204 is set when Edith dies and 91206 when Proxy Higgins dies, which is why Frollo (flag 91204) opens with Edith's chapter and Elena (flag 91206) opens with Higgins's. Flag 91209 is set when The First Fallen: Handel dies, so the three Tides of Oblivion bosses open together once you have beaten Handel.
- The row has "Dark Mist DLC" switch 1 and the Dark Mist add-on flag is on (this is how Terror Obsession opens, since its row has no quest flag; see Deep into the Dark Mist).
Patrick, Frollo, Elena and Terror Obsession (rows 4, 6, 8 and 12) are extra opponents that are not the chapter boss. Their StoryId is 699, a dedicated challenge story, and each has its own arena Area (1, 2, 3 and 4). The four DLC bosses (rows 12 to 15) have MutliEnable 0, so New Game Plus does not unlock them. The column is spelled MutliEnable in the data.
Score and records#
Score formula#
For one boss, with t the clear time in seconds:
score = max(0, floor(ScoreMax - t * ScoreMax / TimeLimit))
That is a straight line from ScoreMax at 0 s down to 0 at the time limit. Examples for a boss with a 480 s limit and 66,667 points: a 4:00 clear scores 33,333; a 2:00 clear scores 50,000; a 7:00 clear scores 8,333.
The menu's total ("Obsession" in the UI strings) is the sum over all 15 bosses of the score of the fastest record at the selected challenge level, whichever hero set it. Bosses with no record count 0. Each of the five challenge levels (1 to 5) has its own total and its own leaderboard tab.
Nothing in the code searched enforces the time limit as a fail condition: it is used only in the score formula (inferred; no countdown was found in controllerstorymode.lua or mainmenuctrl.lua). A very slow clear just scores 0.
What the timer measures#
The clock is ST_Scene elapsed time. It is added to the total when a cutscene starts and again at the final hit (inferred: the timer is paused during cutscenes), then shown as minutes, seconds and hundredths, capped at ">60" minutes on the result screen. The result screen compares you with the best time (and the hero that set it) and shows a "new record" mark.
Perfect wins#
A run stays perfect until your active hero loses real HP to an enemy. The game clears the flag (ControllerStoryMode:SetNotPerfect) in three places in animalbase.lua:
- a hit that removes more than 0 real HP from your hero, from any attacker that is not a player-controlled host;
- periodic HP loss from a status applied by another character (for example Bleed or Poison) whenever the status's source is not yourself;
- trick damage (
CalculateTrickDamage) that removes real HP.
Damage you inflict on yourself (own statuses, for example) does not count, and shields that soak a hit (no real HP lost) do not break it (inferred from the hpSubReal > 0 tests). A fight can be both fast and perfect, but they are stored separately, as below.
How records are replaced#
FS_Challenge:SetChallengeRecord keeps, for each (level, hero, boss), the shortest time and the perfect flag of that shortest run. A slower perfect run does not replace a faster imperfect one, but it does set a sticky "this hero has been perfect here" mark (historyHeroPerfect) that the boss list shows. A separate per-boss historyPerfect flag (any hero, any run) is stored by SetBossPerfect; this is the one the achievement uses.
Stat bonuses by level#
The StoryChallengeMonsterProperty table (151 rows) has one row per (boss, challenge level, grade). Grade is the boss's phase: it goes up by one each time the boss advances to its next phase (AnimalBase:AddGrade), and at that moment the game swaps in the next row. The values are added flat to the boss's normal base stats (AnimalBase_Value:InitPropertyBase, adding Property_<n> to the property with that id), after the level-based base stats and talent/trophy effects.
Bonuses that every boss gets (every boss row; the three leftover hero rows described below have none):
| Challenge level | Weakness (stagger gauge) | Weakness recovery |
|---|---|---|
| 1 | +0 | +0 |
| 2 | +25 | +0 |
| 3 | +50 | +1 |
| 4 | +75 | +1 |
HP and physical resistance, by boss and phase (HP is a flat number of hit points; physical resistance is added to the boss's physical resistance stat). Standard Mode (level 5) values are the last column, and most are negative, so the preset-hero version of each boss is deliberately weakened.
| Boss | Phase | L1 HP / Phys res | L2 | L3 | L4 | L5 (Standard preset) |
|---|---|---|---|---|---|---|
| Maddened Ascetic | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Maddened Ascetic | 2 | +3000 / +50 | +7000 / +70 | +10000 / +90 | +12500 / +180 | +600 / +25 |
| Holy Father | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Holy Father | 2 | +3000 / +50 | +6000 / +70 | +8000 / +90 | +10000 / +120 | +300 / +15 |
| Jenny of Exilium | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Jenny of Exilium | 2 | +3000 / +40 | +5000 / +60 | +7000 / +80 | +9000 / +100 | -300 / +25 |
| Rosen Cavalier Patrick | 1 | +2000 / +50 | +4000 / +70 | +8000 / +90 | +12000 / +120 | +300 / +25 |
| Fused Sprenger | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Fused Sprenger | 2 | +2000 / +35 | +4000 / +55 | +6000 / +75 | +8000 / +100 | +300 / +15 |
| Frollo | 1 | +3000 / +40 | +5000 / +60 | +8000 / +80 | +10000 / +180 | +0 / +10 |
| Edith | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Edith | 2 | +10000 / +0 | +20000 / +0 | +30000 / +0 | +40000 / +0 | -5000 / +0 |
| Elena | 1 | +2000 / +30 | +4000 / +50 | +6000 / +70 | +8000 / +100 | -600 / +10 |
| Proxy Higgins | 1 | +4000 / +20 | +10000 / +40 | +15000 / +80 | +20000 / +100 | -250 / +10 |
| Proxy Higgins | 2 | +4000 / +20 | +10000 / +40 | +15000 / +80 | +20000 / +100 | -250 / +10 |
| Proxy Higgins | 3 | +4000 / +20 | +10000 / +40 | +15000 / +80 | +20000 / +100 | -250 / +10 |
| Usurper | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| Usurper | 2 | +4000 / +40 | +6000 / +60 | +9000 / +80 | +12000 / +100 | -500 / +10 |
| The First Messenger | 1 | +1000 / +10 | +1500 / +20 | +2000 / +30 | +2500 / +40 | -200 / -40 |
| The First Messenger | 2 | +1000 / +30 | +1500 / +40 | +2000 / +50 | +2500 / +80 | +0 / -30 |
| The First Messenger | 3 | +1000 / +70 | +1500 / +80 | +2000 / +90 | +2500 / +120 | +0 / -20 |
| Terror Obsession | 1 | +3000 / +20 | +4000 / +40 | +5000 / +60 | +7000 / +100 | -1200 / +0 |
| Terror Obsession | 2 | +3000 / +20 | +4000 / +40 | +5000 / +60 | +7000 / +100 | -1200 / +0 |
| The First Fallen: Handel | 1 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 | +0 / +0 |
| The First Fallen: Handel | 2 | +0 / +40 | +0 / +60 | +0 / +80 | +0 / +100 | -4400 / +10 |
| Guderian the Guardian | 1 | +2000 / +30 | +3000 / +50 | +4000 / +70 | +6000 / +100 | -2500 / -20 |
| Treasure Thieves | 1 | +0 / +40 | -1000 / +60 | -2000 / +80 | -4500 / +100 | -4000 / -30 |
A "+0 / +0" row means the table has a row for that phase but no HP or resistance bonus (the phase may still get the weakness bonuses above). Further per-boss bonuses in the same table that the summary does not show:
- Physical damage (levels 1 to 4): Rosen Cavalier Patrick +50 / +75 / +100 / +125 (phase 1); Maddened Ascetic and Holy Father phase 2 the same +50 / +75 / +100 / +125; Jenny of Exilium and Fused Sprenger phase 2 +25 / +50 / +75 / +100; Frollo and Elena +0 / +20 / +40 / +60; Terror Obsession +50 / +80 / +120 / +150 (both phases).
- Elemental damage: at level 5 (Standard Mode), Frollo, Elena, Proxy Higgins (all three phases), The First Messenger (all three phases), Edith phase 2, Fused Sprenger phase 2, Usurper phase 2, Terror Obsession, Guderian the Guardian and the Treasure Thieves get -60 to Fire, Poison, Arcane and Dark damage, which cuts their elemental attacks sharply. The First Fallen: Handel does not.
- Standard Mode physical damage (level 5): Frollo -130 and Elena -70, so they hit much softer in Standard Mode; Patrick, Terror Obsession and the Ascetic's and Holy Father's phase 2 get +50, Jenny's and Sprenger's phase 2 +25.
- The table also contains rows for hero ids 10002, 10003 and 10004 (Viola, Benita, Norwood) with only physical resistance +40 / +50 / +60 / +70 at levels 1 to 4 and, at level 5, an HP cut (Viola -200, Benita and Norwood -400, the last two also -30 physical resistance), and an empty level-6 row for Patrick. The boss list never fights these heroes, so these rows are probably leftovers (inferred).
Hidden mechanics#
- The sub-mode names are swapped between code and menu. In code "Normal" is the mode with your own save and "Custom" is the preset mode, the opposite of what you might guess. The achievement texts use the menu names.
- Colossus difficulty is boss level 89. Levels 20, 40 and 60 for the lower tiers; the jump to 89 plus the weakness bonuses and large HP additions makes level 4 far harder than level 3 for most bosses.
- Phase 1 is almost untouched. For bosses with two phases (Ascetic, Holy Father, Jenny, Fused Sprenger, Edith, Usurper, Handel), the HP, resistance and damage bonuses sit on the phase 2 row. Edith's second phase gains 10,000 / 20,000 / 30,000 / 40,000 HP, the biggest single bonus in the table.
- Standard Mode bosses lose HP. At level 5 many bosses have negative HP bonuses (Terror Obsession -1,200, Guderian -2,500, Treasure Thieves -4,000, Handel's phase 2 -4,400, Edith's phase 2 -5,000), and a level-15 base. The preset mode is a balanced speed run, not a gear check.
- The Treasure Thieves get weaker as you raise the level. Their HP bonus is 0 / -1,000 / -2,000 / -4,500 at levels 1 to 4 (while their resistance rises 40 / 60 / 80 / 100). This looks like a tuning quirk of the data.
- Time limit is score-only. There is no fail timer in the code searched; it only sets the slope of the score line.
- Teresa's special cases. She is the longest fight (960 s limit), is the only boss whose row uses story id 8 and boss id 8001 (the main-story fight), and in Standard Mode you are handed 10 Throwing Knives.
- Jerold needs the Tides DLC flag even though the button exists for everyone: clicking Jerold's portrait does nothing when
IapData.GetEnterTide()is false, and the portrait is greyed. In the code we have, the DLC flags are hard-codedtrue(IapData.DLC_TIDE_1), so the button works (see Tides of Oblivion#hm-where-the-game-checks-the-tide-flag-iapdata). - Fights use the challenge
StoryId/Area. The Patrick, Frollo and Elena challenge fights run in story 699 areas 1, 2 and 3, not in their chapter maps.
Achievements#
Four achievements are driven by this mode (FS_Challenge:CheckAchievement and the result screen). Their goals and tracking are in Achievements#Obsession Challenge. The three "all bosses" checks (Untouchable, The Obsessed One, Eternal Colossus) use only the 11 non-DLC rows (DLCBoss 0), so the four DLC bosses never count. They bypass the gate that blocks story achievements in this mode (Achievements#hm-mode-gate-in-the-obsession-challenge-time-challenge).
Trivia#
- The online leaderboard needs an internet connection and the game warns about rankings in a dialog before showing them. The ranking button is hidden on the macOS build.
- The challenge story ids are 601 to 607 for the chapter bosses and 699 for the extra fights, with
ShowQuestId91201 to 91207. - Handel, Guderian and the Treasure Thieves have
DLCBoss1 butDLCSwitch0, while Terror Obsession has both set to 1. That is why they unlock differently.
Sources#
luascript/structdata/ms_storychallenge.lua:6-65(modes, levels, boss lists);fs_challenge.lua:128-243(records, score),569-612(achievements).luascript/ui/controller/challengectrl.lua:23-277(menu),599-666(start, unlock rules).luascript/structdata/fs_userdata.lua:63-90,fs_herolist.lua:158-169,fs_herodata.lua:307-345(preset hero),fs_savestory.lua:1577-1606(BossTimeChallenge).luascript/controller/controllerstorymode.lua:1266-1268, 1735-1757, 1809-1814, 2915-2920, 3018-3024, 3560-3580;luascript/logic/player/animalbase.lua:1503-1530, 1595-1620, 5493, 16743, 16770;luascript/logic/playervalue/animalbase_value.lua:224-236.luascript/ui/controller/mainmenuctrl.lua:6078-6083, 8521-8737(result screen, records).- Tables:
ES_StoryChallengerows 1 to 15 (ScoreMax66,667 in rows 1, 2, 3, 5, 7, 9, 10, 11 and 13; 66,666 in the other six);ES_StoryChallengeHerorows 1 to 5;ES_StoryChallengeMonsterPropertyrows 1 to 151;ES_StoryQuestrows 1917 to 1924 (flags 91201 to 91207 and 91209) and row 1650 (flag 88888) andES_StoryMonsterrows withCompleteQuestId91204, 91206, 91209;ES_Achievementids 50001 to 50004; GameTextUI_CHALLENGE_*,UI_ACHIEVEMENT_LIST5.