Repository navigation
Stage Catalog Fortress
github-actions[bot] edited this page Oct 2, 2026
·
7 revisions
Scope: Stage-local catalog for Fortress, compact selector
7/ native stage ID9. Shared record grammar, resource notation, evidence labels, and safety rules are owned by Stage catalogs. General extension-selector/materializer mechanics and composed-proof chronology remain owned by Global item materialization and solvability.
- Static-confirmed: all 9 ordinary pickup records, all 7 stock outer slots, and the recognized resource records below are decoded from the clean USA N64 ROM.
-
Runtime-confirmed: the complete Fortress resource file was byte-matched against captured runtime memory at
0x801F4E20. - Runtime-confirmed: representative Fortress ordinary-pickup collection/persistence is established, but all 9 Fortress records have not been individually exhausted one by one in runtime testing.
-
Runtime/user-observed + Static-confirmed trigger ownership: the three crystal reward records are spawned after defeating Kia, Jataaka, and Sareena. Fortress overlay file
0x9Estatically couples encounter indices 0/1/2 to the first three0x30pickup records and activates each record after the matching assassin encounter. For randomizer semantics these are three boss-defeat reward locations; the crystal identity is the stock reward, not a permanent binding between boss and reward. - Runtime-confirmed, proof-only (2026-09-30): the Fortress five-import stress ROM replaced the first five stock Herbs locations with Potion, Urn of Vitality, Formula, Eye, and Shield while retaining the sixth Herbs record byte-for-byte as a control. Manual validation confirmed Fortress loaded normally; all five imported visuals rendered correctly and awarded the expected items; the control Herbs remained normal; and no rendering, audio, stability, or stage-progression regression was observed on the tested route.
-
Runtime-confirmed, proof-only (2026-09-30): Kia's boss-defeat reward record
0xC4834was changed from Crystal Kia to a Potion while preserving the boss-owned0x8000activation gate in+0x14. Manual validation confirmed no Potion reward existed before Kia's defeat; defeating Kia activated the replacement reward at the boss location; the model rendered as Potion; collection awarded Potion rather than Crystal Kia; and the encounter/stage remained healthy on the tested route. This confirms reward identity can change independently of the Fortress boss trigger on this bounded case.
| Property | Value |
|---|---|
| Stage ID | 9 |
| Global resource file ID | 0x43 |
| File-table entry ROM | 0x000A5334 |
| Resource ROM range | 0x003B9700..0x003BCD1F |
| File size |
0x3620 (13856 bytes) |
| File-table flag | 0 |
| Verified runtime base | 0x801F4E20 |
| Outer slots | 7 |
| Outer-table end | 0x1C |
| First descriptor | 0x1C |
| Empty logical slots | none |
| Unknown/nonstandard slots | none |
| Pickup records | 9 |
| # | Decoded identity | ROM base | RDRAM base | X | Y | Z | +0C | +10 type | +14 parameter | +18 callback | +1C | +20 | +24 slot | +28 presentation | +2C collected | Token | Requires |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Crystal Kia | 0x000C4834 |
— | 0x00000000 |
0xFFFAF200 |
0x00000000 |
0x00000006 |
0x00000000 |
0x00008001 |
0x80038770 |
0x00000012 |
0x00000014 |
1 |
0x800B1BD0 |
0x00000000 |
crystal-kia |
— |
| 2 | Crystal Jataaka | 0x000C4864 |
— | 0x00000000 |
0xFFF5B200 |
0x00000000 |
0x00000006 |
0x00000000 |
0x00008000 |
0x80038770 |
0x00000012 |
0x00000014 |
0 |
0x800B1BD0 |
0x00000000 |
crystal-jataaka |
— |
| 3 | Crystal Sareena | 0x000C4894 |
— | 0x00000000 |
0xFFF07200 |
0x00000000 |
0x00000006 |
0x00000000 |
0x00008002 |
0x80038770 |
0x00000012 |
0x00000014 |
2 |
0x800B1BD0 |
0x00000000 |
crystal-sareena |
— |
| 4 | Herbs | 0x000C48C4 |
— | 0x00271800 |
0xFFFAF200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| 5 | Herbs | 0x000C48F4 |
— | 0x000D0200 |
0xFFF07200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| 6 | Herbs | 0x000C4924 |
— | 0x001C1000 |
0xFFF07200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| 7 | Herbs | 0x000C4954 |
— | 0x003AE500 |
0xFFF5B200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| 8 | Herbs | 0x000C4984 |
— | 0x0043ED00 |
0xFFFAF200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| 9 | Herbs | 0x000C49B4 |
— | 0x002F9C00 |
0xFFFAF200 |
0x00000000 |
0x00000006 |
0x00000001 |
0x00000000 |
0x800389BC |
0x00000020 |
0x00000020 |
3 |
0x800B1D38 |
0x00000000 |
— | — |
| ROM base | Callback | Parameter | Slot | Presentation |
|---|---|---|---|---|
0x000C4834 |
0x80038770 |
0x00008001 |
1 | 0x800B1BD0 |
0x000C4864 |
0x80038770 |
0x00008000 |
0 | 0x800B1BD0 |
0x000C4894 |
0x80038770 |
0x00008002 |
2 | 0x800B1BD0 |
0x000C48C4 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
0x000C48F4 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
0x000C4924 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
0x000C4954 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
0x000C4984 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
0x000C49B4 |
0x800389BC |
0x00000000 |
3 | 0x800B1D38 |
| Slot | Name | Outer offset | Format | Frames | Pickup users |
|---|---|---|---|---|---|
| 0 | Crystal (Jataaka) | 0x48 |
embedded-data-bundle | 8 | 1 |
| 1 | Crystal (Kia) | 0x1C |
embedded-data-bundle | 8 | 1 |
| 2 | Crystal (Sareena) | 0x74 |
embedded-data-bundle | 8 | 1 |
| 3 | Herbs | 0x1338 |
embedded-data-bundle | 8 | 6 |
| 4 | Non-pickup/unknown resource | 0x2490 |
embedded-data-bundle | 8 | 0 |
| 5 | Non-pickup/unknown resource (aliases Herbs descriptor) | 0x1338 |
embedded-data-bundle | 8 | 0 |
| 6 | Non-pickup/unknown resource | 0x1C48 |
embedded-data-bundle | 8 | 0 |
| Slot | Frame | Record | Storage | Resource/data value | Inferred end | Dimensions words |
|---|---|---|---|---|---|---|
| 0 | 0 | 0x140 |
embedded-data | 0x7E0 |
0x860 |
0x00160008 / 0x00070004
|
| 0 | 1 | 0x154 |
embedded-data | 0x860 |
0x8F0 |
0x00160009 / 0x00070005
|
| 0 | 2 | 0x168 |
embedded-data | 0x8F0 |
0x9B0 |
0x0016000D / 0x00070007
|
| 0 | 3 | 0x17C |
embedded-data | 0x9B0 |
0xA88 |
0x00160010 / 0x00070008
|
| 0 | 4 | 0x190 |
embedded-data | 0xA88 |
0xB48 |
0x00160010 / 0x00070008
|
| 0 | 5 | 0x1A4 |
embedded-data | 0xB48 |
0xC04 |
0x00160010 / 0x00070008
|
| 0 | 6 | 0x1B8 |
embedded-data | 0xC04 |
0xCB8 |
0x0016000D / 0x00070006
|
| 0 | 7 | 0x1CC |
embedded-data | 0xCB8 |
0xD3C |
0x00160008 / 0x00070004
|
| 1 | 0 | 0xA0 |
embedded-data | 0x280 |
0x300 |
0x00160008 / 0x000E0004
|
| 1 | 1 | 0xB4 |
embedded-data | 0x300 |
0x390 |
0x00160009 / 0x000E0005
|
| 1 | 2 | 0xC8 |
embedded-data | 0x390 |
0x450 |
0x0016000D / 0x000E0007
|
| 1 | 3 | 0xDC |
embedded-data | 0x450 |
0x528 |
0x00160010 / 0x000E0008
|
| 1 | 4 | 0xF0 |
embedded-data | 0x528 |
0x5E4 |
0x00160010 / 0x000E0008
|
| 1 | 5 | 0x104 |
embedded-data | 0x5E4 |
0x6A8 |
0x00160010 / 0x000E0008
|
| 1 | 6 | 0x118 |
embedded-data | 0x6A8 |
0x760 |
0x0016000D / 0x000E0006
|
| 1 | 7 | 0x12C |
embedded-data | 0x760 |
0x7E0 |
0x00160008 / 0x000E0004
|
| 2 | 0 | 0x1E0 |
embedded-data | 0xD3C |
0xDD8 |
0x00080016 / 0x0003000E
|
| 2 | 1 | 0x1F4 |
embedded-data | 0xDD8 |
0xE88 |
0x00090016 / 0x0004000E
|
| 2 | 2 | 0x208 |
embedded-data | 0xE88 |
0xF60 |
0x000D0016 / 0x0006000E
|
| 2 | 3 | 0x21C |
embedded-data | 0xF60 |
0x1048 |
0x00100016 / 0x0007000E
|
| 2 | 4 | 0x230 |
embedded-data | 0x1048 |
0x1118 |
0x00100016 / 0x0007000E
|
| 2 | 5 | 0x244 |
embedded-data | 0x1118 |
0x11E4 |
0x00100016 / 0x0007000E
|
| 2 | 6 | 0x258 |
embedded-data | 0x11E4 |
0x12A0 |
0x000D0016 / 0x0005000E
|
| 2 | 7 | 0x26C |
embedded-data | 0x12A0 |
0x1400 |
0x00080016 / 0x0003000E
|
| 3 | 0 | 0x1360 |
embedded-data | 0x1400 |
0x14E4 |
0x00110017 / 0x0008000F
|
| 3 | 1 | 0x1374 |
embedded-data | 0x14E4 |
0x15E4 |
0x00110017 / 0x0008000F
|
| 3 | 2 | 0x1388 |
embedded-data | 0x15E4 |
0x16F4 |
0x00100017 / 0x0007000F
|
| 3 | 3 | 0x139C |
embedded-data | 0x16F4 |
0x180C |
0x00100017 / 0x0008000F
|
| 3 | 4 | 0x13B0 |
embedded-data | 0x180C |
0x1930 |
0x00110017 / 0x0008000F
|
| 3 | 5 | 0x13C4 |
embedded-data | 0x1930 |
0x1A50 |
0x00100017 / 0x0007000F
|
| 3 | 6 | 0x13D8 |
embedded-data | 0x1A50 |
0x1B5C |
0x00100017 / 0x0008000F
|
| 3 | 7 | 0x13EC |
embedded-data | 0x1B5C |
0x1D10 |
0x00100017 / 0x0008000F
|
| 4 | 0 | 0x24B8 |
embedded-data | 0x2558 |
0x2740 |
0x00160017 / 0x000B000B
|
| 4 | 1 | 0x24CC |
embedded-data | 0x2740 |
0x2938 |
0x00160017 / 0x000B000B
|
| 4 | 2 | 0x24E0 |
embedded-data | 0x2938 |
0x2B2C |
0x00160017 / 0x000B000B
|
| 4 | 3 | 0x24F4 |
embedded-data | 0x2B2C |
0x2D1C |
0x00160017 / 0x000B000B
|
| 4 | 4 | 0x2508 |
embedded-data | 0x2D1C |
0x2F04 |
0x00160017 / 0x000B000B
|
| 4 | 5 | 0x251C |
embedded-data | 0x2F04 |
0x30F0 |
0x00160017 / 0x000B000B
|
| 4 | 6 | 0x2530 |
embedded-data | 0x30F0 |
0x32E4 |
0x00160017 / 0x000B000B
|
| 4 | 7 | 0x2544 |
embedded-data | 0x32E4 |
0x3620 |
0x00160017 / 0x000B000B
|
| 5 | 0 | 0x1360 |
embedded-data | 0x1400 |
0x14E4 |
0x00110017 / 0x0008000F
|
| 5 | 1 | 0x1374 |
embedded-data | 0x14E4 |
0x15E4 |
0x00110017 / 0x0008000F
|
| 5 | 2 | 0x1388 |
embedded-data | 0x15E4 |
0x16F4 |
0x00100017 / 0x0007000F
|
| 5 | 3 | 0x139C |
embedded-data | 0x16F4 |
0x180C |
0x00100017 / 0x0008000F
|
| 5 | 4 | 0x13B0 |
embedded-data | 0x180C |
0x1930 |
0x00110017 / 0x0008000F
|
| 5 | 5 | 0x13C4 |
embedded-data | 0x1930 |
0x1A50 |
0x00100017 / 0x0007000F
|
| 5 | 6 | 0x13D8 |
embedded-data | 0x1A50 |
0x1B5C |
0x00100017 / 0x0008000F
|
| 5 | 7 | 0x13EC |
embedded-data | 0x1B5C |
0x1D10 |
0x00100017 / 0x0008000F
|
| 6 | 0 | 0x1C70 |
embedded-data | 0x1D10 |
0x1E08 |
0x00110017 / 0x0008000F
|
| 6 | 1 | 0x1C84 |
embedded-data | 0x1E08 |
0x1F08 |
0x00110017 / 0x0008000F
|
| 6 | 2 | 0x1C98 |
embedded-data | 0x1F08 |
0x2004 |
0x00100017 / 0x0007000F
|
| 6 | 3 | 0x1CAC |
embedded-data | 0x2004 |
0x20EC |
0x000F0017 / 0x0007000F
|
| 6 | 4 | 0x1CC0 |
embedded-data | 0x20EC |
0x21DC |
0x000F0017 / 0x0007000F
|
| 6 | 5 | 0x1CD4 |
embedded-data | 0x21DC |
0x22BC |
0x000F0017 / 0x0007000F
|
| 6 | 6 | 0x1CE8 |
embedded-data | 0x22BC |
0x23A8 |
0x00100017 / 0x0008000F
|
| 6 | 7 | 0x1CFC |
embedded-data | 0x23A8 |
0x2558 |
0x00100017 / 0x0008000F
|
-
Checkpoint/progression static closure (2026-09-29): the stock Fortress crystal records use generic callback
0x80038770, but its stage-9 branch awards IDs0x20..0x22and acquired bits without taking the generic direct0x80062D60presentation request or pickup-created0x802C18F8selector-write branches. Crystal USE dispatch entries map to position-gated progression handlers0x8007239C / 0x80072400 / 0x80072464, which commit bits0x08/0x10/0x20in0x802C0D54. The stock crystal award path is therefore Static-confirmed checkpoint-free. The remaining Fortress blocker is different: each boss-defeat reward location must materialize/award whichever logical item the global layout assigns while preserving the boss trigger. - The stock resource file has exactly 7 occupied outer slots. Its outer table occupies file-relative
0x0000..0x001B; the first descriptor starts immediately at0x1C. There is no empty stock logical selector. - Adding an eighth stock-table word in place would overwrite that first descriptor. This is a Static-confirmed stock-layout fact, not a claim that Fortress lacks all ordinary-pickup selector expansion paths.
- Slot
5aliases the Herbs descriptor0x1338used by slot3. Slots4and6have no ordinary-pickup users, but all three remain protected until other Fortress actor/script references are resolved. -
Bit-15 activation-gate closure (2026-10-02, Static-confirmed; Kia replacement Runtime-confirmed): the crystal parameters
0x8000/0x8001/0x8002use the same destination-record activation gate established generically in the Bridge audit. Pickup-manager setup consumes raw bit0x8000; callback dispatch masks it away. Fortress encounter manager0x802EFDB0clears that bit only on the indexed boss reward record after the corresponding assassin completes. The low 15 bits remain the logical crystal index/ID input to the stock callback. - The first three catalog rows describe the stock spawned rewards for the Kia/Jataaka/Sareena boss checks. Static overlay trace now resolves the exact association: ASSASSIN1/type
0x0D-> Kia record0xC4834, ASSASSIN3/type0x13-> Jataaka record0xC4864, and ASSASSIN2/type0x1C-> Sareena record0xC4894. The manager copies the defeated actor X into record+0x00and clears the0x8000bit in record+0x14to activate the indexed reward. The final global materializer must preserve this trigger while allowing any assigned logical item identity in the reward record. -
Fortress selector/checkpoint ownership closure (2026-10-02, Static-confirmed): raw Fortress overlay file
0x9Eis ROM[0xC0330,0xC4C70)at runtime base0x802ECE30. Direct global-selector writes in this overlay are: selector9during an initialization/re-entry path at ROM0xC044C; selector5at0xC28FC, selector6at0xC2938, selector8at0xC2998, and encounter-index-derived selectors4+2at0xC38B0. None of the nine ordinary pickup callbacks write0x802C18F8. -
Boss-defeat checkpoint binding (2026-10-02, Static-confirmed): encounter manager
0x802EFDB0handles indicess4=0/1/2. On completion it writes selectors4+2, producing2/3/4, and separately records the completed encounter mask and activates the corresponding gated reward record. Fortress spawn-table selectors2/3/4at0x800A01BC/0x800A01D0/0x800A01E4have X/Y coordinates0x00047300/-0x00054000,0x00194900/-0x000A8000, and0x00414E00/-0x000FC000, exactly matching the three encounter-table centers in0x802F15B8 + index*0x18. Therefore those checkpoint/state advances are boss-encounter-owned, not reward-pickup-owned. -
Crystal-use progression/checkpoint binding (2026-10-02, Static-confirmed): permanent use handlers
0x8007239C / 0x80072400 / 0x80072464commit progression bits0x08/0x10/0x20after player-position checks. Fortress overlay state machine0x802EF30Cconsumes(0x802C0D54 >> 3) & 7and maps progression states into later native selector/checkpoint states:5,6, and8, each through a stock0x80062D60presentation path where applicable. The position windows for the first two USE handlers center on selector-5 and selector-6 spawn coordinates (X=0x000A8000and0x003C0000); the third USE zone centers aroundX≈0x0023FC00, adjacent to selector-7 spawn0x00240000, while the completed third progression route advances onward to selector8. These are native progression/use semantics, not ordinary reward-location semantics. - Accepted Fortress destination contract (2026-10-02): none of the nine ordinary Fortress locations needs a checkpoint wrapper. The six stock Herbs locations have no identified destination activation/checkpoint side effect. The first three boss-reward locations retain only their destination-owned bit-15 activation gate and encounter-controlled X relocation; the assigned logical reward is materialized/awarded independently. Logical crystals remain checkpoint-free inventory rewards; their later USE handlers and Fortress progression/checkpoint state remain stock-owned. The shared materializer's generic destination-gate preservation already represents this contract.
- Composed five-import stress construction — Runtime-confirmed, proof-only: the disposable proof replaces the first five stock Herbs locations with Potion, Urn of Vitality, Formula, Eye, and Shield, retains another Herbs record byte-for-byte as a control, and supplies five contiguous extension-selector entries plus self-contained imported bundles. Manual runtime validation confirmed the five models/awards and untouched Herbs control in Fortress with no observed rendering, audio, stability, or progression regression on the tested route. The generalized construction details remain on Global item materialization and solvability.
- Fortress ordinary-location ownership is now statically closed for all nine records. The shared materializer already generalizes destination bit-15 preservation across all three assassin reward records and keeps logical crystal awards separate; the Kia substituted-reward route is Runtime-confirmed bounded evidence. Remaining work belongs to whole-system wrapper/integration validation rather than more Fortress ownership research.
- Stage catalogs — shared schema, notation, safety rules, catalog lineage, and eight-stage index.
-
Data structures and encodings — ordinary
0x30-byte record grammar. - Resource and overlay system — global file-table, loader, overlay, and selector/resource grammar.
- Memory and allocation map — literal ROM/RDRAM ownership, lifecycle, and proof/production allocation boundaries.
- Address and patch-site registry — exact guarded ROM edit sites.
- Pickups and stage-local randomization — current production ordinary-pickup behavior and modeled stage dependencies.
- Global item materialization and solvability — extension-selector/materializer mechanics, planner/deduplication, external-to-embedded conversion, solver rules, and full composed-proof chronology.
- Persistence, inventory, and lifecycle — collected-state persistence and stage-transition lifecycle.
MKMSZR current documentation · Wiki source: wiki/ · Evidence/archive: ChatGPT Library MKMSZR Research · Product source: smeagol44/MKMSZ-Randomizer
Orientation / Project
- Home
- Contributor start here
- Project status
- 1.0 requirements and roadmap
- Runtime validation status
- Architecture overview
- Research methodology and evidence
- Glossary
Core Technical Reference
- Core runtime and native payload
- Memory and allocation map
- Function registry
- Address and patch-site registry
- Data structures and encodings
- Resource and overlay system
- Address quick reference
- Testing and CI
Randomizer / Product Systems
- Stage flow and selector
- Pickups and stage-local randomization
- Global item materialization and solvability
- Persistence, inventory and lifecycle
- Lifecycle static closure / unbuilt v05
- XP and progression
- Native HUD and UI
- Presentation and branding
- Audio system
- Palette and recoloring
- Web patcher and product
Stage Reference
Gameplay / Enemy / Donor Research
- Enemy randomization
- Player actions and special moves
- MKT compatibility overview
- MKT adapter primitives
- MKT fighter asset translation
- Sub-Zero ↔ Sektor animation mapping
- Sektor takeover proof history
- Toasty audio research
- Toasty visual research
- PS1 research
- N64–PS1 comparison
- N64 -> PS1 port planning and strategy
History / Failures / Superseded Material