diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 955effd0..de21c400 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -827,6 +827,44 @@ unknown, what evidence exists, and what the first step would be. Move an item in field; the stat keys in records not opened here (`MegaTons`, `BulletLimit`, `CrewCount`, `HP_CLASS`); why the roster lists 59 of 131. +* โœ… **(2026-08-27) THE WHOLE IN-GAME HUD CONFIG IS OPEN โ€” 16 records, 419 asset + paths, a per-stage `ResourceTable` โ€” and NONE of it is name-hash addressed.** + [structures/hud-config](structures/hud-config.md), artefact + `data/hud-config.txt` (697 lines), regenerator `tools/re-capture/hud_config.py`. + Checked first: no `docs/re/` file mentions `ArmsStatus`, `RangeFinder`, + `Radar`, `Sight`, `Wing`, `NamePlate` or `ResourceTable`. Only `HudResource` + had been opened; the other **fifteen** records had not. + The six IDXD entries of `GP_MAIN_GAME_E2D.pak`: two carry the 16-record HUD + config (`ArmsStatus` 16, `Map` 3, `ArmsItem` 1, `RangeFinder` 10, `Marker` 27, + `Manuva` 15, `Number` 10, `HudResource` 24, `NamePlate` 60, `ActiveArm` 13, + `Information` 15, `Wing` 23, `ArmsItemFile` 59, `Radar` 29, `Speed` 9, + `Sight` 35), two the 13-record `ObjectiveMarker_*`/`TutorialMarker_*` set, one + `Face` (52 portrait sprites), one `ResourceTable`. + ๐Ÿ”‘ New subdirectory prefixes throughout: `ArmsSt\`, `ActvArm\`, `RangeF\`, + `Marker\`, `Manuva\`, `Map\`, `Speed\`, `Radar\`, `Sight\`, `Wing\`, + `Hitmark\`, `Lockon\`, `Info\`. `Number` is `%d`-templated + (`pghud_speed_num%d.t32`, `pgtimer_num%d.t32`, `pglockon_%d.t32`). + ๐Ÿงช **THE DECISIVE CONTROL โ€” the config's own exact path strings, no guessing + left: 419 distinct `.prt`/`.t32`/`.tbl` values, ZERO resolve as a pak entry** + under 10 prefixes; the four config FILENAMES resolve to nothing either. The + `.t32` sprites certainly exist (574 T8aD in that pak). **So the 2D pak is not + addressed by `name_hash` of the name its config uses.** + โš ๏ธ This SUPERSEDES the earlier framing: the 28 "dangling" `.prt` names were + never a missing-asset story โ€” they are 28 of a set where none of the 419 + resolves. The right statement is "**the in-game asset namespace is not the + archive namespace**". + โœ… **`ResourceTable` = 58 positional fields = 29 PAIRS**, alternating + `HudResource.tbl`/`HudMarkerResource.tbl`, identical in all six language paks, + with **exactly one override at pair index 25: `HudResource_S26.tbl` / + `HudMarkerResource_S26.tbl`**. + ๐ŸŸก The reading โ€” indexed by stage number โˆ’ 1, so 29 entries cover S1..S29 and + index 25 is **S26, the one stage with its own HUD config**. The arithmetic is + exact and the `_S26` suffix names the same stage, but nothing proves the + indexing. **Not adopted.** + ๐ŸŸก Not settled: **how the 574 T8aD / 130 RATC entries ARE addressed** โ€” that is + now the question; what `HudMarkerResource.tbl` pairs to (by content, not hash); + `Parameters` and `Enumerate_ObjectiveMarkers` are in the artefact but unread. + * โŒโœ… **(2026-08-27) THE "VARIANT INSIDE A PARENT BUNDLE" READING IS REFUTED โ€” and the in-game screen config is `HudResource`, the counterpart of `tables.pak`. 28 `.prt` names exist NOWHERE on the disc.** diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 5c0fe369..c3aa52f6 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -99,6 +99,7 @@ files, which is how the same ground got covered twice. | [`structures/sound-cue-table.md`](structures/sound-cue-table.md) | The cue index in `tables.pak` โ€” message id -> cue -> sound id -> `.slb` bank | โœ… CONFIRMED, 1 326/1 338 script message ids bind to a bank; SOUNDS and FILES agree on the same 12 absentees, 0 orphan files | | [`structures/cutscene-message-table.md`](structures/cutscene-message-table.md) | Cutscene dialogue โ€” speaker, portrait, on-screen seconds, audio cue per page | โœ… CONFIRMED, field count = 9ยทPageCount+2 for all 7 PageCounts, 1 252/1 252 caption keys match, 138 ids close both ways | | [`structures/isl-mission-timer.md`](structures/isl-mission-timer.md) | The mission timer โ€” two sequential countdowns, not a limit and a warning | โœ… CONFIRMED โ€” read from `sub_822639B8`; the threshold reading is | +| [`structures/hud-config.md`](structures/hud-config.md) | The in-game HUD configuration โ€” 16 records, 419 asset paths, and a per-stage `ResourceTable` | โœ… CONFIRMED โ€” 0 of 419 config paths resolve as pak entries | | [`structures/mission-script-manifest.md`](structures/mission-script-manifest.md) | `Stage\script.tbl`'s 11 non-`MISSION` fields, and the mission dialogue table they name | โœ… CONFIRMED โ€” 1 of 7 values resolves (`message\MissionDialogMessage.tbl`, 200 records), controls in the same sweep | | [`structures/stage-numbering-and-player-craft.md`](structures/stage-numbering-and-player-craft.md) | The disc's stage numbering (S01โ€“S16, S18โ€“S29) and the player's craft per stage | โœ…โœ… CONFIRMED โ€” two independent files close on 6 + 15 + 1 + 6 = 28 | | [`structures/hangar-loadout-system.md`](structures/hangar-loadout-system.md) | The Hangar loadout system โ€” loadout โ†’ per-slot allow-list โ†’ arsenal item | โœ… CONFIRMED โ€” 60/60 slot refs, 70/88 item refs (18 = the `No_Equipment` sentinel) | diff --git a/docs/re/data/hud-config.txt b/docs/re/data/hud-config.txt new file mode 100644 index 00000000..945289e0 --- /dev/null +++ b/docs/re/data/hud-config.txt @@ -0,0 +1,697 @@ +# The in-game HUD configuration (GP_MAIN_GAME_*2D.pak, IDXD entries) +# Regenerate: python3 tools/re-capture/hud_config.py +# See docs/re/structures/hud-config.md + +## the six IDXD entries of GP_MAIN_GAME_E2D.pak + 10b9d584 16 records: ArmsStatus, Map, ArmsItem, RangeFinder, Marker, Manuva, Number, HudResource, NamePlate, ActiveArm, Information, Wing, ArmsItemFile, Radar, Speed, Sight + 4abcfc43 16 records: ArmsStatus, Map, ArmsItem, RangeFinder, Marker, Manuva, Number, HudResource, NamePlate, ActiveArm, Information, Wing, ArmsItemFile, Radar, Speed, Sight + 59ecbedd 1 records: Face + 87fd28c0 1 records: ResourceTable + 927b29f8 13 records: ObjectiveMarker_Acropolis, Parameters, ObjectiveMarker_SubObjective, ObjectiveMarker_Guard, TutorialMarker_WayPoint, TutorialMarker_NoMark, Enumerate_ObjectiveMarkers, TutorialMarker_Tanker, TutorialMarker_Target, ObjectiveMarker_WayPoint, ObjectiveMarker_Tanker, TutorialMarker_Acropolis, ObjectiveMarker_Target + ccb12a6b 13 records: ObjectiveMarker_Acropolis, Parameters, ObjectiveMarker_SubObjective, ObjectiveMarker_Guard, TutorialMarker_WayPoint, TutorialMarker_NoMark, Enumerate_ObjectiveMarkers, TutorialMarker_Tanker, TutorialMarker_Target, ObjectiveMarker_WayPoint, ObjectiveMarker_Tanker, TutorialMarker_Acropolis, ObjectiveMarker_Target + +## every config record, field by field + +== ArmsStatus : 16 fields (16 named, 0 positional) + PGHUD_ARMS_BASE ArmsSt\pghud_arms_base.t32 + PGHUD_ARMS_EMPTY ArmsSt\pghud_arms_empty.t32 + PGHUD_ARMS_ITEM_NULL ArmsSt\pghud_arms_item_null.t32 + PGHUD_ARMS_OVERHEAT ArmsSt\pghud_arms_overheat.t32 + PGHUD_ARMS_RELOADING ArmsSt\pghud_arms_reloading.t32 + PGHUD_ARMS_SEC ArmsSt\pghud_arms_sec.t32 + PGHUD_ARMS_SELECT ArmsSt\pghud_arms_select.prt + PGHUD_ARMS_SLASH ArmsSt\pghud_arms_slash.t32 + PGHUD_TYPE_ASM ArmsSt\pghud_arms_type_ASM.t32 + PGHUD_TYPE_BM ArmsSt\pghud_arms_type_BM.t32 + PGHUD_TYPE_BR ArmsSt\pghud_arms_type_BR.t32 + PGHUD_TYPE_CN ArmsSt\pghud_arms_type_CN.t32 + PGHUD_TYPE_GUN ArmsSt\pghud_arms_type_GUN.t32 + PGHUD_TYPE_LS ArmsSt\pghud_arms_type_LS.t32 + PGHUD_TYPE_MPM ArmsSt\pghud_arms_type_MPM.t32 + PGHUD_TYPE_SPC ArmsSt\pghud_arms_type_SPC.t32 + +== Map : 3 fields (3 named, 0 positional) + PGMAP_CIRCLE Map\pgmap_circle.t32 + PGMAP_SURROUND Map\pgmap_surround.prt + PGMAP_WHOLE Map\pgmap_whole.prt + +== ArmsItem : 1 fields (1 named, 0 positional) + Directory ArmsSt + +== RangeFinder : 10 fields (10 named, 0 positional) + PGHUD_RANGE_BAR RangeF\pghud_range_bar.t32 + PGHUD_RANGE_BAR_EM RangeF\pghud_range_bar_em.prt + PGHUD_RANGE_MAIN RangeF\pghud_range_main.prt + PGHUD_RANGE_MAIN_PLATE RangeF\pghud_range_main.t32 + PGHUD_RANGE_MAIN_PLATE_EM RangeF\pghud_range_main_em.prt + PGHUD_RANGE_MARK RangeF\pghud_range_mark.prt + PGHUD_RANGE_MARK_OUT1 RangeF\pghud_range_mark_out1.prt + PGHUD_RANGE_NOSE RangeF\pghud_range_nose.prt + PGHUD_RANGE_NOSE_PLATE RangeF\pghud_range_nose.t32 + PGHUD_RANGE_NOSE_PLATE_EM RangeF\pghud_range_nose_em.prt + +== Marker : 27 fields (27 named, 0 positional) + PGMARK0 Marker\pgmark0.t32 + PGMARK1 Marker\pgmark1.t32 + PGMARK2 Marker\pgmark2.t32 + PGMARK3 Marker\pgmark3.t32 + PGMARK4 Marker\pgmark4.t32 + PGMARKLOCKON Marker\pgmarklockon.prt + PGMARKSUB Marker\pgmarksub.t32 + PGMARKTGT Marker\pgmarktgt.prt + PGMARKTGT_BEAM Marker\pgmarktgt_beam.prt + PGMARKTGT_BEAM_NOSE Marker\pgmarktgt_beam_nose.prt + PGMARKTGT_BOM Marker\pgmarktgt_bom.prt + PGMARKTGT_CANNON Marker\pgmarktgt_cannon.prt + PGMARKTGT_EASY Marker\pgmarktgt_easy.prt + PGMARKTGT_GUN Marker\pgmarktgt_gun.prt + PGMARKTGT_GUN_NOSE Marker\pgmarktgt_gun_nose.prt + PGMARK_GAUGE_BAR Marker\pgmark_gauge_bar.t32 + PGMARK_GAUGE_BASE Marker\pgmark_gauge_base.t32 + PGMARK_GAUGE_DIFF Marker\pgmark_gauge_diff.t32 + PGMARK_GAUGE_SUB_BAR Marker\pgmark_gauge_sub_bar.t32 + PGMARK_GAUGE_SUB_BASE Marker\pgmark_gauge_sub_base.t32 + PGMARK_GAUGE_SUB_DIFF Marker\pgmark_gauge_sub_diff.t32 + PGMARK_SHIELD_BAR Marker\pgmark_shield_bar.t32 + PGMARK_SHIELD_BASE Marker\pgmark_shield_base.t32 + PGMARK_SHIELD_DIFF Marker\pgmark_shield_diff.t32 + PGMARK_SHIELD_SUB_BAR Marker\pgmark_shield_sub_bar.t32 + PGMARK_SHIELD_SUB_BASE Marker\pgmark_shield_sub_base.t32 + PGMARK_SHIELD_SUB_DIFF Marker\pgmark_shield_sub_diff.t32 + +== Manuva : 15 fields (15 named, 0 positional) + PGMANUVA Manuva\pgmanuva.prt + PGMANUVA_BAR Manuva\pgmanuva_bar.t32 + PGMANUVA_EFF1 Manuva\pgmanuva_eff1.prt + PGMANUVA_EFF2 Manuva\pgmanuva_eff2.prt + PGMANUVA_EFF3 Manuva\pgmanuva_eff3.prt + PGMANUVA_LEVEL Manuva\pgmanuva_level.t32 + PGMANUVA_NUM0 Manuva\pgmanuva_num0.t32 + PGMANUVA_NUM0EFF Manuva\pgmanuva_num0eff.t32 + PGMANUVA_NUM1 Manuva\pgmanuva_num1.t32 + PGMANUVA_NUM1EFF Manuva\pgmanuva_num1eff.t32 + PGMANUVA_NUM2 Manuva\pgmanuva_num2.t32 + PGMANUVA_NUM2EFF Manuva\pgmanuva_num2eff.t32 + PGMANUVA_NUM3 Manuva\pgmanuva_num3.t32 + PGMANUVA_NUM3EFF Manuva\pgmanuva_num3eff.t32 + PGMANUVA_ZERO Manuva\pgmanuva_zero.t32 + +== Number : 10 fields (10 named, 0 positional) + PGHUD_ARMS_NUM ArmsSt\pghud_arms_num%d.t32 + PGHUD_HIT_NUM Hitmark\pghud_hit_num%d.t32 + PGHUD_HIT_NUM_EFF Hitmark\pghud_hit_num%deff.t32 + PGHUD_HIT_NUM_RED Hitmark\pghud_hit_num%dred.t32 + PGHUD_NUM pghud_num%d.t32 + PGHUD_SPEED_NUM Speed\pghud_speed_num%d.t32 + PGLOCKON_NUM Lockon\pglockon_%d.t32 + PGMARKTGT_NUM pgmarktgt_num%d.t32 + PGREMAIN_NUM pgremain_num%d.t32 + PGTIMER_NUM pgtimer_num%d.t32 + +== HudResource : 24 fields (24 named, 0 positional) + HUD_RES_FONT DFSOGE5.TTC + PGHUD_CAMERA pghud_camera.t32 + PGHUD_HITMARK Hitmark\pghud_hitmark.prt + PGHUD_HORIZONTAL pghud_cockpit_horizontal.t32 + PGHUD_LOCATOR pghud_target_locator.prt + PGHUD_LOCATOR_EASY pghud_target_locator_easy.prt + PGHUD_NOSE pghud_cockpit_nose.t32 + PGHUD_NUM_SEC pghud_num_sec.t32 + PGHUD_OBREMAINDER Hitmark\pghud_OBremainder.prt + PGHUD_PITCH_FRONT45 pghud_pitch_front45.t32 + PGHUD_PITCH_LEVEL pghud_pitch_level.t32 + PGHUD_PITCH_MINUS pghud_pitch_minus.t32 + PGHUD_PITCH_MINUSV pghud_pitch_minusV.t32 + PGHUD_PITCH_PLUS pghud_pitch_plus.t32 + PGHUD_PITCH_PLUSV pghud_pitch_plusV.t32 + PGHUD_PITCH_REAR45 pghud_pitch_rear45.t32 + PGHUD_SUBTARGET pghud_subtarget.prt + PGHUD_SUB_DOT pghud_sub_dot.t32 + PGHUD_YAW pghud_yaw.t32 + PGHUD_YAWV pghud_yawV.t32 + PGLOCKON Lockon\pglockon.t32 + PGMARKTGT_PERIOD pgmarktgt_period.t32 + PGREMAINING pgremaining.prt + PGTIMER pgtimer.prt + +== NamePlate : 60 fields (60 named, 0 positional) + NPR_AAFrigate pgmark_E_AAFrigate.t32 + NPR_ASFrigate pgmark_E_ASFrigate.t32 + NPR_Amalthea pgmark_F_Amalthea.t32 + NPR_ArrowHead pgmark_F_ArrowHead.t32 + NPR_Caliban pgmark_F_Caliban.t32 + NPR_Camael pgmark_E_Camael.t32 + NPR_Cargoship pgmark_F_Cargoship.t32 + NPR_Charon pgmark_F_Charon.t32 + NPR_Cyclops pgmark_E_Cyclops.t32 + NPR_E_Battleship pgmark_E_Battleship.t32 + NPR_E_Carrier pgmark_E_Carrier.t32 + NPR_E_Cruiser pgmark_E_Cruiser.t32 + NPR_E_Destroyer pgmark_E_Destroyer.t32 + NPR_Elan pgmark_E_Elan.t32 + NPR_ElanPlus pgmark_E_ElanPlus.t32 + NPR_F_Battleship pgmark_F_Battleship.t32 + NPR_F_Carrier pgmark_F_Carrier.t32 + NPR_F_Cruiser pgmark_F_Cruiser.t32 + NPR_F_Destroyer pgmark_F_Destroyer.t32 + NPR_F_ElanPlus pgmark_F_ElanPlus.t32 + NPR_Gargantua pgmark_E_Gargantua.t32 + NPR_GuiltyRoses pgmark_E_GuiltyRoses.t32 + NPR_Hellfires pgmark_E_Hellfires.t32 + NPR_ISCM pgmark_E_ISCM.t32 + NPR_Janus pgmark_F_Janus.t32 + NPR_Lady1 pgmark_F_Lady1.t32 + NPR_Lady2 pgmark_F_Lady2.t32 + NPR_Lady3 pgmark_F_Lady3.t32 + NPR_Margras pgmark_E_NR_Margras.t32 + NPR_MargrasTCAF pgmark_F_NR_Margras.t32 + NPR_Massive pgmark_E_Massive.t32 + NPR_Metatron pgmark_E_Metatron.t32 + NPR_Miranda pgmark_F_Miranda.t32 + NPR_Olympus pgmark_F_Olympus.t32 + NPR_Pandora pgmark_F_Pandora.t32 + NPR_Phantom pgmark_E_Phantom.t32 + NPR_SBattleship pgmark_E_SBattleship.t32 + NPR_Squire1 pgmark_F_Squire1.t32 + NPR_Squire2 pgmark_F_Squire2.t32 + NPR_Squire3 pgmark_F_Squire3.t32 + NPR_Squire4 pgmark_F_Squire4.t32 + NPR_Tanker pgmark_F_Tanker.t32 + NPR_Taskent pgmark_E_NR_Taskent.t32 + NPR_Turret pgmark_E_Turret.t32 + NPR_TurretPlus pgmark_E_TurretPlus.t32 + NPR_Vinson pgmark_F_Vinson.t32 + NP_ACROPOLIS pgmark_F_Acropolis.t32 + NP_ANTONIUS pgmark_F203_1.t32 + NP_BILLY pgmark_F202_1.t32 + NP_BIRD pgmark_F_Bird.t32 + NP_CARL pgmark_F204_1.t32 + NP_ELLEN01 pgmark_F103_1.t32 + NP_ELLEN02 pgmark_F104_2.t32 + NP_ELLEN07 pgmark_F102_7.t32 + NP_E_UNKNOWN pgmark_E_Unknown.t32 + NP_GENE02 pgmark_F102_2.t32 + NP_GENE07 pgmark_F103_7.t32 + NP_RAYMOND01 pgmark_F101_1.t32 + NP_SANDRA pgmark_F201_1.t32 + NP_YOJI07 pgmark_F104_7.t32 + +== ActiveArm : 13 fields (13 named, 0 positional) + PGHUD_ARMS_ACTIVE ActvArm\pghud_arms_active.prt + PGHUD_ARMS_ACTIVE1 ActvArm\pghud_arms_active1.prt + PGHUD_ARMS_ACTIVE1EM ActvArm\pghud_arms_active1em.prt + PGHUD_ARMS_ACTIVE1NUM ActvArm\pghud_arms_active1num.t32 + PGHUD_ARMS_ACTIVE1OH ActvArm\pghud_arms_active1oh.prt + PGHUD_ARMS_ACTIVE2 ActvArm\pghud_arms_active2.prt + PGHUD_ARMS_ACTIVE2EM ActvArm\pghud_arms_active2em.prt + PGHUD_ARMS_ACTIVE2NUM ActvArm\pghud_arms_active2num.t32 + PGHUD_ARMS_ACTIVE2OH ActvArm\pghud_arms_active2oh.prt + PGHUD_ARMS_ACTIVE3 ActvArm\pghud_arms_active3.prt + PGHUD_ARMS_ACTIVE3EM ActvArm\pghud_arms_active3em.prt + PGHUD_ARMS_ACTIVE3NUM ActvArm\pghud_arms_active3num.t32 + PGHUD_ARMS_ACTIVE3OH ActvArm\pghud_arms_active3oh.prt + +== Information : 15 fields (15 named, 0 positional) + PGINFO_FRIENDLYFIRE Info\pginfo_friendlyfire.prt + PGINFO_HIT Info\pginfo_hit.prt + PGINFO_KILL Info\pginfo_kill.prt + PGINFO_PADLOCK Info\pginfo_padlock.prt + PGINFO_REPLENISH Info\pginfo_replenish.prt + PGWARNING_COLLISION Info\pgwarning_collision.prt + PGWARNING_DAMAGE Info\pgwarning_damage.prt + PGWARNING_EMPTY Info\pgwarning_empty.prt + PGWARNING_LOCKON Info\pgwarning_lockon.prt + PGWARNING_LOW Info\pgwarning_low.prt + PGWARNING_MISSILE Info\pgwarning_missile.prt + PGWARNING_OVERHEAT Info\pgwarning_overheat.prt + PGWARNING_RELOAD Info\pgwarning_reloading.prt + PGWARNING_SHIELDDOWN Info\pgwarning_shielddown.prt + PGWARNING_WARNING Info\pgwarning_warning.prt + +== Wing : 23 fields (23 named, 0 positional) + PGHUD_WING1 Wing\pghud_wing1.t32 + PGHUD_WING1B Wing\pghud_wing1b.t32 + PGHUD_WING1R Wing\pghud_wing1r.t32 + PGHUD_WING1Y Wing\pghud_wing1y.t32 + PGHUD_WING2 Wing\pghud_wing2.t32 + PGHUD_WING2B Wing\pghud_wing2b.t32 + PGHUD_WING2R Wing\pghud_wing2r.t32 + PGHUD_WING2Y Wing\pghud_wing2y.t32 + PGHUD_WING3 Wing\pghud_wing3.t32 + PGHUD_WING3B Wing\pghud_wing3b.t32 + PGHUD_WING3R Wing\pghud_wing3r.t32 + PGHUD_WING3Y Wing\pghud_wing3y.t32 + PGHUD_WING4 Wing\pghud_wing4.t32 + PGHUD_WING4B Wing\pghud_wing4b.t32 + PGHUD_WING4R Wing\pghud_wing4r.t32 + PGHUD_WING4Y Wing\pghud_wing4y.t32 + PGHUD_WINGBASE Wing\pghud_wingbase.prt + PGHUD_WING_ACT_ATTACK Wing\pghud_wing_act_attack.prt + PGHUD_WING_ACT_DISPERSION Wing\pghud_wing_act_dispersion.prt + PGHUD_WING_ACT_FORMATION Wing\pghud_wing_act_formation.prt + PGHUD_WING_ACT_GUARD Wing\pghud_wing_act_guard.prt + PGHUD_WING_ALERT Wing\pghud_wing_alert.prt + PGHUD_WING_DAMAGE Wing\pghud_wing_damage.prt + +== ArmsItemFile : 59 fields (59 named, 0 positional) + Weapon_DSaber_P_wep_01_Beam pghud_arms_item_b01a.t32 + Weapon_DSaber_P_wep_02_Missile pghud_arms_item_d01c.t32 + Weapon_DSaber_P_wep_03_Cannon pghud_arms_item_g01b.t32 + Weapon_DSaber_P_wep_04_Missile pghud_arms_item_d02c.t32 + Weapon_DSaber_P_wep_05_ASMissile pghud_arms_item_e01d.t32 + Weapon_DSaber_P_wep_07_Cannon pghud_arms_item_g03b.t32 + Weapon_DSaber_P_wep_08_ASMissile pghud_arms_item_e05d.t32 + Weapon_DSaber_P_wep_09_Gun pghud_arms_item_a08c.t32 + Weapon_DSaber_P_wep_10_Gun pghud_arms_item_a03a.t32 + Weapon_DSaber_P_wep_11_Cannon pghud_arms_item_g06b.t32 + Weapon_DSaber_P_wep_12_Rocket pghud_arms_item_f06d.t32 + Weapon_DSaber_P_wep_13_Missile pghud_arms_item_d04c.t32 + Weapon_DSaber_P_wep_14_Laser pghud_arms_item_c01a.t32 + Weapon_DSaber_P_wep_19_Laser pghud_arms_item_c02a.t32 + Weapon_DSaber_P_wep_23_Cannon pghud_arms_item_g05b.t32 + Weapon_DSaber_P_wep_24_Beam pghud_arms_item_b04c.t32 + Weapon_DSaber_P_wep_25_HBeam pghud_arms_item_b06c.t32 + Weapon_DSaber_P_wep_26_Missile pghud_arms_item_d03d.t32 + Weapon_DSaber_P_wep_27_ASMissile pghud_arms_item_e03b.t32 + Weapon_DSaber_P_wep_28_Bomb pghud_arms_item_f07b.t32 + Weapon_DSaber_P_wep_29_Bomb pghud_arms_item_f05b.t32 + Weapon_DSaber_P_wep_30_ASMissile pghud_arms_item_e04d.t32 + Weapon_DSaber_P_wep_31_Bomb pghud_arms_item_f04b.t32 + Weapon_DSaber_P_wep_32_Missile pghud_arms_item_d05c.t32 + Weapon_DSaber_P_wep_33_Gun pghud_arms_item_a01a.t32 + Weapon_DSaber_P_wep_34_HBeam pghud_arms_item_b07b.t32 + Weapon_DSaber_P_wep_35_Gun pghud_arms_item_a02a.t32 + Weapon_DSaber_P_wep_36_Bomb pghud_arms_item_f08b.t32 + Weapon_DSaber_P_wep_37_Beam pghud_arms_item_b02a.t32 + Weapon_DSaber_P_wep_38_Shotgun pghud_arms_item_a05a.t32 + Weapon_DSaber_P_wep_39_Beam pghud_arms_item_b03a.t32 + Weapon_DSaber_P_wep_40_Gun pghud_arms_item_a04a.t32 + Weapon_DSaber_P_wep_41_Shotgun pghud_arms_item_a06a.t32 + Weapon_DSaber_P_wep_42_Shotgun pghud_arms_item_a07a.t32 + Weapon_DSaber_P_wep_43_Rocket pghud_arms_item_f02d.t32 + Weapon_DSaber_P_wep_48_Cannon pghud_arms_item_g02d.t32 + Weapon_DSaber_P_wep_50_Cannon pghud_arms_item_g04b.t32 + Weapon_DSaber_P_wep_52_Special pghud_arms_item_h03b.t32 + Weapon_DSaber_P_wep_53_Beam pghud_arms_item_b05c.t32 + Weapon_DSaber_P_wep_54_Laser pghud_arms_item_c03c.t32 + Weapon_DSaber_P_wep_55_Rocket pghud_arms_item_f01c.t32 + Weapon_DSaber_P_wep_56_Special pghud_arms_item_h02c.t32 + Weapon_DSaber_P_wep_57_Rocket pghud_arms_item_f03c.t32 + Weapon_DSaber_P_wep_58_Laser pghud_arms_item_c04d.t32 + Weapon_DSaber_P_wep_59_Special pghud_arms_item_h01a.t32 + Weapon_DSaber_P_wep_60_ASMissile pghud_arms_item_e02d.t32 + Weapon_DSaber_P_wep_62_Beam pghud_arms_item_b08d.t32 + Weapon_DSaber_P_wep_66_Special pghud_arms_item_h05c.t32 + Weapon_DSaber_P_wep_67_Special pghud_arms_item_h07d.t32 + Weapon_DSaber_P_wep_68_Special pghud_arms_item_h08b.t32 + Weapon_DSaber_P_wep_69_Special pghud_arms_item_h09b.t32 + Weapon_DSaber_P_wep_70_Special pghud_arms_item_h06d.t32 + Weapon_DSaber_P_wep_71_Special pghud_arms_item_h04c.t32 + Weapon_DSaber_P_wep_80_Rocket pghud_arms_item_f09b.t32 + Weapon_DSaber_P_wep_81_Missile pghud_arms_item_d06b.t32 + Weapon_DSaber_P_wep_82_Laser pghud_arms_item_c05b.t32 + Weapon_DSaber_P_wep_83_Gun pghud_arms_item_a09b.t32 + Weapon_DSaber_P_wep_84_Cannon pghud_arms_item_g07b.t32 + Weapon_DSaber_P_wep_85_Beam pghud_arms_item_b09a.t32 + +== Radar : 29 fields (29 named, 0 positional) + PGGAUGE_ARMOR Radar\pggauge_armor.prt + PGGAUGE_ARMOR_BAR Radar\pggauge_armor_bar.t32 + PGGAUGE_ARMOR_DIFF Radar\pggauge_armor_diff.t32 + PGGAUGE_ARMOR_EFF1 Radar\pggauge_armor_eff1.prt + PGGAUGE_MAIN Radar\pggauge_main.prt + PGGAUGE_MAIN_BAR Radar\pggauge_main_bar.t32 + PGGAUGE_MAIN_HEAT Radar\pggauge_main_heat.prt + PGGAUGE_MAIN_HEAT_BAR Radar\pggauge_main_heat_bar.t32 + PGGAUGE_NOSE Radar\pggauge_nose.prt + PGGAUGE_NOSE_BAR Radar\pggauge_nose_bar.t32 + PGGAUGE_NOSE_HEAT Radar\pggauge_nose_heat.prt + PGGAUGE_NOSE_HEAT_BAR Radar\pggauge_nose_heat_bar.t32 + PGGAUGE_SHIELD Radar\pggauge_shield.prt + PGGAUGE_SHIELD_BAR Radar\pggauge_shield_bar.t32 + PGGAUGE_SHIELD_DIFF Radar\pggauge_shield_diff.t32 + PGGAUGE_SHIELD_EFF1 Radar\pggauge_shield_eff1.prt + PGGAUGE_TYPE_ASM Radar\pggauge_type_ASM.t32 + PGGAUGE_TYPE_BM Radar\pggauge_type_BM.t32 + PGGAUGE_TYPE_BR Radar\pggauge_type_BR.t32 + PGGAUGE_TYPE_CN Radar\pggauge_type_CN.t32 + PGGAUGE_TYPE_GUN Radar\pggauge_type_GUN.t32 + PGGAUGE_TYPE_LINE Radar\pggauge_type_line.t32 + PGGAUGE_TYPE_LS Radar\pggauge_type_LS.t32 + PGGAUGE_TYPE_MPM Radar\pggauge_type_MPM.t32 + PGGAUGE_TYPE_SPC Radar\pggauge_type_SPC.t32 + PGRADAR Radar\pgradar.prt + PGRADAR_CIRCLE Radar\pgradar_circle.t32 + PGRADAR_NOSE Radar\pgradar_nose.t32 + PGRADAR_SQUARE Radar\pgradar_square.t32 + +== Speed : 9 fields (9 named, 0 positional) + PGHUD_SPEED Speed\pghud_speed.prt + PGHUD_SPEED_CUT Speed\pghud_speed_cut.prt + PGHUD_SPEED_ENGINE_BAR Speed\pghud_speed_engine_bar.t32 + PGHUD_SPEED_MARK Speed\pghud_speed_mark.t32 + PGHUD_SPEED_MARK_OUT1 Speed\pghud_speed_mark_out1.prt + PGHUD_SPEED_MARK_OUT2 Speed\pghud_speed_mark_out2.prt + PGHUD_SPEED_MATCH Speed\pghud_speed_match.prt + PGHUD_SPEED_MEM Speed\pghud_speed_mem.t32 + PGHUD_SPEED_MINUS Speed\pghud_speed_minus.t32 + +== Sight : 35 fields (35 named, 0 positional) + PGCHARGE Sight\pgcharge.prt + PGCHARGE_BAR Sight\pgcharge_bar.t32 + PGCHARGE_CHARGE Sight\pgcharge_charge.prt + PGCHARGE_READY Sight\pgcharge_ready.prt + PGTARGET_AMM_B Sight\pgtarget_amm_b.t32 + PGTARGET_AMM_L Sight\pgtarget_amm_l.t32 + PGTARGET_AMM_N Sight\pgtarget_amm_n.t32 + PGTARGET_BEAM Sight\pgtarget_beam.prt + PGTARGET_BOM Sight\pgtarget_bom.prt + PGTARGET_CANNON Sight\pgtarget_cannon.prt + PGTARGET_GUN Sight\pgtarget_gun.prt + PGTARGET_G_MISSILE Sight\pgtarget_G_missile.prt + PGTARGET_LASER Sight\pgtarget_laser.prt + PGTARGET_SP_ACTIVE Sight\pgtarget_sp_active.t32 + PGTARGET_SP_BUMBLE_B Sight\pgtarget_sp_bumble_b.t32 + PGTARGET_SP_BUMBLE_L Sight\pgtarget_sp_bumble_l.t32 + PGTARGET_SP_BUMBLE_N Sight\pgtarget_sp_bumble_n.t32 + PGTARGET_SP_COMPLETE Sight\pgtarget_sp_complete.t32 + PGTARGET_SP_ENERGYOUT Sight\pgtarget_sp_energyout.t32 + PGTARGET_SP_EXSHIELD Sight\pgtarget_sp_exshield.t32 + PGTARGET_SP_EXSHIELD_RED Sight\pgtarget_sp_exshield_red.t32 + PGTARGET_SP_JAMMING Sight\pgtarget_sp_jamming.t32 + PGTARGET_SP_JAMMING_RED Sight\pgtarget_sp_jamming_red.t32 + PGTARGET_SP_NOTAVAILABLE Sight\pgtarget_sp_notavailable.t32 + PGTARGET_SP_NOTAVAILABLE_DLH Sight\pgtarget_sp_notavailable_DLH.t32 + PGTARGET_SP_OVERHEAT Sight\pgtarget_sp_overheat.t32 + PGTARGET_SP_READY Sight\pgtarget_sp_ready.t32 + PGTARGET_SP_READY_DLH Sight\pgtarget_sp_ready_DLH.t32 + PGTARGET_SP_REPAIRING Sight\pgtarget_sp_repairing.t32 + PGTARGET_SP_REPAIRING_RED Sight\pgtarget_sp_repairing_red.t32 + PGTARGET_SP_SUPPORTFIRE Sight\pgtarget_sp_supportfire.t32 + PGTARGET_SP_SUPPORTFIRE_DLH Sight\pgtarget_sp_supportfire_DLH.t32 + PGTARGET_SP_SUPPORTFIRE_DLH_RED Sight\pgtarget_sp_supportfire_DLH_red.t32 + PGTARGET_SP_SUPPORTFIRE_RED Sight\pgtarget_sp_supportfire_red.t32 + PGTARGET_S_MISSILE Sight\pgtarget_S_missile.prt + +== Face : 52 fields (0 named, 52 positional) + [ 0] pjf001_A01.t32 + [ 1] pjf001_A02.t32 + [ 2] pjf001_A03.t32 + [ 3] pjf001_A04.t32 + [ 4] pjf001_A05.t32 + [ 5] pjf001_B01.t32 + [ 6] pjf001_B02.t32 + [ 7] pjf001_B03.t32 + [ 8] pjf001_C01.t32 + [ 9] pjf001_C02.t32 + [10] pjf001_C03.t32 + [11] pjf002_A01.t32 + [12] pjf002_A02.t32 + [13] pjf002_A03.t32 + [14] pjf002_A04.t32 + [15] pjf002_B01.t32 + [16] pjf002_B02.t32 + [17] pjf002_B03.t32 + [18] pjf002_C01.t32 + [19] pjf002_C02.t32 + [20] pjf002_C03.t32 + [21] pjf002_C04.t32 + [22] pjf003_A01.t32 + [23] pjf003_A02.t32 + [24] pjf003_A03.t32 + [25] pjf003_B01.t32 + [26] pjf003_B02.t32 + [27] pjf003_C01.t32 + [28] pjf003_C02.t32 + [29] pjf004_A01.t32 + [30] pjf004_A02.t32 + [31] pjf004_A03.t32 + [32] pjf004_B01.t32 + [33] pjf005_A01.t32 + [34] pjf005_A02.t32 + [35] pjf005_A03.t32 + [36] pjf005_B01.t32 + [37] pjf005_B02.t32 + [38] pjf006_A01.t32 + [39] pjf006_A02.t32 + [40] pjf006_A03.t32 + [41] pjf006_B01.t32 + [42] pjf006_B02.t32 + [43] pjf006_B03.t32 + [44] pjf007_A01.t32 + [45] pjf007_B01.t32 + [46] pjf007_B02.t32 + [47] pjf008_A01.t32 + [48] pjf008_B01.t32 + [49] pjf008_B02.t32 + [50] pjf009_A01.t32 + [51] pjf009_A02.t32 + +== ResourceTable : 58 fields (0 named, 58 positional) + [ 0] HudResource.tbl + [ 1] HudMarkerResource.tbl + [ 2] HudResource.tbl + [ 3] HudMarkerResource.tbl + [ 4] HudResource.tbl + [ 5] HudMarkerResource.tbl + [ 6] HudResource.tbl + [ 7] HudMarkerResource.tbl + [ 8] HudResource.tbl + [ 9] HudMarkerResource.tbl + [10] HudResource.tbl + [11] HudMarkerResource.tbl + [12] HudResource.tbl + [13] HudMarkerResource.tbl + [14] HudResource.tbl + [15] HudMarkerResource.tbl + [16] HudResource.tbl + [17] HudMarkerResource.tbl + [18] HudResource.tbl + [19] HudMarkerResource.tbl + [20] HudResource.tbl + [21] HudMarkerResource.tbl + [22] HudResource.tbl + [23] HudMarkerResource.tbl + [24] HudResource.tbl + [25] HudMarkerResource.tbl + [26] HudResource.tbl + [27] HudMarkerResource.tbl + [28] HudResource.tbl + [29] HudMarkerResource.tbl + [30] HudResource.tbl + [31] HudMarkerResource.tbl + [32] HudResource.tbl + [33] HudMarkerResource.tbl + [34] HudResource.tbl + [35] HudMarkerResource.tbl + [36] HudResource.tbl + [37] HudMarkerResource.tbl + [38] HudResource.tbl + [39] HudMarkerResource.tbl + [40] HudResource.tbl + [41] HudMarkerResource.tbl + [42] HudResource.tbl + [43] HudMarkerResource.tbl + [44] HudResource.tbl + [45] HudMarkerResource.tbl + [46] HudResource.tbl + [47] HudMarkerResource.tbl + [48] HudResource.tbl + [49] HudMarkerResource.tbl + [50] HudResource_S26.tbl + [51] HudMarkerResource_S26.tbl + [52] HudResource.tbl + [53] HudMarkerResource.tbl + [54] HudResource.tbl + [55] HudMarkerResource.tbl + [56] HudResource.tbl + [57] HudMarkerResource.tbl + +== ObjectiveMarker_Acropolis : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFB0FFFF + ColorEmphasis2 0xFF00E0FF + ColorNormal 0xFF00FFFF + Emphasis pgmark_em_ho.prt + EmphasisSub + HPGauge 1 + HPGaugeSub 0 + Normal pgmark_ho.t32 + NormalSub + RadarCursorType Circle + TutorialTarget No + +== Parameters : 4 fields (4 named, 0 positional) + HelpMarker ObjectiveMarker_SubObjective + ReloadDispTime 0.1 + TargetMarker ObjectiveMarker_Target + TutoTargetMarker TutorialMarker_Target + +== ObjectiveMarker_SubObjective : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFFFFD0 + ColorEmphasis2 0xFFFFFF00 + ColorNormal 0xFFFFFF00 + Emphasis + EmphasisSub + HPGauge 2 + HPGaugeSub 0 + Normal pgmark_help.prt + NormalSub pgmark_help_s.prt + RadarCursorType + TutorialTarget No + +== ObjectiveMarker_Guard : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFF60FF60 + ColorEmphasis2 0xFFC0FFC0 + ColorNormal 0xFF20FF20 + Emphasis pgmark_em_ga.prt + EmphasisSub + HPGauge 1 + HPGaugeSub 0 + Normal pgmark_ga.t32 + NormalSub + RadarCursorType Rectangle + TutorialTarget No + +== TutorialMarker_WayPoint : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFF60FF60 + ColorEmphasis2 0xFFC0FFC0 + ColorNormal 0xFF20FF20 + Emphasis + EmphasisSub + HPGauge 0 + HPGaugeSub 0 + Normal pgmark_ld.t32 + NormalSub + RadarCursorType + TutorialTarget No + +== TutorialMarker_NoMark : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFFA010 + ColorEmphasis2 0xFFFFD090 + ColorNormal 0xFFFFA010 + Emphasis + EmphasisSub + HPGauge 2 + HPGaugeSub 0 + Normal + NormalSub + RadarCursorType + TutorialTarget Yes + +== Enumerate_ObjectiveMarkers : 11 fields (11 named, 0 positional) + ObjectiveMarker_Acropolis + ObjectiveMarker_Guard + ObjectiveMarker_SubObjective + ObjectiveMarker_Tanker + ObjectiveMarker_Target + ObjectiveMarker_WayPoint + TutorialMarker_Acropolis + TutorialMarker_NoMark + TutorialMarker_Tanker + TutorialMarker_Target + TutorialMarker_WayPoint + +== TutorialMarker_Tanker : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFFA010 + ColorEmphasis2 0xFFFFD090 + ColorNormal 0xFFFFA010 + Emphasis pgmark_em_ta.prt + EmphasisSub + HPGauge 2 + HPGaugeSub 0 + Normal pgmark_ta.t32 + NormalSub + RadarCursorType + TutorialTarget Yes + +== TutorialMarker_Target : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFFA010 + ColorEmphasis2 0xFFFFD090 + ColorNormal 0xFFFFA010 + Emphasis pgmark_em_ob.prt + EmphasisSub pgmark_em_ob_s.prt + HPGauge 2 + HPGaugeSub 0 + Normal pgmark_ob.t32 + NormalSub pgmark_ob_s.t32 + RadarCursorType + TutorialTarget Yes + +== ObjectiveMarker_WayPoint : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFF60FF60 + ColorEmphasis2 0xFFC0FFC0 + ColorNormal 0xFF20FF20 + Emphasis pgmark_em_wp.prt + EmphasisSub + HPGauge 0 + HPGaugeSub 0 + Normal pgmark_wp.t32 + NormalSub + RadarCursorType + TutorialTarget No + +== ObjectiveMarker_Tanker : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFB0FFFF + ColorEmphasis2 0xFF00E0FF + ColorNormal 0xFF00FFFF + Emphasis pgmark_em_ta.prt + EmphasisSub + HPGauge 2 + HPGaugeSub 0 + Normal pgmark_ta.t32 + NormalSub + RadarCursorType Circle + TutorialTarget No + +== TutorialMarker_Acropolis : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFFA010 + ColorEmphasis2 0xFFFFD090 + ColorNormal 0xFFFFA010 + Emphasis pgmark_em_ho.prt + EmphasisSub + HPGauge 1 + HPGaugeSub 0 + Normal pgmark_ho.t32 + NormalSub + RadarCursorType + TutorialTarget Yes + +== ObjectiveMarker_Target : 12 fields (12 named, 0 positional) + BlinkCycle 0x800 + ColorEmphasis1 0xFFFF0000 + ColorEmphasis2 0xFF800000 + ColorNormal 0xFFFF0000 + Emphasis pgmark_em_ob.prt + EmphasisSub pgmark_em_ob_s.prt + HPGauge 2 + HPGaugeSub 0 + Normal pgmark_ob.t32 + NormalSub pgmark_ob_s.t32 + RadarCursorType + TutorialTarget No + +## CONTROL do the config's own path values resolve as pak entries? + distinct .prt/.t32/.tbl values: 419 ; resolving under 10 prefixes: 0 + the config FILENAMES themselves: + HudResource.tbl no hit + HudMarkerResource.tbl no hit + HudResource_S26.tbl no hit + HudMarkerResource_S26.tbl no hit + +## ResourceTable -- 29 pairs, one per stage, with a single override + GP_MAIN_GAME_D2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] + GP_MAIN_GAME_E2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] + GP_MAIN_GAME_F2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] + GP_MAIN_GAME_I2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] + GP_MAIN_GAME_J2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] + GP_MAIN_GAME_S2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')] diff --git a/docs/re/structures/hud-config.md b/docs/re/structures/hud-config.md new file mode 100644 index 00000000..7258af72 --- /dev/null +++ b/docs/re/structures/hud-config.md @@ -0,0 +1,70 @@ +# โœ… The in-game HUD configuration โ€” 16 records, and a per-stage resource table + +The `GP_MAIN_GAME_*2D.pak` archives carry **six IDXD entries** that are the +in-game counterpart of `tables.pak`'s menu configs. Only `HudResource` had been +opened ([mission-script-manifest](mission-script-manifest.md)); the other +**fifteen** records had not. No `docs/re/` file mentions `ArmsStatus`, +`RangeFinder`, `Radar`, `Sight`, `Wing`, `NamePlate` or `ResourceTable` โ€” +checked before writing this. Artefact `../data/hud-config.txt` (697 lines), +regenerator `tools/re-capture/hud_config.py`. + +| entry | records | +|---|---| +| `0x10b9d584`, `0x4abcfc43` | **16** โ€” `ArmsStatus`, `Map`, `ArmsItem`, `RangeFinder`, `Marker`, `Manuva`, `Number`, `HudResource`, `NamePlate`, `ActiveArm`, `Information`, `Wing`, `ArmsItemFile`, `Radar`, `Speed`, `Sight` | +| `0x927b29f8`, `0xccb12a6b` | **13** โ€” `ObjectiveMarker_{Acropolis,SubObjective,Guard,WayPoint,Tanker,Target}`, `TutorialMarker_{โ€ฆ}`, `Enumerate_ObjectiveMarkers`, `Parameters` | +| `0x59ecbedd` | `Face` โ€” 52 positional `pjf001_*.t32` portrait sprites | +| `0x87fd28c0` | `ResourceTable` โ€” 58 positional entries | + +Between them these name **419** distinct asset paths. That is the whole flight +HUD: the arms panel (`ArmsStatus` 16, `ActiveArm` 13, `ArmsItemFile` 59), the +range finder (10), the target/lock markers and their HP-gauge strips (`Marker` +27), the manoeuvre gauge (`Manuva` 15), the radar (29), the reticle (`Sight` +35), the wingman panel (`Wing` 23), nameplates (60), speed (9), and the digit +strips (`Number`, `%d`-templated: `pghud_speed_num%d.t32`, `pgtimer_num%d.t32`, +`pglockon_%d.t32`). + +๐Ÿ”‘ The values carry **subdirectory prefixes** the corpus had not seen โ€” +`ArmsSt\`, `ActvArm\`, `RangeF\`, `Marker\`, `Manuva\`, `Map\`, `Speed\`, +`Radar\`, `Sight\`, `Wing\`, `Hitmark\`, `Lockon\`, `Info\`. + +## ๐Ÿงช The whole in-game HUD is NOT name-hash addressed + +Taking the config's **own exact path strings** โ€” no guessing left in the loop: + +> **419 distinct `.prt` / `.t32` / `.tbl` values; 0 resolve as a pak entry** +> under 10 prefixes. The four config FILENAMES (`HudResource.tbl`, +> `HudMarkerResource.tbl`, and their `_S26` overrides) resolve to nothing +> either. + +The `.t32` sprites certainly exist โ€” the E2D pak holds **574 T8aD** entries. So +the 2D pak's contents are simply **not addressed by `name_hash` of the name the +config uses**, and that closes the previous iteration's puzzle properly: the 28 +"dangling" `.prt` names were never a missing-asset story, they are 28 of a set +where **none** of the 419 resolves. + +โš ๏ธ This supersedes the framing in +[mission-script-manifest](mission-script-manifest.md#-the-other-six-values-do-not-resolve--with-a-working-control): +the right statement is not "these five/28 are absent" but "**the in-game asset +namespace is not the archive namespace**". + +## โœ… `ResourceTable` โ€” a per-stage HUD config table + +58 positional fields = **29 pairs**, alternating +`HudResource.tbl` / `HudMarkerResource.tbl`. Exactly one pair differs โ€” index +**25**, which reads `HudResource_S26.tbl` / `HudMarkerResource_S26.tbl`. +**Identical in all six language paks.** + +๐ŸŸก The reading: the table is indexed by **stage number โˆ’ 1**, so 29 entries +cover S1โ€ฆS29 (the numbering [that runs to S29 with S17 absent](stage-numbering-and-player-craft.md)), +and index 25 is **S26 โ€” the one stage with its own HUD configuration**. The +arithmetic is exact and the `_S26` suffix names the same stage, but nothing here +proves the indexing, so this is **a reading, not adopted**. + +## ๐ŸŸก Not settled + +* How the 2D pak's 574 T8aD and 130 RATC entries *are* addressed, if not by + `name_hash` of the config path. That is now the question. +* What `HudMarkerResource.tbl` is โ€” presumably the 13-record marker entry, but + the filename does not resolve, so the pairing is by content, not by hash. +* `Parameters` (4 fields) and `Enumerate_ObjectiveMarkers` (11) are in the + artefact but unread here. diff --git a/tools/re-capture/hud_config.py b/tools/re-capture/hud_config.py new file mode 100644 index 00000000..07e4d6cb --- /dev/null +++ b/tools/re-capture/hud_config.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""The in-game HUD configuration in the `GP_MAIN_GAME_*2D.pak` IDXD entries. + +Regenerates docs/re/data/hud-config.txt. +""" +import sys, os, glob, collections + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, HERE) +import unitgroup as U +from unit_substructures import pak_entries + +PRE = ['', '2d\\', 'ui\\', 'hud\\'] + [l + '\\' for l in ('eng', 'jpn', 'fra', 'deu', 'ita', 'esp')] +DEFAULT = ('HudResource.tbl', 'HudMarkerResource.tbl') + +def main(): + p2 = glob.glob('/work/sylph_extract/**/GP_MAIN_GAME_E2D.pak', recursive=True)[0] + E = dict(pak_entries(p2)) + H = set() + for pk in sorted(glob.glob('/work/sylph_extract/**/*.pak', recursive=True)): + for h, b in pak_entries(pk): + H.add(h) + + print("# The in-game HUD configuration (GP_MAIN_GAME_*2D.pak, IDXD entries)") + print("# Regenerate: python3 tools/re-capture/hud_config.py") + print("# See docs/re/structures/hud-config.md") + + print("\n## the six IDXD entries of GP_MAIN_GAME_E2D.pak") + for h, b in sorted(pak_entries(p2)): + if b[:4] != b'IDXD': continue + recs = U.parse(b) + print(" %08x %2d records: %s" % (h, len(recs), ", ".join(r['squadron'] for r in recs))) + + print("\n## every config record, field by field") + seen = set() + for h, b in sorted(pak_entries(p2)): + if b[:4] != b'IDXD': continue + for r in U.parse(b): + if r['squadron'] in seen: continue + seen.add(r['squadron']) + n = U.named(r) + pos = [v for t, nm, v in r['fields'] if nm is None] + print("\n== %s : %d fields (%d named, %d positional)" + % (r['squadron'], len(r['fields']), len(n), len(pos))) + for k, v in sorted(n.items()): + print(" %-28s %s" % (k, v)) + for i, v in enumerate(pos): + print(" [%2d] %s" % (i, v)) + + vals = set() + for h, b in pak_entries(p2): + if b[:4] != b'IDXD': continue + for r in U.parse(b): + for t, nm, v in r['fields']: + if v.endswith('.prt') or v.endswith('.t32') or v.endswith('.tbl'): + vals.add(v) + ok = [v for v in vals if any(U.name_hash(q + v) in H for q in PRE)] + print("\n## CONTROL do the config's own path values resolve as pak entries?") + print(" distinct .prt/.t32/.tbl values: %d ; resolving under %d prefixes: %d" + % (len(vals), len(PRE), len(ok))) + print(" the config FILENAMES themselves:") + for n in list(DEFAULT) + ['HudResource_S26.tbl', 'HudMarkerResource_S26.tbl']: + print(" %-30s %s" % (n, 'resolves' if any(U.name_hash(q + n) in H for q in PRE) else 'no hit')) + + print("\n## ResourceTable -- 29 pairs, one per stage, with a single override") + for pk in sorted(glob.glob('/work/sylph_extract/**/GP_MAIN_GAME_*2D.pak', recursive=True)): + for h, b in pak_entries(pk): + if b[:4] != b'IDXD': continue + for r in U.parse(b): + if r['squadron'] != 'ResourceTable': continue + vv = [v for t, nm, v in r['fields']] + odd = [(i, v) for i, v in enumerate(vv) if v not in DEFAULT] + print(" %-26s %2d fields = %d pairs ; non-default at %s" + % (os.path.basename(pk), len(vv), len(vv) // 2, odd)) + +if __name__ == "__main__": + main()