diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index ed74f715..d8fe6c55 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -717,6 +717,37 @@ unknown, what evidence exists, and what the first step would be. Move an item in 90, `0x82290ED8`). This needs type information the offset index does not carry; it is not a cheap static question and should not be reopened as one. +* ✅ **(2026-08-27) THE CONFIG SECTIONS ARE REAL DISC DATA — 64/65, and the two + reader functions separate perfectly. + [structures/isl-condition-builtins](structures/isl-condition-builtins.md), + artefact `data/config-keys.txt`.** + Testing every literal key from the artefact against the **3 496 distinct IDXD + record keys** with `tag_hash`: + **section names (arg to `sub_82448AA0`) → 64 / 65 present**; + **field keys (arg to `sub_824482D0`) → 0 / 54 present**. + The two classes are each other's control and the dissociation is total, which + confirms the model exactly: `sub_82448AA0(node, NAME)` finds a **record** keyed + by `tag_hash(NAME)`; `sub_824482D0(node, KEY)` reads a **field**, whose name is + a literal string in the record's pool — so none of them can be a record key. + 🔑 **The single absent section is `LANGUAGE`** — precisely the one real section + in the disc-root `config.ini`. The same API serves both stores and the data + shows the seam. + ✅ **This deflates my own earlier framing.** I had listed "64 sections whose + hardcoded fallbacks are worth pinning for the port". They are not fallbacks: + **all but one are real data on the disc.** `STAGENN_UNIT_MAX` is the genuine + exception, and only because its name is *built at runtime* from the stage index + rather than being one of these literals. + 📎 The artefact now names the pak each record lives in: `tables.pak` for the + global tables (`MISSIONS`, `STAGES`, `SOUNDS`, `SUB_OBJECTIVE`, + `SQUADRON_ORDER_OBJECT`, `EPILOGUE_MOVIES`, `ACHIEVEMENTS_REQUIREMENTS`, + `FONTS`, `BASE_INFO`, …), **`GP_HANGAR_ARSENAL.pak` for `WEAPONS`, `UNITS`, + `Camera`, `ControlTweak`, `Rendering`, `AUTO_SETTINGS`, `IGNORE`** — so the + arsenal pak holds the canonical weapon/unit definitions — and the per-language + `GP_MAIN_GAME_*` paks for the enum tables. + 🟡 Not settled: the CONTENTS of those records. Knowing `WEAPONS` lives in + `GP_HANGAR_ARSENAL.pak` is a pointer, not a decode; the field-level read is a + separate job per table. + ## ✅✅ SOLVED — the mission freeze was a modal sign-in dialog (2026-08-26) `XamShowSigninUI` opens a modal dialog and `xeXamDispatchDialog` blocks the diff --git a/docs/re/data/config-keys.txt b/docs/re/data/config-keys.txt index dff63833..d275712c 100644 --- a/docs/re/data/config-keys.txt +++ b/docs/re/data/config-keys.txt @@ -1,78 +1,85 @@ -# The named-section / int-key vocabulary the engine asks for +# The named-section / field-key vocabulary the engine asks for -Resolved by back-tracking the r4 string argument at every call site of -sub_82448AA0 (find a named section/record) and sub_824482D0 (read an int). +Resolved by back-tracking the r4 string at every call site of + sub_82448AA0 -- find a named RECORD (key = tag_hash(name)) + sub_824482D0 -- read a named FIELD (name = a literal string in the pool) Only sites whose key is a literal addis/addi string are listed, so these are -LOWER BOUNDS, not the complete set. +LOWER BOUNDS. "found in" = the paks holding an IDXD record with that tag_hash. -## sub_82448AA0 -- named section / record (65 distinct) - 1 ACHIEVEMENTS_REQUIREMENTS - 3 AUTO_SETTINGS - 1 ArmsItem - 1 ArmsItemFile - 19 BASE_INFO - 1 COMMON_RESOURCE - 1 COMMON_XPR - 1 CUSTOM_KEY_LOCATE - 1 Camera - 1 ControlTweak - 4 CorrespondingTable - 3 EPILOGUE_MOVIES - 2 EnumCharacter - 2 EnumUnit - 1 EnumWeapon - 1 Enumerate_ObjectiveMarkers - 1 FILE - 2 FILES - 4 FONTS - 2 FONT_SET - 1 Faces - 1 Files - 1 GP_MAIN_GAME - 2 GP_SCRIPT - 1 Generic - 3 IGNORE - 2 LANGUAGE - 4 LOCATE - 2 LocalStringFiles - 5 MISSIONS - 1 MotionResource - 1 Number - 1 OFFSET - 1 OPEN_PAK - 1 Parameters - 5 Path - 2 PrefetchPaks - 1 RADIO_WINDOW - 1 Rendering - 1 ResourceID - 1 ResourceTable - 1 Rule - 2 SCRIPTS - 1 SETTINGS - 1 SE_main_arm1_attach - 1 SE_main_arm1_detach - 1 SE_main_arm2_attach - 1 SE_main_arm2_detach - 1 SE_main_arm3_attach - 1 SE_main_arm3_detach - 1 SE_nose_attach - 1 SE_nose_detach - 1 SOUND - 1 SOUNDS - 1 SQUADRON_ORDER_OBJECT - 2 STAGE - 1 STAGES - 1 SUB_OBJECTIVE - 11 SYSTEM - 4 StageResource - 1 TEXTS - 2 UNITS - 1 UnitMessageSetTable - 2 WEAPONS - 1 WeaponChangeFrame +The two classes act as each other CONTROL: + SECTION names present as IDXD record keys : 64 / 65 + FIELD keys present as IDXD record keys : 0 / 54 +The one section that is NOT a record is LANGUAGE -- the one real section in +the disc-root config.ini, which the same API also reads. -## sub_824482D0 -- read an int (54 distinct) +## sub_82448AA0 -- named record (65 distinct) + 1 ACHIEVEMENTS_REQUIREMENTS tables.pak + 3 AUTO_SETTINGS GP_HANGAR_ARSENAL.pak + 1 ArmsItem GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 1 ArmsItemFile GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 19 BASE_INFO tables.pak + 1 COMMON_RESOURCE tables.pak + 1 COMMON_XPR tables.pak + 1 CUSTOM_KEY_LOCATE tables.pak + 1 Camera GP_HANGAR_ARSENAL.pak, GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak + 1 ControlTweak GP_HANGAR_ARSENAL.pak + 4 CorrespondingTable tables.pak + 3 EPILOGUE_MOVIES tables.pak + 2 EnumCharacter GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 2 EnumUnit GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 EnumWeapon GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 Enumerate_ObjectiveMarkers GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 1 FILE GP_READY_ROOM.pak + 2 FILES tables.pak + 4 FONTS tables.pak + 2 FONT_SET tables.pak + 1 Faces GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 Files GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 GP_MAIN_GAME tables.pak + 2 GP_SCRIPT tables.pak + 1 Generic DefTables.pak, GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak + 3 IGNORE GP_HANGAR_ARSENAL.pak + 2 LANGUAGE -- not an IDXD record -- + 4 LOCATE tables.pak + 2 LocalStringFiles GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 5 MISSIONS tables.pak + 1 MotionResource GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 Number GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 1 OFFSET GP_READY_ROOM.pak + 1 OPEN_PAK tables.pak + 1 Parameters GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 5 Path tables.pak + 2 PrefetchPaks tables.pak + 1 RADIO_WINDOW tables.pak + 1 Rendering GP_HANGAR_ARSENAL.pak + 1 ResourceID GP_HANGAR_ARSENAL.pak + 1 ResourceTable GP_MAIN_GAME_D2D.pak, GP_MAIN_GAME_E2D.pak, GP_MAIN_GAME_F2D.pak + 1 Rule GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 2 SCRIPTS GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 1 SETTINGS tables.pak + 1 SE_main_arm1_attach GP_HANGAR_ARSENAL.pak + 1 SE_main_arm1_detach GP_HANGAR_ARSENAL.pak + 1 SE_main_arm2_attach GP_HANGAR_ARSENAL.pak + 1 SE_main_arm2_detach GP_HANGAR_ARSENAL.pak + 1 SE_main_arm3_attach GP_HANGAR_ARSENAL.pak + 1 SE_main_arm3_detach GP_HANGAR_ARSENAL.pak + 1 SE_nose_attach GP_HANGAR_ARSENAL.pak + 1 SE_nose_detach GP_HANGAR_ARSENAL.pak + 1 SOUND tables.pak + 1 SOUNDS tables.pak + 1 SQUADRON_ORDER_OBJECT tables.pak + 2 STAGE GP_HANGAR_ARSENAL.pak, tables.pak + 1 STAGES tables.pak + 1 SUB_OBJECTIVE tables.pak + 11 SYSTEM tables.pak + 4 StageResource GP_HANGAR_ARSENAL.pak, GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak + 1 TEXTS GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 2 UNITS GP_HANGAR_ARSENAL.pak + 1 UnitMessageSetTable GP_MAIN_GAME_D.pak, GP_MAIN_GAME_E.pak, GP_MAIN_GAME_F.pak + 2 WEAPONS GP_HANGAR_ARSENAL.pak + 1 WeaponChangeFrame GP_HANGAR_ARSENAL.pak + +## sub_824482D0 -- read a field (54 distinct; none is a record key, as expected) 1 ADJUST_X 1 ADJUST_Y 1 BlinkCycle diff --git a/docs/re/structures/isl-condition-builtins.md b/docs/re/structures/isl-condition-builtins.md index b591d0d3..f41fd24a 100644 --- a/docs/re/structures/isl-condition-builtins.md +++ b/docs/re/structures/isl-condition-builtins.md @@ -453,6 +453,39 @@ attribute. Inside the ISL region the only hits are the two writers in Dropping this sub-item: it needs type information the offset index does not carry. +### ✅ (2026-08-27) The two-function model is confirmed by a 64/65 vs 0/54 dissociation + +Taking every literal key from `data/config-keys.txt` and testing it against the +3 496 distinct IDXD record keys on the disc (`tag_hash`): + +| class | argument to | present as an IDXD **record key** | +|---|---|---| +| section names | `sub_82448AA0` | **64 / 65** | +| field keys | `sub_824482D0` | **0 / 54** | + +The two classes are each other's control, and the split is total. It confirms the +model exactly: + +* **`sub_82448AA0(node, NAME)` finds a RECORD**, keyed by `tag_hash(NAME)`. +* **`sub_824482D0(node, KEY)` reads a FIELD**, whose name is a literal string in + the record's pool — so of course none of them is a record key. + +🔑 **The single absent section is `LANGUAGE`** — which is precisely the one real +section in the disc-root `config.ini`. The same API serves both stores, and the +data shows the seam. + +So the earlier worry that "64 sections have unknown hardcoded fallbacks" was +overblown: **all but one are real data on the disc**. `STAGENN_UNIT_MAX` is the +genuine exception, and it is absent because its name is *built at runtime* from +the stage index rather than being one of these literals. + +📎 The artefact now records which pak each record lives in — `tables.pak` for the +global tables (`MISSIONS`, `STAGES`, `SOUNDS`, `SUB_OBJECTIVE`, +`SQUADRON_ORDER_OBJECT`, `EPILOGUE_MOVIES`, `ACHIEVEMENTS_REQUIREMENTS`, +`FONTS`, `BASE_INFO` …), **`GP_HANGAR_ARSENAL.pak` for `WEAPONS`, `UNITS`, +`Camera`, `ControlTweak`, `Rendering`, `AUTO_SETTINGS`, `IGNORE`**, and the +per-language `GP_MAIN_GAME_*` paks for the enum tables. + 🟡 Its neighbours belong to the same cluster: `builtin103` reads `[phase+10156]` and `[phase+10152]` (9 and 7 writers), and a sibling vtable stub clears `[phase+10152]`. The shape is an engine→script status trio, but that is a