From bb37b1684749485468a81de5fe446f1a5bc34ac4 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Thu, 27 Aug 2026 14:53:49 +0000 Subject: [PATCH] re: the in-game HUD config -- 16 records, 419 asset paths, a per-stage ResourceTable 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, two the 13-record ObjectiveMarker_*/TutorialMarker_* set, one Face (52 portrait sprites), one ResourceTable. Between them they name 419 distinct asset paths -- the whole flight HUD -- with new subdirectory prefixes throughout (ArmsSt, ActvArm, RangeF, Marker, Manuva, Map, Speed, Radar, Sight, Wing, Hitmark, Lockon, Info). The decisive control uses the config's own exact path strings, so no guessing is left in the loop: 419 distinct .prt/.t32/.tbl values, ZERO resolve as a pak entry under 10 prefixes, and 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. ResourceTable is 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. Reading: indexed by stage number minus 1, so index 25 is S26, the one stage with its own HUD config. Arithmetic exact, indexing unproven, not adopted. New structure doc, artefact and regenerator; the other seven regenerate byte-identical. --- docs/re/BACKLOG.md | 38 ++ docs/re/INDEX.md | 1 + docs/re/data/hud-config.txt | 697 +++++++++++++++++++++++++++++++ docs/re/structures/hud-config.md | 70 ++++ tools/re-capture/hud_config.py | 77 ++++ 5 files changed, 883 insertions(+) create mode 100644 docs/re/data/hud-config.txt create mode 100644 docs/re/structures/hud-config.md create mode 100644 tools/re-capture/hud_config.py 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()