re: the config sections are real disc data -- 64/65, with a clean 0/54 control
Testing every literal key from data/config-keys.txt against the 3496 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, confirming the model: sub_82448AA0 finds a RECORD keyed by tag_hash(name); sub_824482D0 reads a FIELD whose name is a literal string in the pool, so none of them can be a record key. The single absent section is LANGUAGE -- the one real section in the disc-root config.ini. The same API serves both stores. This deflates my own earlier framing: I had listed "64 sections whose hardcoded fallbacks are worth pinning". They are not fallbacks; all but one are real data. STAGENN_UNIT_MAX is the genuine exception, because its name is built at runtime from the stage index. The artefact now names the pak each record lives in -- notably GP_HANGAR_ARSENAL.pak holds WEAPONS, UNITS, Camera, ControlTweak, Rendering, AUTO_SETTINGS and IGNORE. Docs + regenerated artefact; ISL artefacts byte-identical.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user