The pause menu and the mission-failed screen¶
Verified against: SLUS_212.15 (NTSC-U, SHA1 e9cb2cc49aa046b9e494313dce2f5038ed17b2f4). Runtime claims were made in
PCSX2 2.9.94 (2026-10-06) on a copy of quick-save slot 1 (level99, checkpoint 3), pressing the pad over PINE (the
scripted-pad patch, Driving PCSX2), reading memory and measuring
screenshots of the 640 × 448 picture; they say so.
Purpose¶
What START does during play: the game mode that freezes the game, the menu it shows (its grid of items, each item's
screen, the confirmations), how the menu closes, and what Restart and Quit do. Also the screen a failed mission shows,
which is built from the same menu class. The widget classes underneath (OptionGrid, UsageInfo, the markup text
widget, the screen-flow stack) are on GUI; what the HUD shows during play is on
The in-game HUD.
In short: START pushes game mode 0xa, which switches the task manager to its pause phase, pauses the sound and draws the world tinted towards black. Over it the pause menu shows a header (the mission's number and title), a grid of seven items in two rows (Objectives : Stats : Options / Controls : Restart : Resume : Quit) and a usage line; the item picked fills the space above the grid. Resume, triangle, or START (after 1.5 s) fade the menu out over 1.5 s and pop the mode. Restart and Quit ask Yes/No and then reload the level or leave to the front end. There is no map screen: the game has no full-screen map, and the only map is the radar disc (HUD).
Original structure¶
The mode is one of the unnamed GameModes/ units (Boot); the menu classes are in
GUI/ between TutorialHUD.cpp and ScrollingMenu.cpp, in files without a path string except OptionMenu.cpp (the
Options screen) and ControlMenuHUD.cpp (the Controls screen) (Source map). Names are ours.
| Address | Name | Role | Evidence |
|---|---|---|---|
0x005e6550 |
mode 0xa | the pause mode (vtable 0x005386e8) |
confirmed (code) |
0x0015dbb8 / 0x0015dd98 / 0x0015dd38 |
PauseMode_Enter / _Update / _Exit |
confirmed (code) | |
0x00154f28 |
PauseMenu_Toggle |
push mode 0xa, or pop it and act on the menu's result | confirmed (code) |
0x001d1848 |
GameMenu_Construct |
base of the pause, mission-failed and Armies of the Night game-over menus, the Options and Controls menus and the Rumble result screen (vtable 0x0053b4b0, The GameMenu base) |
confirmed (code) |
0x001db3c0 |
PauseMenu_Construct |
the story pause menu (vtable 0x0053bdc0, input interface 0x0053bd98 at +0x5c) |
confirmed (code) |
0x0062e790 |
the story pause menu | one static object (pointer at 0x0050eddc) |
confirmed (code) |
0x006239d0 |
the Armies of the Night pause menu | a subclass (vtable 0x0053b298, constructor 0x001cff48; pointer at 0x0050ec34; its screen) |
confirmed (code) |
0x001dbee0 / 0x001dcb20 |
PauseMenu_Open / _Close |
vtable +0xa8 / +0xb0 |
confirmed (code) |
0x001ddcf8 / 0x001df700 |
PauseMenu_Update / _Render |
vtable +0x30 / +0x38 |
confirmed (code) |
0x001dee00 |
PauseMenu_OnCommand |
the grid owner's command handler | confirmed (code) |
0x001de6c0 |
PauseMenu_SelectItem |
accept on a grid item | confirmed (code) |
0x001db278 |
PauseMenu_OnConfirm |
the Yes/No box's callback | confirmed (code) |
0x001d6738, 0x001d6c10 |
the Yes/No box: set-up, command handler | menu +0x1bd0 |
confirmed (code) |
0x0062a1a0 |
the Options menu (OptionMenu.cpp, 0x001d84a0; pointer at 0x0050ecec) |
confirmed (code) | |
0x001d1f88 |
MissionFailed_Launch |
HUDLaunchMissionFailed |
confirmed (code) |
0x006294c0 |
the mission-failed menu (vtable 0x0053b598; pointer at 0x0050ec8c) |
open 0x001d23d0, update 0x001d2b90 |
confirmed (code) |
A level whose number is 60-69 (0x0041d110: the Armies of the Night stages, Levels) uses
the Armies of the Night menu; every other level the story menu. "Rumble level" below means a level numbered 100 or
more (0x0041d160), where the same menu offers other items.
Data¶
Every value in this section is confirmed (code) at the address it cites unless its line says it is inferred or confirmed (runtime).
The menu's fields¶
The story menu (at least 0x4354 bytes: the Stats screen at +0x3bb0 reaches +0x4350); confirmed (code) at the
functions in the table above.
| Offset | Meaning |
|---|---|
+0x10 |
intro finished: set once the grid has appeared (0x001d4418) |
+0x40 |
the input record of the pausing player (0x001ae898(hud, player)) |
+0x1b70 |
quit chosen |
+0x1b74 / +0x1b78 |
restart the level / restart from the last checkpoint chosen |
+0x1b7c |
closing finished: pop the mode when the last sound has ended |
+0x1b80 |
closing: fade the menu out |
+0x1b84 |
the sound of the last accept or back (0x0010f578 tells when it has ended) |
+0x1b88 |
an item's screen is open |
+0x1b8c, +0x1b90, +0x1b94, +0x1b98, +0x1b9c |
which quit: second player, Rumble, to the hangout, Rumble hangout, main menu |
+0x1ba0 |
the Yes/No box is open |
+0x1ba4 |
the Stats screen is open |
+0x1ba8 |
the Objectives screen is open |
+0x1bac |
"to the hangout" is offered (0x0041d1b0, below) |
+0x1bb0 |
the Quit screen offers two destinations |
+0x1bb4 / +0x1bb8 |
the Quit / Restart screen is open |
+0x1bc0 |
the player who paused (0 or 1) |
+0x1bd0 |
the Yes/No box (callback +0x4c4, owner +0x240, selection +0x4c0: 0 Yes, 1 No) |
+0x20ac |
START cool-down: set to 1 on close, counted down by HUD_Update each frame of play |
+0x20b0 |
save wanted on close (pushes the memory-card mode 6, 0x00155308) |
+0x20d0, +0x2430, +0x2790 |
three checklists (ChecklistMessageHUD.cpp): current, bonus and overview objectives |
+0x2af0-+0x2af8 |
three headers (pointers to 0x006340c0, 0x00634c70, 0x00634fe0) |
+0x2b00 |
the item grid (OptionGrid) |
+0x2dd0 |
the usage line (UsageInfo) |
+0x30a0 |
the Controls screen (ControlMenuHUD.cpp) |
+0x3a74 |
the selection inside an item's screen |
+0x3a78 / +0x3a7c |
the Options / Controls screen is open |
+0x3a90 |
the background sprite |
+0x3b90, +0x3b94 |
background fade-in start and length (3,000 ms) |
+0x3b98, +0x3b9c |
fade-out start, and the menu's alpha (255 open) |
+0x3ba4 |
when the menu opened (START closes it only 1,500 ms later) |
+0x3ba8, +0x3bac |
background colour cycle: start time and colour index 0-2 |
+0x3bb0, +0x3bb8 |
the Stats screen and whether it is available |
Layout (GUI coordinates)¶
Default video mode, GUI coordinates. Confirmed (code) at 0x001dbee0, 0x001db550,
0x001ddcf8 and the constants at 0x0050ede0-0x0050ee8c.
| Part | Where |
|---|---|
| background | sheet record 12 rectangle 5 (sprite word 0xc0005), centred at (0.5, 0.5), size 1.05 (0.9 when the device's slot +0xb8 is set), depth 7,000, white tinted by the colour cycle |
| three headers | the top one a CircledTextHeader (GUI: the pause header), the other two IconTextHeaders (0x001e77a0), at y 0.22, 0.46 and 0.68 (16:9: 0.18, 0.42, 0.64), x 0.5, box width 0.5; built with "Current Objectives" (0x108), "Bonus Objectives" (0x107) and "Overview" (0x106), their texts swapped per screen (the top one shows the mission's title on the grid, "OPTIONS" 0x116 on Options, "CONTROLS" 0x173 on Controls) |
| item grid | rows of 3 and 4 items (3 and 3 in level95, the hangout, and in Rumble levels), centred on x 0.5, first row at y 0.86, font scale 1.15, grey 0x005fd320, font slot 3, a " : " after every item but the last of a row |
| usage line | centred at (0.5, 0.97) |
| Yes/No box | the question at (0.26, 0.55), the answers at (0.6, 0.75) (0x0050ee10-0x0050ee1c) |
Runtime check (screen fractions turned into GUI units): the grid's rows at y 0.86 and 0.91, the usage line at 0.97, the quit question's left edge at x 0.26 and its "Yes/No" at (0.60, 0.75).
16:9 (device flags 0x04): the background becomes 1.4 wide and 1.1 high (0.9 high when flag 0x02 is also set)
and is drawn with anchor 2 (0x001a21e8). Confirmed (code) at 0x001ddcf8.
The items¶
The grid items (0x001dbee0), each with the code PauseMenu_SelectItem acts on. Texts are global strings
(GUI: strings); the names here are their English text:
| Code | Story level | Rumble level | Separator after it |
|---|---|---|---|
| 0 | Objectives (0xfa) |
Rules (0xfb) |
yes |
| 1 | Stats (0xf8) |
(none) | yes |
| 2 | Options (0xf7) |
Options | story: no (end of row 1); Rumble: yes |
| 3 | Controls (0xf9) |
Controls | story: yes; Rumble: no (end of row 1) |
| 4 | Restart (0xfe), not in level95 |
Replay (0xff) |
yes |
| 5 | Resume (0xfc) |
Resume | yes |
| 6 | Quit (0xfd) |
Quit | no |
A Rumble level's grid reads Rules : Options : Controls / Replay : Resume : Quit (PauseMenu_Open
0x001dc56c-0x001dc5a4, confirmed (code); confirmed (runtime) in the level102 War Party, 2026-10-21). The
first item is selected when the menu opens. Confirmed (code); the story order and look confirmed (runtime).
Behaviour¶
Every claim in this section is confirmed (code) at the address it cites unless its line says it is inferred or confirmed (runtime).
Pausing¶
When. Mode 1's update (Level loading) checks each player with a pad record (per-player
+0x1b set): START pressed (pad mask 0x800), or the game state's +0x11c set (the Options menu requested by
ShowOptionMenu, inferred); and the player panel's interface +0x8c returns 0, the human is not down
(0x00227dd8), and no level end is under way (W_GameState + 0x14c = 0, or an Armies of the Night level). Then it
stores the player in the menu's +0x1bc0 and calls PauseMenu_Toggle. Confirmed (code) at 0x00158728.
PauseMenu_Toggle (0x00154f28): does nothing while the cool-down +0x20ac is non-zero; if the top mode is not
0xa it pushes mode 0xa; otherwise it pops it and acts on the menu's result (Leaving). Confirmed (code).
Mode 0xa Enter (0x0015dbb8), confirmed (code):
- picks the menu (story or Armies of the Night) into the mode's
+0x24; - switches the task manager to phase 1 (the pause wheel, Tasks), so the game objects' updates stop;
- remembers the menu clock, pauses all sound (
SoundPauseSound's worker0x0010fb20, Sound) and setsW_GameState + 0x56e0= 1; - clears the vibration bytes of the pad records in use (
PauseMode_Enter0x0015dbb8loops over eight records at0x005dd810+ 0x50 × n, clearing+0x40and+0x41where+0x4cis non-zero); - opens the menu (vtable
+0xa8), saves the sound state into the mode (0x001115a8) and loads the sound bank"pause"(AudioManager_LoadBank0x0010fa50(sound, "pause", 0)).
Mode 0xa Update (0x0015dd98) runs the frame like mode 1 without the game: the tick, task-manager phase 1, the
cameras, the humans' skeleton marking and phase 1's managers (when 0x005e536c is 1), the world and resource managers,
the audio listener, the menu's Render then the overlays, the file manager, the HUD's paused update (0x001ae828) and
the menu's Update. It always returns "stay"; the menu pops the mode itself. Confirmed (code).
Mode 0xa Exit (0x0015dd38): closes the menu (vtable +0xb0), restores the sound state and resumes the sound
(0x0010fb68). Confirmed (code).
Opening the menu¶
PauseMenu_Open (0x001dbee0), confirmed (code):
- tints both views' screen effects (Graphics) to black over 1.4 s (
0x0018c988(1.4, manager, black),0x0050ee5c), so the game world darkens behind the menu; - takes the pausing player's input record, prepares the Stats screen for that player (
0x001e5618); - sets up the three headers and their checklists; the top header's text is the global string
0xe7(and0xe9and0x106for the other two), a string no front-end table sets (inferred: set per mission from Lua; runtime,level99: the circled "1" and "B", "Coney" and "New Blood"). The open first chooses between0xe8(the current checklist holds<ROBJ_N>,+0x3a80= 0) and0xe7(+0x3a80= 1) at0x001dc914, then sets0xe7unconditionally at0x001dc984-0x001dc994, so the choice survives only in+0x3a80; - builds the grid (The items) and focuses it;
- starts the background's fade-in (3,000 ms) and colour cycle, sets the menu alpha to 255;
- turns both radars off (
0x001b2658, after setting each radar's+0x04).
When the game state's +0x11c is set, it opens straight onto the Options screen (header "OPTIONS", 0x116).
The background colour cycle (PauseMenu_Update): three colours at 0x00635380 (stored by PauseMenu_StaticInit
0x001dfc80), in index order (150, 50, 50) red, (50, 150, 50) green and (50, 50, 150) blue
(0xff323296, 0xff329632, 0xff963232), each blended linearly to the next, blue back to red, over
5,000 ms (0x0050ee88), forever; the alpha
rises from 0 to 255 over the first 3,000 ms. Confirmed (code); the order confirmed (runtime, 2026-10-21: about 3.6 s
after START the background is mostly green (red blending into green) in level99 checkpoint 1 and in the level102
War Party alike, where blue would come first if the order ran the other way).
The top header¶
The header above the grid is the menu's one CircledTextHeader; its parts, text rules, drawing and layout per video
mode are on GUI: the pause header. What the pause menu feeds it (PauseMenu_Open,
0x001dbee0), confirmed (code):
- Text: the game state's mission title (
+0x134), or the Rumble mode's title in a Rumble level; the subtitle is the level's name. - Drawing: on the grid only the top header is drawn, through
RenderColouredin grey0x005fd320(80, 80, 80) with the menu's fade alpha (PauseMenu_Render,0x001df700); that colour reaches only the hidden label, so the circles keep their colours and the title and subtitle stay grey 178. - Circle colour: all three circles take the colour
PauseMenu_GetLevelColour(0x001db928) gives the current level's number (the level record's+0x04), from the table below, tested in order, the first list that holds the level deciding. The header then turns its last circle red. With gold the menu also asks for black letters, which the header draws anyway.
| Levels | Colour (RGB) |
|---|---|
| 92, 51, 31, 9, 55 | (37, 100, 60) green |
| 20, 11, 34, 54, 3 | (38, 61, 94) blue |
| 80, 82, 83, 93, 7, 87 | (76, 53, 44) brown |
| 99, 81, 86, 84, 2, 52, 5, 14 (the list also names 80 and 83, which the brown list catches first) | (186, 139, 53) gold |
| any other | (0, 0, 0) black |
Input¶
The grid (OptionGrid) passes every command to PauseMenu_OnCommand (0x001dee00) first.
Commands 0-5 are up, down, left, right, accept and back. Nothing is taken while closing (+0x1b7c, +0x1b80), and
while the Yes/No box is open every command goes to it (0x001ded68: up and down play cue 0xe, accept cue 8, left
and right move between Yes and No). Confirmed (code). Without an item's screen open:
- left / right / up / down move in the grid (the grid's own handling);
- accept (cross): cue 8, set
+0x1b88and runPauseMenu_SelectItemwith the selected code; - back (triangle): cue
0xf, then resume (+0x1b80= 1). Confirmed (runtime: triangle on the grid resumed the game).
With an item's screen open, back closes the screen (0x001de488) and returns to the grid; up and down move the
screen's selection +0x3a74 (cue 4, or 0xe at an end), and accept acts on it. START closes the menu from
anywhere once 1,500 ms (0x0050ee8c) have passed since it opened (+0x3ba4). Confirmed (code).
The items' screens¶
PauseMenu_SelectItem (0x001de6c0), confirmed (code); each confirmed (runtime) by a screenshot:
- Objectives (0): the three headers stacked, the selected one expanded to its list; up and down choose the header
(selection 0-2, starting at 0, or 2 in a Rumble level). An empty list shows "None" (
0x109,0x001dd0b8). The lists are the checklistsHUDSetObjectivefills (HUD: objectives). Usage line0x19(up/down select, triangle back). Selected header gold (current) or purple (bonus), the others grey. - Stats (1): only when the Stats screen is available (
+0x3bb8): the character's portrait, the name banner, four bars (Strength0xf3, Stamina0xf4, Health0xf5, Rage0xf6) and a description paragraph (The Stats screen). Otherwise nothing opens. - Options (2): opens the Options menu (
0x0062a1a0,OptionMenu.cpp) inside the pause menu, header "OPTIONS" (0x116). Runtime: Lighting, Camera, Audio, Video, Subtitles, Vibration, Restore Default. Pages, items and layout: The Options screen. - Controls (3): header "CONTROLS" (
0x173) and the Controls screen (ControlMenuHUD.cpp); runtime: two entries, Controller (a picture of the pad with each button's action) and Tutorial (a list of tips, the selected one red with its text under it). Layout: The Controls screen. - Restart (4): in a story level two choices, Restart Level (
0x112, described by0x113) and Restart Last Check Point (0x114,0x115), the second selected (runtime: "Restart Last Check Point" white with its description). Accept opens the Yes/No box with0x105("replay? all progress on this level lost") for the level or0x103(the checkpoint's question). In a Rumble level Replay asks0x105at once. - Resume (5): closes the menu.
- Quit (6): the Yes/No box with
0x102("quit? all progress on this level lost"). When the hangout can be offered (+0x1bac) it first shows two choices, To Hangout (0x111,0x10e) and Main Menu (0x10f,0x10d); with two players in a co-op game, Player 2 (0x10a, quit the second player) and All (0x10c); in a Rumble level, To Rumble Mode (0x110) and To Hangout or To Main Menu.
The Yes/No box (0x001d6738, 0x001d6910): the question, then "Yes" (0x3b) "/" "No" (0x3c), No selected
(confirmed (runtime)). Yes calls PauseMenu_OnConfirm with 2, No with 3, back with 4; No and back close the box
(vtable +0xcc, 0x001df5e8, clearing the quit and restart choices). Yes, story: Quit sets +0x1b70 and closes
(0x001db918); a restart closes (0x004e8718; the choice was set when the box opened); quitting the second player
runs 0x001df3a8 (the menu stays open). Yes, Rumble: 0x001df448, 0x001df4c8 or 0x001df4b0 set the Rumble quit
flags and close. Confirmed (code).
+0x1bac (0x0041d1b0) is set in 15 story levels (numbers 34, 2, 3, 5, 81, 86, 31, 14, 9, 51, 82, 92, 83, 20 and
11) and in any level the stats object (0x006fe998, 0x004241d8) marks; confirmed (code). That these are the
missions played after the hangout opens is inferred.
The Options screen¶
The Options menu (OptionMenu.cpp, object 0x0062a1a0) shows a list of seven page titles; accepting one replaces
the list with that page, whose items are edited in place. The names below are ours, each with its global string id
(GUI: strings); the values each item writes, and their defaults, are on
Profiles, options and saving. Layout and items confirmed (code) at OptionMenu_Open
(0x001d86a8), which writes the layout globals 0x0050ed30-0x0050edd0 on every open; values are GUI units in the
default video mode (device flags 0x01, Coordinates).
The title list. Seven titles, left-aligned (alignment 4) at x 0.26, y 0.30 + 0.055 × i (0x0050ed94,
0x0050ed98, 0x0050ed9c), in big_font (font slot 6) at size 1.3 (0x0050eda4); the selected title in
0x005fd310, the others in 0x005fd320 (OptionMenu_Render 0x001da880). The first is selected on open.
| i | Page (string) | Items, top to bottom |
|---|---|---|
| 0 | Lighting (0x117) |
the brightness bar |
| 1 | Camera (0x119) |
Invert P1 (0x11a), Invert P2 (0x11b), Auto Adjust P1 (0x11c), Auto Adjust P2 (0x11d), Split Screen Merge (0x11e, left out in level 102) |
| 2 | Audio (0x122) |
Music bar (0x129), SoundFX bar (0x12a), Pro Logic II (0x126) |
| 3 | Video (0x123) |
one choice, Normal (0x12d) / Wide (0x12e) |
| 4 | Subtitles (0x124) |
one choice |
| 5 | Vibration (0x11f) |
P1 Controller (0x120), P2 Controller (0x121) |
| 6 | Restore Default (0x128) |
one Yes (0x3b) / No (0x3c) question |
Items. Every item has a label (size 1.0, font slot 3, 0x005fd310 when selected and 0x005fd320 otherwise,
OptionPage_Render 0x001d62d8); the single-item pages and the brightness bar scale their label to 1.3
(OptionItem_SetLabelScale). Up and down move between a page's items (cue 4, 0xe at an end; the first item is
selected), left and right go to the item. The pages with several items show the page's name again as a heading
(OptionPage_SetDescription: size 1.0 × 1.3, font slot 3) at (0.26, 0.30) (0x0050edc4, 0x0050edc8):
Camera, Audio and Vibration.
- On/off choices (
YesNoBox, the answers0x12b/0x12cwith a "/" between, in font slot 4): the label at (x, y), the answers at (x + 0.4, y) (0x0050ed78), the first answer at the given point and each next one after the previous one's width. The chosen answer is drawn in0x005fd310, the other in0x005fd320. Left picks the first answer, right the second (cue 4,0xewhen it was already chosen) and calls the item's setter at once with the selection (0 first, 1 second;YesNoBox_OnCommand0x001d6c10); every setter turns its option on for selection 0. The answer first shown is the current value. Camera items: x 0.26, y 0.36 + 0.045 × i (0x0050ed84,0x0050eda0), their answers at x 0.66 (0.76 in German,0x0050edd0= 0.1); Vibration: the same rows from y 0.36 (0x0050ed88), answers at x 0.66. - Choices under their label (Subtitles, Video, Restore Default): label at (0.26, 0.30), answers at (0.26, 0.36)
(
+ 0x0050ed7c= 0.06; for Restore Default in German0x0050ed80= 0.11). Subtitles applies at once like the above. Video and Restore Default are in confirm mode (+0x4c8): left and right only move the choice, and accept calls the setter with 2 (first answer) or 3 (second). Video's first answer means Normal (video mode 0) and the second Wide (mode 1); its starting answer comes from the device (slot+0xd4, the widescreen state, inferred). Restore Default always starts on No (+0x4c0= 1). - Pro Logic II: an on/off choice at (0.26, 0.60) with answers at (0.66, 0.60) (
0x0050edcc). - Volume bars (
StatBarItem, Music then SoundFX): label at (0.26, 0.37) and (0.26, 0.455), bar at (0.26, 0.405) and (0.26, 0.49) (0x0050edac-0x0050edc0), width 0.54 (0x0050eda8). The bar is a sheet-12 rectangle-0 frame centred at bar x + 0.27, with a white fill over a (21, 21, 21) back bar, both 0.025 high (0x0050ed2c), drawn from bar + (-0.004, +0.004) (StatBarItem_Setup0x001d6ef8). Left and right step the value by 0.05 within 0-1 (cue 4,0xeat an end) and call the volume setter each step; the value starts at the game state's music (+0x57ac) or SoundFX (+0x57a8) volume. - The brightness bar (
LightingItem): label at (0.26, 0.29) (0x0050ed6c,0x0050ed70), bar at (0.26, 0.50) (0x0050ed74), width 0.54, value = brightness / 100 (the game state's byte+0x57a4, 0-100). Left and right step the bar by 0.05 and the brightness by 5 (0x0050ecfc), clamped 0-100 (OptionMenu_AddBrightness). Two squares 0.09 × 0.065 (sheet 12 rectangle 6) at (0.68, 0.38) and (0.74, 0.38) (0x0050ed48,0x0050ed4c, read byLightingItem_Update0x001d7d10), the first tinted by the brightness value, the second black; a hint (0x118) in0x005fd320, size 1.0, font slot 3, at the label + (0, 0.06) (0x0050ed3c,0x0050ed40).
Sounds. Front-end cues (Front end): 4 a move, 0xe a move refused, 8 an accept (a title
opened, a page closed), 0xf back. The pause menu plays none of its own while Options is open (PauseMenu_PlayCue
0x001ded00). While the Audio page is open the menu loops vags/music/wonderwheel_mono at the music volume so the
bars can be heard (OptionMenu_Update 0x001da658); turning a pad's vibration on gives a 500 ms rumble of strength
120 (0x0050ed50, 0x0050ed54).
Back. Back on a page returns to the title list (cue 0xf); on every page but Vibration and Restore Default it
first restores the values the page had when it was opened (OptionPage_Revert, each item's slot +0xa8, which
calls the setter again), so only accept keeps a change: accept on a page item closes the page and keeps every
value (OptionPage_OnCommand 0x001d5dc8). Back on the title list closes Options and returns to the pause grid.
Other video modes. OptionMenu_Open rewrites the globals for the device flags (*0x0050cdb4): with 16:9
(0x04, without 0x02 or 0x08) the titles, the page heading and the brightness label start at y 0.24, the Camera
and Vibration rows at 0.30, the squares are at y 0.34 and the volume rows at 0.31 / 0.345 / 0.395 / 0.43; with flag
0x08 (without 0x02) the titles start at 0.17 and step 0.075, the rows step 0.065 from 0.25 and the squares are
1.2 × as big, at y 0.34; with flag 0x02 without 0x04 the titles start at 0.32 and step 0.045, the rows step 0.04
from 0.37 (answers 0.12 further right) and the squares are 0.7 × as big. Confirmed (code); the meaning of flags 0x02
and 0x08 is not on Graphics.
The Controls screen¶
ControlMenuHUD (ControlMenuHUD.cpp) shows two entries, Controller (0x130) at (0.26, 0.29) and Tutorial
(0x131) 0.06 below, size 1.3 (0x001e4a30). Each page shows its title at (0.26, 0.29) (0x0050eee4,
0x0050eee8), size 1.3, 0x005fd310, font slot 4 (ControlPage_Init 0x001e3520). Confirmed (code).
Controller page (ControllerPage_Init 0x001e4130, _Update 0x001e46c0). The pad picture (sprite word
0x18f0000, depth 11,000) is centred at (0.5, 0.58) and sized 0.51 × 0.45 (0x0050f0e8, 0x0050f0e0,
0x0050f0e4, written by the init). Fourteen labels, each a markup text of size 1.0, colour 0x005fd310, font slot
3, placed from the table at 0x0050ef20 (fourteen {x, 0, y, 0} entries copied to 0x0063ed50): seven on the left
(strings 0x132-0x138) right-aligned (alignment 5) so they end at x 0.235, seven on the right
(0x139-0x13f) left-aligned (alignment 4) from x 0.765. Both columns use the same rows:
| Label (left, right) | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| y | 0.355 | 0.395 | 0.48 | 0.522 | 0.565 | 0.607 | 0.68 |
The rows are about 0.042 apart, except after row 1 (0.085) and row 5 (0.073): the table leaves a second line's room
under those two labels, so a label that wraps onto two lines with <CR> (such as the lock-on one) grows downward
from its first line and does not overlap the next. The rows are confirmed (code); which labels are two lines long
depends on the strings, and that the gaps are there for them is inferred. Label 1's x (0x0063ed60) changes by
language (W_GameState + 0x120): German 0.215, French 0.16. With device flag 0x02 without 0x04 the table at
0x0050f000 is used (left x 0.24, right x 0.76, rows 0.385, 0.415, 0.477, 0.51, 0.545, 0.575, 0.625; label 1 at x
0.22 for every language but English, then German 0.20 and French 0.16) and the picture is 0.51 × 0.34 at y 0.55;
with 0x02 and 0x04 the picture is at y 0.575; with 0x04 alone (not 0x08) it is 0.5 wide. Directions only play
cue 0xe; back plays 0xf and returns to the entries (0x001e4618).
Tutorial page (TutorialPage_Init 0x001e3828). A ScrollingMenu (GUI) at
(0.41, 0.35) (0x0050eef0, 0x0050eef4) of the 23 tips, in order: tip i has the title string 0x145 +
i and, as its description, the text 0x15c + i. Each title and text is a ScrollingTextWidget 0.3 wide centred
on that x (ScrollingTextWidget_Update 0x001e32a0 places the text at x − width / 2 + offset, the offset 0), so the
text starts at 0.26 (confirmed (runtime): in PCSX2 at level99 checkpoint 1 the first tip starts where the "Tutorial"
title does, at 0.286 of the frame with the font's own left margin; the memory at 0x0050eef0 reads 0.41, 0.35, 0.53),
font slot 3, size 1.0, wrapping at 0.53 (0x0050eef8; the first argument of ScrollingTextWidget_SetText is the wrap
width that MessageHUD_ReadAutoIndent stores). A title is drawn in 0x005fd320, and in (134, 26, 26) while
selected; the selected tip's text unfolds under it (the menu's description reveal: 550 ms delay, step 0.25 per
update, offset 0.01 below, 0x0050eefc). The menu shows 8 tips at once (0x0050ef00 and 0x0050ef10, both 8
in the default mode; 10 with 16:9, 9 with flag 0x02) and clips the list at 0.5 high (0x0050ef0c; 0.58 with
16:9), with an item spacing value of 0.01 (0x0050eeec, the items' +0x68; 0.007 with 16:9 or flag 0x02). Up and
down move with the menu's own input and cues; back plays 0xf and returns to the entries (0x001e3e60). Confirmed
(code).
The Stats screen¶
The Stats item shows the pausing player's Warrior: a portrait, a name banner, four bars and a description. The screen
is a GameMenu subclass at menu +0x3bb0 (function index), set up on every pause by
PauseStats_Setup (0x001e5618) and placed by PauseStats_Update (0x001e6778). Confirmed (code) unless marked.
Who and whether. The human is the pausing player's (game state +0x228 + 4 × the player). Its portrait kind
(Human_GetPortraitKind, 0x00229570, by character type) picks the pictures and the text; only kinds 0-8, the nine
Warriors below, have a screen. Any other kind (Ash, Lynx, the extra soldier, anyone else) makes it unavailable, and the
Stats item then opens nothing:
| Kind | Character types | Warrior | Portrait sprite word | Banner sprite word | Description string |
|---|---|---|---|---|---|
| 0 | 5, 7, 8, 9, 10 | Swan | 0x310000 |
0x1970000 |
0xf2 |
| 1 | 15, 17 | Cochise | 0x220000 |
0x1920000 |
0xec |
| 2 | 18, 20, 188 | Cowboy | 0x230000 |
0x1930000 |
0xed |
| 3 | 11, 13, 14 | Ajax | 0x1f0000 |
0x1900000 |
0xea |
| 4 | 30, 32 | Rembrandt | 0x2f0000 |
0x1950000 |
0xf0 |
| 5 | 21, 23, 24, 25 | Fox | 0x240000 |
0x1940000 |
0xee |
| 6 | 26, 28, 29, 191 | Vermin | 0x320000 |
0x1980000 |
0xef |
| 7 | 33, 35, 36, 37, 190 | Snow | 0x300000 |
0x1960000 |
0xf1 |
| 8 | 1, 3, 4, 189 | Cleon | 0x210000 |
0x1910000 |
0xeb |
The other kinds: 9 (types 38-40, Ash), 10 (43, 44), 11 (45-48, Lynx), 12 (any type without a crew slot) or 20 + the
human's slot byte +0x1b0. The Warrior names come from Characters.
Layout (default video mode, GUI coordinates; base B = (0.5, 0.5), 0x0050f110/0x0050f118; a size factor k =
1.0, 0x0050f104):
| Part | Where and how |
|---|---|
portrait (+0x7b0) |
left edge (anchor 1) at B + (−0.08, −0.2) = (0.42, 0.3), size 0.09 × k (0x0050f130), depth 15,000, tinted (150, 30, 30) (0x0063ee30) |
two shadows (+0x8b0, +0x9b0) |
the portrait's sprite in black at alpha 128, depth 11,000, offset (+0.0025, +0.004) and (−0.001, −0.002) (0x0050f2a8-0x0050f2b4) |
banner (+0xab0) |
centred at B + (−0.17, −0.099) = (0.33, 0.401), size 0.3 × k (0x0050f150), white, depth 11,000 |
four bars (HudGenericBar, +0xbb0 + 0x3f0 × i) |
left edge at B + (0.14, −0.11 + 0.05 i) = (0.64, 0.39 / 0.44 / 0.49 / 0.54), 0.22 × 0.025 (× k), fill (150, 30, 30) (0x0063ee38), back (37, 37, 37), sprite word 0x30036 (menu_system rectangle 54) |
| the bars' labels | left-aligned at x 0.38 (0x0050f2b8), y B + −0.08, −0.03, 0.02, 0.07 = 0.42, 0.47, 0.52, 0.57 (0x0050f178, 0x0050f1a8, 0x0050f1d8, 0x0050f208): Strength 0xf3, Stamina 0xf4, Health 0xf5, Rage 0xf6 |
description (+0x1b70) |
a markup text at B + (−0.24, 0.1) = (0.26, 0.6), size 1.0, grey 0x005fd310, font slot 3; then MessageHUD_ReadAutoIndent (0x001bb390) with 0.55 (pause.md's earlier "reveal 0.55 s"; meaning not traced) |
Other video modes: with device flag 0x04 alone (16:9) only B's y changes, to 0.45; flag 0x08 (not 0x02) and the
two 0x02 modes rewrite most offsets and set k = 0.7 (0x02 modes), values in 0x001e5618 not listed here.
The bars' values, each a fill from 0 to 1. d is the difficulty byte (game state +0x154) clamped to 2, and
t0-t9 the ten floats of the table at 0x0050f230 + 0x28 × d:
| d | t0 | t1 | t2 | t3 | t4 | t5 | t6-t9 (not read here) |
|---|---|---|---|---|---|---|---|
| 0 | 110 | 228 | 460 | 715 | 25 | 160 | 65, 123, 78, 150 |
| 1 | 75 | 192 | 260 | 600 | 25 | 160 | 45, 100, 78, 150 |
| 2 | 60 | 168 | 360 | 660 | 25 | 160 | 30, 53, 78, 150 |
- Strength = (
damage_scale− t0) / (t1 − t0), not clamped:damage_scaleis byte+0x06of the human's Warrior class record. - Stamina = (power maximum + stamina maximum − t2 + t4) / (t3 + t5 − t2 + t4), at most 1; the two maxima as the
game computes them for the human (
Human_GetMaxPower,Human_StaminaMax0x00223188, so the upgrades count, Unlockables). - Health = byte
+0x40of the human's power class record (thev40field) / 100, at most 1. This is the only reader of that byte found so far. - Rage = the human's rage maximum (
Human_GetRageMax) / 150, at most 1.
That t0-t1 bracket the nine Warriors' damage_scale per difficulty (easy's 150-190 give 0.34-0.68) suggests index 0 is
easy, 1 normal, 2 hard and above (inferred).
Input (PauseStats_OnCommand, 0x001e6698): up and down page the description (MessageHUD_PageUp /
_PageDown, cue 4, or 0xe when it cannot move), left and right only play 0xe, back plays 0xf and closes the
screen. The screen waits for its pictures (PauseStats_IsReady: both portrait batches resident, or 10 s) before it is
placed, and is drawn with the menu's fade alpha (PauseStats_SetAlpha).
Leaving¶
Closing (PauseMenu_FadeOut, 0x001ddbc0): once +0x1b80 is set the menu's alpha falls from 255 to 0 over
1,500 ms (0x0050ee80); 500 ms (0x0050ee84) after it reaches 0, +0x1b7c is set; when the last accept or back
sound has ended, PauseMenu_Update calls PauseMenu_Toggle, which pops mode 0xa. The screen effects keep their tint
until the mode is gone (the menu writes +0x214 of both managers, not traced). Runtime check: after triangle the
mode stack still held the pause mode at 1.5 s and was back to mode 1 at 3.5 s; the screen was black at 1.5 s.
Then PauseMenu_Toggle (0x00154f28), confirmed (code):
- if
+0x20b0(a save is wanted): push the memory-card mode (0x00155308, when the save system has a card and the level allows it); - set the cool-down
+0x20ac= 1 (START is ignored for one frame); - nothing chosen: back to play;
- Restart Level (
+0x1b74): checkpoint 1 (0x0041cef0(gs, 1), game state+0x33a), then reload the level by its record's name (0x00160d78(gs + 0x124):W_GameState + 0x14c= 3 and mode 8 loads it, Front end); - Restart Last Check Point (
+0x1b78): keep the current checkpoint (+0x33a) and reload the level the same way; - Quit (
+0x1b70): to the hangout (+0x1b94):W_GameState + 0x14c= 3 and LuarunNextMission(0)(Scripts); Rumble hangout or quick menu (+0x1b98): LuaPauseGoToRMIHangoutorPauseGoToRMIQuick(by0x001fe1a8); otherwise (main menu, or a story level without the choice): checkpoint 1 and load the level named"menu"(0x00160d78("menu")), the front end.
What a reload restores from SetCheckPoint is on Scripts.
The mission-failed screen¶
HUDLaunchMissionFailed(reason) (MissionFailed_Launch, 0x001d1f88) sets W_GameState + 0x118 = 2, stores the
reason (0x001d1fb8) and pushes mode 0xc (0x00155408), whose Enter (0x0015cae0) switches the task manager to
phase 1, saves the sound state (0x001115a8; that 0x00110548 and 0x0010fba8 stop it is inferred) and opens the
mission-failed menu. Confirmed (code). The engine's own failure (players out or busted) reaches the same menu after a 180-update
countdown (Combat).
The menu (MissionFailedMenu_Open, 0x001d23d0), confirmed (code):
- both views get screen effect 1 over 2 s (
0x0018d450(2.0, manager, 1), Graphics); - a title sprite of the sheet record
0x20b,0x20cor0x20dby language (W_GameState + 0x120: 10x20d, 20x20c, others0x20b; inferred: the "mission failed" picture), at (0.5, 0.38), size 0.4, grey 191, depth 11,000; - the reason in the markup text widget at (0.52, 0.49) (0.38 on the first frame), red
(170, 43, 43),big_font, or "Unknown Reason" (0xda) when none was given; - the grid at y 0.57: rows of 1 and 2, Last checkpoint (
0xd7), then Restart level (0xd8) : Quit (0xd9); inlevel95one row, To Hangout (0xdf) : Quit; - the usage line
0x1bat (0.5, 0.68); a Yes/No box for Quit (0x102), the question at (0.08, 0.75) and the answers at (0.44, 0.87), No selected.
What each item does goes through runNextMission(0) and the reload above (Scripts);
the items' actions are in MissionFailedMenu_OnCommand (0x001d2a10) and the Yes/No callback 0x001d2018
(The mission-failed menu).
Function index¶
Every function of the pause, options and controls menus, by source file in address order, with the name it has in Ghidra (ours); each is confirmed (code) at its address unless its row says otherwise. Rows link to the section that describes the behaviour where there is one. The files and ranges are from the Source map.
The Armies of the Night game-over screen¶
A GameMenu (vtable 0x0053b1b0, input 0x0053b188, object 0x00623040, colour 0x006239c0 = (150, 30, 30, 255))
in TutorialHUD.cpp's TU (inferred); HUDLaunchANGameOver and mode 0xd open it
(HUDLaunchANGameOver). Positions are GUI coordinates. Confirmed
(code):
- Countdown phase: the title (string
0xce, font slot 6, scale 2.0) at (0.5, 0.45), a digit counting 9 down to 0, one step per 1,000 ms (0x0050ec0c, scale 5.0) at (0.5, 0.6), the usage line0xd6at (0.5, 0.8). Start (0x800) from either player (player 2's pad record is locked at open) plays cue 8; with credits left (0x00619910) it spends one, sets close, calls the Lua functionF1.Timeand, while credits remain, shows both panels' join message;+0x7ac/+0x7b0record which players continue (alive ones). With no credit, or when the count ends, both sound channels fade (0x0018d450(2.0, ...)) and the end phase starts. - End phase: the text
0xcf(scale 3.0) at (0.5, 0.5), a grid of0xdb:0xdcat (0.5, 0.57), the usage line0x1cat (0.5, 0.62), fading in over 2,000 ms (0x0050ec28); then accept takes item 0 (+0x7a4) or 1 (+0x7a8). - It closes (
ANGameOver_Toggle) once the close flag is set and the last sound has ended.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001cede8 |
HUD_LaunchANGameOver |
calls ANGameOver_Toggle |
confirmed (code) |
0x001cee08 / 0x001cee58 |
ANGameOver_Construct / _Destroy |
the base plus the digit (+0x7c0) and title (+0x890) TextWidgets |
confirmed (code) |
0x001ceec0, 0x001ceef0 |
ANGameOver_Init, _Shutdown |
slots +0x90, +0x68: the base's |
confirmed (code) |
0x001cef10 |
ANGameOver_Open |
slot +0xa8: patches its layout per video mode, then builds the parts above, count 9 |
confirmed (code) |
0x001cf358 |
ANGameOver_Close |
slot +0xb0: the base's close, releases the texts, unlocks player 2's record |
confirmed (code) |
0x001cf3a8 |
ANGameOver_OnCommand |
the input handler: accept after the fade, cue 8, item 0 or 1, close; calls 0x004229c0 on the stats object (0x006fe490) |
confirmed (code) |
0x001cf468 |
ANGameOver_Update |
slot +0x30: Start, credits, countdown, phases |
confirmed (code) |
0x001cfc78 |
ANGameOver_Render |
slot +0x38: the phase's parts; the end fade |
confirmed (code) |
0x001cfe50, 0x001cfea0 |
ANGameOver_StaticInit, _GlobalCtor |
builds the object and its colour; the GCC constructor stub (list entry 0x00534114) |
confirmed (code) |
The Armies of the Night pause menu¶
A PauseMenu subclass (vtable 0x0053b298, input 0x0053b270, object 0x006239d0, colour 0x006294b0 = (170, 20,
20, 255)), in its own TU (stub 0x001d0a88; inferred), used in levels 60-69. Confirmed (code):
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001cfec0 |
ANPauseMenu_OnConfirm |
the Yes/No callback: 2 (yes) calls the menu's slot +0xb8, 3 or 4 its slot +0xc8 (targets 0x004e8248 / 0x004e8260, not analysed) |
confirmed (code) |
0x001cff48 / 0x001cff98 |
ANPauseMenu_Construct / _Destroy |
the base plus a title TextWidget (+0x5930) and a grid (+0x5a00) |
confirmed (code) |
0x001d0010 |
ANPauseMenu_Open |
slot +0xa8: the pausing player's input record; title 0xd0 (font slot 6, scale 2.95) at (0.5, 0.46); usage 0x1c at (0.5, 0.58); a grid 0xd1 : 0xd2 (scale 1.15) at (0.5, 0.535); a Yes/No box, question 0x102, answers 0x3b / 0x3c, at (0.28, 0.65) and (0.73, 1.45), callback 0x001cfec0 |
confirmed (code) |
0x001d0448 |
ANPauseMenu_Close |
slot +0xb0: releases the title, grid and box |
confirmed (code) |
0x001d0480 |
ANPauseMenu_OnCommand |
accept: item 0 closes (resume), item 1 opens the Yes/No box and calls 0x004229c0 on the stats object; back closes; while the box is open, input goes to 0x001ded68 |
confirmed (code) |
0x001d0548 |
ANPauseMenu_Update |
slot +0x30: Start closes; places the parts; the selected item's alpha falls and rises over 2 × 1,000 ms (0x0050ec5c); closes through PauseMenu_Toggle once the last sound ends |
confirmed (code) |
0x001d09d8 |
ANPauseMenu_Render |
slot +0x38: title, grid, usage, and the box when open |
confirmed (code) |
0x001d0a38, 0x001d0a88 |
ANPauseMenu_StaticInit, _GlobalCtor |
builds the object and its colour; the constructor stub (list entry 0x00534118) |
confirmed (code) |
The GameMenu base (no path string)¶
0x001d1848-0x001d1d28, in the TU that ends at the stub 0x001d2de0 (with CircledText and the mission-failed
menu). The base of the story pause menu, the mission-failed and Armies of the Night game-over screens, the Options and
Controls menus and the Rumble result screen (vtable 0x0053b4b0, input interface 0x0053b488 at +0x5c). Fields:
+0x40 the locked pad record, +0x60 close requested, +0x64 input accepted (set when the fade-in ends), +0x70
background (BaseWidget), +0x170 title (markup text), +0x360 grid (OptionGrid), +0x430 usage line
(UsageInfo), +0x700 fade start, +0x704 open time, +0x708 fading, +0x70c title text, +0x78c the last
sound. Confirmed (code).
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001d1848 / 0x001d18d8 |
GameMenu_Construct / _Destroy |
the parts above; sound handle -1; slot +0x60 |
confirmed (code) |
0x001d1958 |
GameMenu_Init |
slot +0x90: sets up the title text (size 1.0, grey 128) |
confirmed (code) |
0x001d19a8 |
GameMenu_Shutdown |
slot +0x68: slot +0x98, clears the title |
confirmed (code) |
0x001d19e8 |
GameMenu_ReleaseSprites |
slot +0x98, shared by every subclass: releases the background and the grid |
confirmed (code) |
0x001d1a18 |
GameMenu_SetTitle |
slot +0xa0: copies the text to +0x70c and shows it; nil clears |
confirmed (code) |
0x001d1aa0 |
GameMenu_Open |
slot +0xa8: hides the HUD for a menu and both radars, ends both players' rage mode (Human_EndRageMode), locks player 1's pad record (+0x1b = 0, +0x1e = 1), stamps the open and fade times, clears +0x10, +0x60, +0x64 |
confirmed (code) |
0x001d1c48 |
GameMenu_Close |
slot +0xb0: slot +0x98, both sound channels back (0x0018d450(0, channel)), unlocks the pad record |
confirmed (code) |
0x001d1cd8 / 0x001d1d08 |
GameMenu_IsBackgroundLoaded / _IsSoundDone |
the background's batch is resident; the last sound has ended | confirmed (code) |
0x001d1d28 |
GameMenu_Render |
slot +0x38: from 1,000 ms after opening (0x0050ec7c) fades background, title, grid and usage in over 3,000 ms (0x0050ec78); at the end plays the sound named at 0x00555c88, sets +0x64 and hides the 19 widgets at HUD +0x137e0 (not identified) |
confirmed (code) |
The mission-failed menu¶
A GameMenu (vtable 0x0053b598, input 0x0053b570, object 0x006294c0, pointer 0x0050ec8c;
The mission-failed screen). Fields: +0x7a0 quit, +0x7a4 restart, +0x7a8 last
checkpoint, +0x7ac to the hangout chosen; +0x7b0 the HUDSetMissionFailedCallbacks name (31 bytes); +0x7d0 the
level95 layout; +0x7e0 the Yes/No box (question text +0x830); +0xcb0 the box is open. Confirmed (code).
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001d1f88 |
MissionFailed_Launch |
The mission-failed screen | confirmed (code) |
0x001d1fb8 |
MissionFailed_SetReason |
the reason through the menu's SetTitle (slot +0xa0) |
confirmed (code) |
0x001d1ff0, 0x001d2398 |
MissionFailed_SetCallbacks, MissionFailedMenu_SetCallbacks |
HUDSetMissionFailedCallbacks: copy the name (nil clears) |
confirmed (code) |
0x001d2018 |
MissionFailedMenu_OnConfirm |
the Yes/No callback: 2 (yes) closes the menu with the choice; 3 or 4 close the box and clear the four choices | confirmed (code) |
0x001d2070 / 0x001d20c8 |
MissionFailedMenu_Construct / _Destroy |
the base plus the Yes/No box | confirmed (code) |
0x001d2128 |
MissionFailedMenu_Init |
slot +0x90: per video mode and for languages 1 and 2 (W_GameState + 0x120) patches the layout globals 0x0050ec94-0x0050ecb4; the base's init |
confirmed (code) |
0x001d2368 |
MissionFailedMenu_Shutdown |
slot +0x68 |
confirmed (code) |
0x001d23d0 |
MissionFailedMenu_Open |
slot +0xa8 (above) |
confirmed (code) |
0x001d2970 |
MissionFailedMenu_YesNoInput |
while the box is open: up/down cue 0xe, accept cue 8, then YesNoBox_OnCommand |
confirmed (code) |
0x001d2a10 |
MissionFailedMenu_OnCommand |
accept (cue 8): item 0 closes with "last checkpoint" (+0x7a8) or, in level95, "to the hangout" (+0x7ac); item 1 asks "restart?" (string 0x105, +0x7a4), or in level95 "quit?"; item 2 asks "quit?" (0x102, +0x7a0); the box opens with No selected |
confirmed (code) |
0x001d2b90 |
MissionFailedMenu_Update |
slot +0x30: waits until the background, usage line and grid are ready, then places the picture, reason, grid, usage and box; closes through MissionFailed_Toggle once the sound ends |
confirmed (code) |
0x001d2d68 |
MissionFailedMenu_Render |
slot +0x38: the base's render, plus the box when open |
confirmed (code) |
0x001d2db0, 0x001d2de0 |
MissionFailedMenu_StaticInit, _GlobalCtor |
builds the object; the constructor stub (list entry 0x0053411c) |
confirmed (code) |
GUI/OptionMenu.cpp¶
The functions run from 0x001d5808 to 0x001dab30 (inferred: the Source map gives the file
0x001d5900-0x001dab10; the range here is widened to the neighbouring unnamed functions): the pause menu's Options
screen. OptionMenu (vtable 0x0053b9a8, input 0x0053b980 at
+0x5c, object 0x0062a1a0, pointer 0x0050ecec) owns 7 page titles (+0x7a0 step 0x1f0) and 7 OptionPages (+0x1530
step 0x6f0: count +0, selection +4, index +8, 5 item pointers +0x0c, description +0x20, confirm box +0x220, box open
+0x210, changed +0x214). Items: OptionItem base (vtable 0x0053bcd0), OptionItemOnOffType = YesNoBox
(0x0053bc08, 0x4d0), OptionItemStatBarType = StatBarItem (0x0053bb38, 0x640), OptionItemLightingType =
LightingItem (0x0053ba68, 0xa40). The option values and their defaults: save.md.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001d5808 |
OptionPage_OnDiscardConfirm |
Page confirm-box callback: 2 reverts the page, 3/4 close the box. No code in the file opens that box (string 0x12f). | inferred |
0x001d5870, 0x001d58a8 |
OptionPage_Construct, OptionPage_Destroy |
Description markup +0x20, confirm box +0x220. | confirmed (code) |
0x001d5900 |
OptionPage_Init |
Clears count, selection and 5 slots, index +8; per-mode box layout 0x0050ed18-0x0050ed24; box string 0x12f with Yes 0x3b / No 0x3c. |
confirmed (code) |
0x001d5b30, 0x001d5bc8 |
OptionPage_Shutdown, OptionPage_AddItem |
Frees the 5 items, description and box; adds to the first free of 5 slots. | confirmed (code) |
0x001d5c38 |
OptionPage_SetDescription |
Description markup (size 1.0, 0x005fd310, font slot 3, scale 1.3) at a position. |
confirmed (code) |
0x001d5cf0 |
OptionPage_OnConfirmBoxCommand |
Routes a command to the confirm box (up/down cue 0xe, accept cue 8). | confirmed (code) |
0x001d5dc8 |
OptionPage_OnCommand |
Up/down move +4 (cue 4, 0xe at an end); left/right to the item (2/3); accept: item command 4, cue 8, close; back cue 0xf: Vibration (5) stops the preview, Restore Default (6) closes, others revert first. Returns 0 to close. | confirmed (code) |
0x001d6060, 0x001d60e8, 0x001d6160 |
OptionPage_IsLoaded, OptionPage_BeginEdit, OptionPage_Revert |
Every item's slot +0x98 (loaded), +0xa0 (remember value), +0xa8 (restore and apply). | confirmed (code) |
0x001d61d8, 0x001d62d8 |
OptionPage_Update, OptionPage_Render |
Items, description, box when open; selected item 0x005fd310, others 0x005fd320 via slot +0x78. |
confirmed (code) |
0x001d63f0, 0x001d6430, 0x001d64b0 |
OptionItem_Construct, _Destroy, _Setup |
Label markup +0x50; setup (slot +0x90) stores metrics +0x40 and the label (size 1.0, 0x005fd310, slot 3), +0x240 = 2. |
confirmed (code) |
0x001d6570, 0x001d6590, 0x001d65c8 |
OptionItem_SetPosition, _SetLabelScale, _Update |
Moves the label; label font size from a scale; updates the label. | confirmed (code) |
0x001d65e8, 0x001d6620 |
OptionItem_Render, OptionItem_RenderColoured |
Label in 0x005fd310, or in a given colour (slot +0x78). |
confirmed (code) |
0x001d6480 |
YesNoBox_SetLabelFlag |
Label fields +0x1d8 and +0x208 = flag, then re-lays the label; every caller passes 1. | inferred |
0x001d6670, 0x001d66d0 |
YesNoBox_Construct, YesNoBox_Destroy |
Answer texts +0x250, +0x320 and the "/" +0x3f0; selection +0x4c0. | confirmed (code) |
0x001d6738 |
YesNoBox_Setup |
Label, answers 299/300, callback +0x4c4, owner +0x240, confirm mode +0x4c8. | confirmed (code) |
0x001d6908, 0x001d6910, 0x001d6960, 0x001d6980 |
YesNoBox_Shutdown, _SetAnswers, _SetPosition, _SetAnswersPosition |
Empty shutdown; replace the answers; move the label; lay out answer, "/", answer by width. | confirmed (code) |
0x001d6a50, 0x001d6a60 |
YesNoBox_SaveSelection, YesNoBox_RevertSelection |
Slot +0xa0 saves the selection at +0x4cc (was undefined, created); slot +0xa8 restores it and calls the callback. | confirmed (code) |
0x001d6a90, 0x001d6ad0, 0x001d6b00 |
YesNoBox_Update, _Render, _RenderColoured |
Chosen answer 0x005fd310, the other 0x005fd320. |
confirmed (code) |
0x001d6c10 |
YesNoBox_OnCommand |
Left 0, right 1 (cue 4, 0xe if unchanged; page changed); immediate callback unless confirm mode; accept in confirm mode calls back 2 or 3, back 4. | confirmed (code) |
0x001d6df8, 0x001d6e80, 0x001d7218 |
StatBarItem_Construct, _Destroy, _Shutdown |
Fill bar +0x250, back bar +0x2c0, three widgets; value +0x630 = 0.5. | confirmed (code) |
0x001d6ef8 |
StatBarItem_Setup |
Slot +0xc0: sheet-12 rect-0 sprite (0xc0000), white fill and (21,21,21) back bar of height 0.025 (0x0050ed2c), sprite 0x30036, value clamped 0-1, callback +0x638. |
confirmed (code) |
0x001d7238, 0x001d7248 |
StatBarItem_SaveValue, StatBarItem_RevertValue |
+0x634 = value; restore and call back. | confirmed (code) |
0x001d7270 |
StatBarItem_Update |
First update offsets the bars by 0.003 / -0.004 (0x0050ed38, 0x0050ed34), back bar 0.04 (0x0050ed30) higher. |
confirmed (code) |
0x001d7350, 0x001d73b0, 0x001d7420 |
StatBarItem_Render, _RenderColoured, _IsLoaded |
Label, back then fill bar; tinted fill; bar and sprite batches resident. | confirmed (code) |
0x001d7490 |
StatBarItem_OnCommand |
±0.05 clamped 0-1 (cue 4, 0xe at an end), page changed, callback(value). | confirmed (code) |
0x001d7648, 0x001d7698, 0x001d7c70 |
LightingItem_Construct, _Destroy, _Shutdown |
A StatBarItem plus two square widgets and a hint markup. | confirmed (code) |
0x001d7700 |
LightingItem_OnCommand |
Bar ±0.05 and callback ±5 (0x0050ecfc) into OptionMenu_AddBrightness. |
confirmed (code) |
0x001d7958 |
LightingItem_Setup |
Bar at level/100 (0x0050ecf8, 0x0050ed00); two sheet-12 rect-6 squares (0xc0006, 0.09 × 0.065 × 0x0050ed44), the second black; hint string 0x118 in grey. |
confirmed (code) |
0x001d7cb0, 0x001d7ce0 |
LightingItem_SaveValue, LightingItem_RevertValue |
Saves Gamma_Get() at +0x644; restores with Gamma_Set. |
confirmed (code) |
0x001d7d10, 0x001d7de8, 0x001d7e28, 0x001d7e98 |
LightingItem_Update, _Render, _RenderColoured, _IsLoaded |
Level from W_GameState +0x57a4; bar, squares (first tinted when coloured), hint. | confirmed (code) |
0x001d7ef0 |
OptionMenu_OnVibrationChoice |
Dirty 0x00630840 = 1; on gives a preview rumble of strength 120 (0x0050ed50) for 500 ms (0x0050ed54). |
confirmed (code) |
0x001d7f90, 0x001d7ff0, 0x001d8050 |
OptionMenu_OnInvertChoice, _OnAutoAdjustChoice, _OnMergeChoice |
Set invert / auto-adjust per pad and merge to choice == 0; mark dirty. | confirmed (code) |
0x001d80a8, 0x001d8208 |
OptionMenu_OnSubtitlesChoice, OptionMenu_OnProLogicChoice |
W_GameState +0x438 / sound manager +0x3faa8 = choice == 0; both were undefined code, created. | confirmed (code) |
0x001d80e0 |
OptionMenu_OnRestoreDefaults |
Yes: brightness 40, volumes 0.9, invert off, auto-adjust on, merge on, vibration on, +0x454 = 0, subtitles and Pro Logic off, reopen flag 0x0050ed14. |
confirmed (code) |
0x001d8258 |
OptionMenu_OnVideoChoice |
2/3 select video mode 0/1 (0x00194e28), close and reopen pause and options menus, return to Options, re-lay the lock-pick dials. |
confirmed (code) |
0x001d83e0, 0x001d8410, 0x001d8440 |
OptionMenu_SetSoundFxVolume, _SetMusicVolume, _AddBrightness |
Volume setters (dirty); brightness + delta clamped 0-100. | confirmed (code) |
0x001d84a0, 0x001d8558, 0x001d8658 |
OptionMenu_Construct, _Destroy, _Shutdown |
GameMenu base, 7 titles, 7 pages, music handle +0x45d4 = -1. | confirmed (code) |
0x001d8620, 0x001d86a0 |
OptionMenu_ApplyVolumes, OptionMenu_NoOp |
Slot +0x90 applies music (+0x57ac) and SoundFX (+0x57a8); slot +0x98 empty (created). | confirmed (code) |
0x001d86a8 |
OptionMenu_Open |
Slot +0xa8: titles 0x117, 0x119, 0x122, 0x123, 0x124, 0x11f, 0x128 (font slot 6, scale 1.3) and every page's items; Merge omitted on level 102; Restore Default preselects No. | confirmed (code) |
0x001da348 |
OptionMenu_Close |
Slot +0xb0: shuts pages and titles, stops the preview music. | confirmed (code) |
0x001da3f8 |
OptionMenu_OnCommand |
Page open: to the page; else up/down titles 0-6 (cue 4/0xe), accept opens (BeginEdit, cue 8), back cue 0xf and +0x45d0 = 1. | confirmed (code) |
0x001da658 |
OptionMenu_Update |
Waits for load; ends the vibration preview; reopens after Restore Default; loops vags/music/wonderwheel_mono at music volume while Audio is open. |
confirmed (code) |
0x001da880 |
OptionMenu_Render |
Titles (selected 0x005fd310, others 0x005fd320) or the open page. |
confirmed (code) |
0x001da9b8, 0x001da9d0, 0x001daa38, 0x001daa50 |
OptionMenu_CloseConfirmBox, _RevertPage, _SetPageChanged, _IsLoaded |
Current page's box closed, items reverted (+0x218 = 1), changed flag +0x214; all pages loaded. | confirmed (code) |
0x001daaa8, 0x001dab10 |
OptionMenu_StaticInit, OptionMenu_StaticInitStub |
Construct the menu at 0x0062a1a0 (constructor list 0x00534124); end of the TU. |
confirmed (code) |
After GUI/OptionMenu.cpp (no path string): the pause menu¶
0x001dab30-0x001dfe20: PauseMenu (vtable 0x0053bdc0, input 0x0053bd98, object 0x0062e790, pointer
0x0050eddc) and the objective checklists it holds; the objective calls are described in
hud.md.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001dab30 |
Objective_GetIconPrefix |
Maps an objective's leading tag (<ROBJ_N>, <YOBJ_N>, <BOBJ_N>, <ARREST_N>, <DEAD_N>, <FLASH_N>, <SPRAY_N>, <PEDRAT_N>, <CALLGANG_N>, <NICON>) to its icon prefix; dots use colour tags 3, 4, 6. |
confirmed (code) |
0x001dad88, 0x001db248 |
HUD_SetObjective, HUD_RemoveAllGoalText |
Add/remove/tick an objective in the checklists; clear the current-objectives list. | confirmed (code) |
0x001db278 |
PauseMenu_OnConfirm |
Yes/No box callback: 2 Yes, 3 No, 4 back. | confirmed (code) |
0x001db3c0 |
PauseMenu_Construct |
Yes/No box +0x1bd0, three checklists +0x20d0 step 0x360, grid +0x2b00, usage +0x2dd0, Controls +0x30a0, background +0x3a90, Stats +0x3bb0. | confirmed (code) |
0x001db4b0 |
PauseMenu_ResetState |
Zeroes the stats block (+0xa40, 0x1130 bytes) and choice flags; screen selection +0x3a74 = 3. | confirmed (code) |
0x001db550 |
PauseMenu_Init |
Slot +0x90: headers (0x006340c0, 0x00634c70, 0x00634fe0), checklists, Quit box (0x102, confirm mode). |
confirmed (code) |
0x001db7e8, 0x001db870 |
PauseMenu_Shutdown, PauseMenu_ReleaseScreens |
Slot +0x68 checklists, background, usage, box; slot +0x98 headers, usage, background. | confirmed (code) |
0x001db8e8 |
ArrayU32_Contains |
Linear search of a word array. | confirmed (code) |
0x001db918 |
PauseMenu_Quit |
Slot +0xb8: quit chosen +0x1b70 and closing +0x1b80. | confirmed (code) |
0x001db928 |
PauseMenu_GetLevelColour |
Top header colour by level number: (37,100,60), (38,61,94), (76,53,44) or (186,139,53) groups, else black; it only tests the lists (PauseMenu_Open asks for the black letters with CircledTextHeader_SetLetterColour 0x001e8658 at 0x001dc1ec). |
confirmed (code) |
0x001dbb78 |
PauseMenu_ApplyVideoMode |
Layout globals 0x0050edfc-0x0050ee6c and 0x00635350-0x00635364 per device flags. |
confirmed (code) |
0x001dbee0, 0x001dcb20 |
PauseMenu_Open, PauseMenu_Close |
Slots +0xa8 / +0xb0 (see the opening and leaving sections); close issues pending war commands and clears the screen tint byte +0x214. | confirmed (code) |
0x001dcac0 |
PauseMenu_ReturnToOptions |
Screen and Options open (+0x1b88, +0x3a78); grid moved right twice (once in Rumble). | confirmed (code) |
0x001dcc00, 0x001dd1d0 |
PauseMenu_ClearChecklist, PauseMenu_CountOpenObjectives |
Clear one list; count its open lines. | confirmed (code) |
0x001dcc28, 0x001dce80 |
PauseMenu_AnnounceCurrentObjective, PauseMenu_AnnounceBonusObjective |
Story levels: first open objective as a scroll-in with its tag's icon (default 0x1c / 0x16), cue 0x15. | confirmed (code) |
0x001dd0b8, 0x001dd178, 0x001dd1a0 |
PauseMenu_AddObjective, _RemoveObjective, _MarkObjectiveDone |
List 2 cleared before adding; lists 0/1 drop their "None" (0x109) line. | confirmed (code) |
0x001dd1f8, 0x001dd258 |
Widget_ReapplyRect, Widget_GrowRectHeight |
Re-set a widget's rectangle; grow its height (min 0). | confirmed (code) |
0x001dd2e0, 0x001dd3d8 |
PauseMenu_SlideChecklistY, PauseMenu_SlideHeaderY |
Move toward a target y by 0.02 (0x0050ee20). |
confirmed (code) |
0x001dd4d0 |
PauseMenu_AnimateObjectives |
Every 2 ms (0x0050ee7c): headers 0.02, list reveal 0.01 (0x0050ee24), gaps 0.05 (0x0050ee74, 0x0050ee78). |
confirmed (code) |
0x001ddbc0, 0x001ddcf8, 0x001df700 |
PauseMenu_FadeOut, PauseMenu_Update, PauseMenu_Render |
Fade, update (slot +0x30) and render (slot +0x38); see the sections above. | confirmed (code) |
0x001de488 |
PauseMenu_CloseScreen |
Closes the open screen (Options once its back flag +0x45d0 is set) and restores the headers. | confirmed (code) |
0x001de6c0, 0x001dee00, 0x001ded68 |
PauseMenu_SelectItem, PauseMenu_OnCommand, PauseMenu_OnYesNoCommand |
Accept on a grid item; grid owner handler; Yes/No routing (cue 0xe/8). | confirmed (code) |
0x001ded00, 0x001ded48 |
PauseMenu_PlayCue, PauseMenu_GetSelectedItem |
Cue unless Options is open (+0x2bc4 when a screen is); grid selection. | confirmed (code) |
0x001df3a8, 0x001df448, 0x001df4b0, 0x001df4c8 |
PauseMenu_QuitPlayerTwo, _QuitToRumbleQuick, _QuitToMainMenu, _QuitToHangout |
Slots +0xd0, +0xd8 (+0x1b98), +0xe8 (+0x1b9c), +0xe0 (+0x1b94). | confirmed (code) |
0x001df4e0 |
PauseMenu_IsReady |
10 s after opening, or headers and background ready (player not raging). | confirmed (code) |
0x001df5e8, 0x001df6d0 |
PauseMenu_CancelChoice, PauseMenu_ApplyFadeAlpha |
Slot +0xc8 clears quit/restart choice; colour with menu alpha +0x3b9c while closing. | confirmed (code) |
0x001dfc08, 0x001dfc40 |
PauseMenu_ResetStatSlots, PauseMenu_ClearObjectives |
100 records (+0xa44 step 0x2c) = -1; clears lists 2, 0, 1 on level load (0x0015fe90). |
confirmed (code) |
0x001dfc80, 0x001dfe00 |
PauseMenu_StaticInit, PauseMenu_StaticInitStub |
Headers 0x108/0x107/0x106, colour cycle 0x00635368-0x00635388; list 0x00534128. |
confirmed (code) |
After the pause menu (no path string): Rumble result screen¶
0x001dfe20-0x001e09e8: RumbleResult (vtable 0x0053bee0, input 0x0053beb8, object 0x00635390, pointer
0x0050ee94); behaviour in rumble.md.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001dfe20, 0x001dfe88 |
RumbleResult_Launch, RumbleResult_SetReason |
Pushes mode 0x14, sets winner (slot +0xa0) and the reason text (+0xa70). | confirmed (code) |
0x001dfef0, 0x001dff40, 0x001dffa8, 0x001dffd8 |
RumbleResult_Construct, _Destroy, _Init, _Shutdown |
Second grid +0x7b0, markup +0x880; init sets +0x04 = 1. | confirmed (code) |
0x001e0008, 0x001e0430 |
RumbleResult_Open, RumbleResult_Close |
Slots +0xa8 / +0xb0; open applies a screen effect and hides lock-pick dials. | confirmed (code) |
0x001e0460, 0x001e0560, 0x001e0778 |
RumbleResult_OnCommand, _Update, _Render |
Input, update (+0x30), render (+0x38; choices after 0x0050eec0, fade 0x0050eeb8). |
confirmed (code) |
0x001e0998, 0x001e09c8 |
RumbleResult_StaticInit, RumbleResult_StaticInitStub |
Constructs 0x00635390; list 0x0053412c. |
confirmed (code) |
GUI/ControlMenuHUD.cpp¶
The functions run from 0x001e3458 to 0x001e5478 (inferred: the Source map gives the file
0x001e3520-0x001e5478): the pause menu's Controls screen, two entries opening the controller picture page or the
tutorial tips page. Both pages derive from a small ControlPage base and are static objects built at start-up.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001e3458, 0x001e34c0 |
ControlPage_Construct, _Destroy |
vtable 0x0053c658, interface 0x0053c630; title TextWidget +0x60, alpha +0x130 |
confirmed (code) |
0x001e3520 |
ControlPage_Init |
slot +0x90: title at (0x0050eee4, 0x0050eee8), size 1.3, 0x005fd310, font slot 4 |
confirmed (code) |
0x001e35d8, 0x001e35f8, 0x001e3670 |
ControlPage_Shutdown, _Update, _Render |
slots +0x68/+0x30/+0x38: the title, with alpha |
confirmed (code) |
0x001e36a8, 0x001e3758 |
TutorialPage_Construct, _Destroy |
vtable 0x0053c588, interface 0x0053c560, object 0x00637be0; 23 titles +0x150, 23 texts +0x3960 (0x270 each), menu +0x140 |
confirmed (code) |
0x001e3828 |
TutorialPage_Init |
ScrollingMenu at (0x0050eef0, 0x0050eef4); tip i = title string 0x145+i (focus colour (134,26,26)) with text 0x15c+i as description; visible 0x0050ef00 = 8 (10 with 16:9, 9 with device flag 0x02), clip height 0x0050ef0c = 0.5; title 0x131 (layout) |
confirmed (code) |
0x001e3d98 |
TutorialPage_Shutdown |
frees the menu, shuts the texts down | confirmed (code) |
0x001e3e60 |
TutorialPage_OnCommand |
forwards to the menu; back: cue 0xf, returns true |
confirmed (code) |
0x001e3ed0, 0x001e3f38 |
TutorialPage_Update, _Render |
title and menu | confirmed (code) |
0x001e3f98, 0x001e4050 |
ControllerPage_Construct, _Destroy |
vtable 0x0053c4b8, interface 0x0053c490, object 0x00635e80; 7 + 7 labels +0x140/+0xed0, picture +0x1c60 |
confirmed (code) |
0x001e4130 |
ControllerPage_Init |
label table 0x0050ef20 (0x0050f000 in mode 0x02 without 0x04) copied to 0x0063ed50; label 1's x moved by the language (game state +0x120: German -0.02, French 0.16; 0.22 in the other table for any language but English); picture sprite 0x18f0000 at (0.5, 0.58), size 0.51 x 0.45, depth 11000; labels 0x132-0x138 align 5, 0x139-0x13f align 4; title 0x130 (layout) |
confirmed (code) |
0x001e4540, 0x001e45f8 |
ControllerPage_Shutdown, _IsReady |
releases; ready when the picture batch +0x1d24 is resident |
confirmed (code) |
0x001e4618 |
ControllerPage_OnCommand |
table 0x005567b0: directions cue 0xe, back cue 0xf and true |
confirmed (code) |
0x001e46c0, 0x001e4820 |
ControllerPage_Update, _Render |
picture size and place, labels from the table; render with alpha | confirmed (code) |
0x001e4908, 0x001e4988 |
ControlMenuHUD_Construct, _Destroy |
GameMenu subclass, vtable 0x0053c3d0, interface 0x0053c3a8; entries +0x7a0/+0x870 |
confirmed (code) |
0x001e4a30 |
ControlMenuHUD_Open |
slot +0xa8: pausing player's input (pause menu +0x1bc0); entries Controller 0x130 at (0.26, 0.29), Tutorial 0x131 0.06 below, size 1.3; pages +0x940/+0x944 Init; +0x948-+0x954 reset |
confirmed (code) |
0x001e4e28, 0x001e4ea8 |
ControlMenuHUD_Close, _ArePagesReady |
slot +0xb0; both pages' slot +0x98 |
confirmed (code) |
0x001e4f18 |
ControlMenuHUD_OnCommand |
open page: forwarded, closed on true; else table 0x005567d0: up/down cue 4 (0xe at an end), left/right 0xe, accept opens (cue 8 for Controller), back cue 0xf, leave +0x94c |
confirmed (code) |
0x001e5130 |
ControlMenuHUD_Update |
waits for pages; plain pad pass; entries or the open page | confirmed (code) |
0x001e52f8, 0x001e5300 |
ControlMenuHUD_SetAlpha, _Render |
alpha +0x954; selected 0x005fd310, other 0x005fd320 |
confirmed (code) |
0x001e5438, 0x001e5478 |
ControlMenuHUD_StaticInit, _StaticInitStub |
builds both pages; stub in ctor list 0x00534130 ends the file |
confirmed (code) |
After GUI/ControlMenuHUD.cpp (no path string): the Stats screen¶
0x001e5498-0x001e6e78: the pause menu's Stats screen (pause menu +0x3bb0), a GameMenu subclass (vtable
0x0053c728, interface 0x0053c700) with its own static-init stub, so a file of its own (inferred).
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x001e5498, 0x001e5540 |
PauseStats_Construct, _Destroy |
portrait +0x7b0, shadows +0x8b0/+0x9b0, banner +0xab0, 4 HudGenericBars +0xbb0, description +0x1b70 |
confirmed (code) |
0x001e5618 |
PauseStats_Setup |
The Stats screen; from PauseMenu_Open: per-mode globals 0x0050f104-0x0050f2b8; human of game state +0x228; class 0-8 picks portrait, banner and string 0xea-0xf2, else unavailable; bars Strength 0xf3, Stamina 0xf4, Health 0xf5, Rage 0xf6 normalised by difficulty table 0x0050f230 (0x28 per difficulty, game state +0x154); description reveal 0.55 s |
confirmed (code) |
0x001e6530, 0x001e6600 |
PauseStats_Shutdown, _IsReady |
releases; ready after 10 s or when both portrait batches are resident | confirmed (code) |
0x001e6698 |
PauseStats_OnCommand |
table 0x005568e0: up/down MessageHUD_PageUp/PageDown (cue 4, 0xe when stuck), left/right 0xe, back 0xf and +0x7a0 = 1 |
confirmed (code) |
0x001e6778 |
PauseStats_Update |
portrait at base + (-0.08, -0.2), banner + (-0.17, -0.099), bars at + (0.14, -0.11 + 0.05 i) 0.22 x 0.025 fill 0x0063ee38, description + (-0.24, 0.1) |
confirmed (code) |
0x001e6cf0, 0x001e6cf8 |
PauseStats_SetAlpha, _Render |
alpha +0x1d70 |
confirmed (code) |
0x001e6e20, 0x001e6e78 |
PauseStats_StaticInit, _StaticInitStub |
colours 0x0063ee30/0x0063ee38 = (150,30,30,255); stub in ctor list 0x00534134 |
confirmed (code) |
Game-state functions¶
Functions in the address range 0x00417af0-0x00424e50 (inferred to be one module of the game state; the
Source map puts its first function in W_ActionableManager.cpp: inventory, statistics, flags, configuration
workers) that belong to this page, by address.
| Address | Name | What it does | Evidence |
|---|---|---|---|
0x0041dd78 |
GameState_RequestOptionMenu |
+0x11c = 1 |
confirmed (code) |
0x004229c0 |
Stats_ClearArmiesScores |
zeroes the Armies score (+0x04) of both players in the list (W_GameState + 0x228); from the game-over and pause menus' quit or retry |
confirmed (code) |
Coney's implementation¶
Written from this page: repo:src/gui/pause_menu/ (PauseMenu, YesNoBox, MissionFailedMenu, the item table
pauseGrid and offersHangout) on the menu widgets (GUI), and the modes
repo:src/gamemodes/pause_mode.h (PauseMode, 0xa, with applyPauseOutcome, PauseMenu_Toggle's second half) and
repo:src/gamemodes/mission_failed_mode.h (MissionFailedMode, 0xc, pushed by the binding HUDLaunchMissionFailed).
Gameplay (mode 1) ends each frame of play with PauseMode::playFrame (START on a connected pad, then the cool-down);
while mode 0xa or 0xc is on top gameplay does not update at all, and the paused level is drawn at its last step with the
menu's layer over it, after the HUD's (GameplayMode::renderWithOverlay, which the play mode implements). coney
--disc gives the modes the sheet-table records (the background is record 12, the gang-logo picture), pauses and resumes
every sound through the sound player, hands the HUD's three checklist slots to the Objectives screen and turns both
radars off on open (and, Coney's stand-in, back as they were on close). The sound state the mode saves and restores
is, in Coney, the bank in sound RAM: on close it loads back the bank the sound engine holds, which in a level is the
level's own bank loaded at the end of its load, not the front end's menu (FrontEndServices::bank() asks the audio;
restoring menu silenced the glass, the anim and the matrix sounds after any pause). Timings, positions, string ids,
cues, the item
grids, the Yes/No box and the leaving actions follow this page; tests in repo:tests/gui/pause_menu_test.cpp and
repo:tests/gamemodes/pause_mode_test.cpp drive them with scripted START, d-pad, cross and triangle.
Coney stand-ins, each an open question below:
- The headers (
CircledTextHeader), the objective lists and the Restart and Quit screens are centred texts at Coney's positions and colours; the Options screen is a list of its entries' names that does nothing on accept. - The Controls screen (
repo:src/gui/pause_menu/control_menu.h,ControlMenu, written fromGUI/ControlMenuHUD.cppand The Controls screen) follows this page: the entries, the cues, the pages' title, the pad picture (sheet-table record0x18f, loaded by the pause mode), the 14 labels on the table's rows (label 1 moved by the game state's language), the tips' list centred on (0.41, 0.35) with 8 visible, the 0.5 clip, the 0.53 wrap, the 0.01 spacing and the text unfolding 0.01 under the focused tip 550 ms after the focus, a quarter a frame.ControlLayout::forModeholds the 16:9 and flag-0x02values, but Coney's pause mode always opens the default 4:3 layout (no video-mode setting yet). Coney's choices: the list's window jumps rather than scrolls, and the text is drawn once it has fully unfolded. Tests:repo:tests/gui/control_menu_test.cpp,repo:tests/gui/pause_menu_test.cppandrepo:tests/platform/disc_pause_controls_test.cpp(START, the left stick at 70 % and cross inlevel99started as--play-levelstarts it; with the disc's strings and fonts no Controller label runs into the one under it). - The Stats screen is never available (Coney has no character stats), so Stats opens nothing.
- The menu does not wait for its last cue to end before it pops.
- The tint is a black quad rising to opaque over 1.4 s, under the menu; the mission-failed fade is the mode's own.
- Leaving pops mode 1 directly instead of setting
W_GameState + 0x14c= 3; the game state's+0x11c,+0x118and+0x56e0, the save on close, the pad vibration and the co-op quit (Player 2 / All) are not modelled. - The Armies of the Night levels use the story menu; the Rumble quit picks
PauseGoToRMIQuick(orPauseGoToRMIHangoutwhen the caller says the Rumble came from the hangout) and offers To Main Menu. - The mission-failed items: Last checkpoint, Restart level and To Hangout end the menu at once as the pause menu's restart and hangout outcomes, Yes to Quit as its main-menu outcome; back does nothing.
- "Saving the sound state" is remembering the sound bank, which exit loads again.
Open questions¶
- The Stats screen (answered for its layout, values and availability; the flag
+0x3bb8is taken to be whatPauseStats_Setup's slot+0x44call sets, inferred). Still open: the meaning of the 0.55 passed toMessageHUD_ReadAutoIndent, the unused floats t6-t9 of the difficulty table, the0x08and0x02layouts, and a runtime screenshot to check the computed positions and the portrait's red tint. - The header widget (answered: one to three circles, the level's colour and a
red checkpoint circle). Still open: a screenshot of the 16:9 pause menu (the layout's title factor is 0 there) and
whether the menu's mission titles always have the
<number>:<title>form. - The Controls screen and the Options menu (answered: The Options screen,
The Controls screen). Still open: which Controller-page labels are two lines long (the strings),
what the device flags
0x02and0x08mean for the per-mode layouts, and a runtime check of the Options layout. - The mission-failed items' actions (
0x001d2018and the vtable0x0053b598). The Rumble result screen (mode 0x14) is on Rumble. - What the menu's write to the screen-effects managers'
+0x214does on close. - The Armies of the Night pause menu's items (
0x001cfec0-0x001d0a38). - What
+0x3a80(the<ROBJ_N>choice between0xe8and0xe7) is read for, and the fonts, scales and colours of the headers, the item screens, the Yes/No box's texts and the objective lists' gold and purple. - Which Rumble quit
0x001fe1a8picks, and when the Rumble Quit screen offers To Hangout rather than To Main Menu. - What the tint
0x0018c988reaches (Coney: opaque black), and whether the HUD is drawn under the paused menu.