diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 0ab92680..955effd0 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -827,6 +827,38 @@ 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 "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.** + [structures/mission-script-manifest](structures/mission-script-manifest.md), + artefact `data/prt-parts.txt` (+45 lines, 0 deletions — purely additive). + ❌ Censused the 32 bundle-less in-game names with the 68 as control: **4 of 32 + appear as an ELEMENT of some 2D bundle, against 58 of 68**. Being an element is + normal for a part that exists; these are not elements either. The reading I + flagged as "not adopted" last iteration is now **refuted**. **28 names are + neither a bundle nor an element.** + 🔑 They are not unreferenced: a **`HudResource`** record inside the 2D paks' + OWN IDXD entries names them — the in-game screen config, exactly parallel to + `tables.pak` for menus. `GP_MAIN_GAME_E2D.pak` has 6 IDXD entries; two carry + `HudResource` (24 named fields: `PGTIMER`, `PGREMAINING`, `PGHUD_SUBTARGET`, + `PGHUD_LOCATOR_EASY`, the pitch-ladder/yaw/cockpit `.t32` sprites, `HUD_RES_FONT + = DFSOGE5.TTC`) beside `ArmsStatus`, `Map`, `ArmsItem`, `RangeFinder`, + `Marker`, `Manuva`, `Number`; two more carry `ObjectiveMarker_*` / + `TutorialMarker_*`. + ⚠️ Its values carry **subdirectory prefixes** — `Hitmark\`, `Lockon\` — which + my hand-written prefix list never had. + 🧪 **So I rebuilt the negative the right way round**: harvested every `IDXD` + field value containing a backslash, kept the 60 commonest directories + (`Sight\`, `Radar\`, `Marker\`, `Wing\`, `ArmsSt\`, `Manuva\`, `Hitmark\`, + `Lockon\`, the `\Voice\` and `\etc\` trees) and re-swept. + **241/376 with the hand list; 241 with hand + harvested — zero new + resolutions.** After the `language\` miss this is the closure that counts: the + prefix list came from the disc, not from me. + 🟡 Still open: whether the 28 are cut features or assembled at runtime from + sprites — nothing static separates those two. The family: + `pghud_range_*`, `pghud_wing_*`, `pghud_arms_active*`, `pgtarget_*`, + `pgmanuva_eff2/3`, `pggauge_*_eff1`, `pgtimer`, `pgremaining`, `pgmsg_update`. + * ✅ **(2026-08-27) AN EMBEDDED PART IS A TOP-LEVEL RATC BUNDLE, ADDRESSED BY ITS ELEMENT PREFIX — 68 of 100, against 0 of 241 for the shipped parts.** [structures/mission-script-manifest](structures/mission-script-manifest.md), diff --git a/docs/re/data/prt-parts.txt b/docs/re/data/prt-parts.txt index cf15bc58..b707dfd2 100644 --- a/docs/re/data/prt-parts.txt +++ b/docs/re/data/prt-parts.txt @@ -104,6 +104,51 @@ pgtarget_laser.prt pgtimer.prt +## REFUTED the bundle-less names are NOT variants declared in a parent bundle + in-game names WITHOUT their own bundle (32): appear as an ELEMENT of some 2D bundle: 4 + CONTROL in-game names WITH a bundle (68): appear as an element: 58 + neither a bundle nor an element -- 28 names: + pggauge_armor_eff1.prt + pggauge_shield_eff1.prt + pghud_GAremainder.prt + pghud_OBremainder.prt + pghud_arms_active1em.prt + pghud_arms_active1oh.prt + pghud_arms_active2em.prt + pghud_arms_active2oh.prt + pghud_arms_active3em.prt + pghud_arms_active3oh.prt + pghud_range_bar_em.prt + pghud_range_main.prt + pghud_range_nose.prt + pghud_subtarget.prt + pghud_target_locator_easy.prt + pghud_wing_act_dispersion.prt + pghud_wing_alert.prt + pghud_wing_damage.prt + pgmanuva_eff2.prt + pgmanuva_eff3.prt + pgmark_em_ob_s.prt + pgmsg_update.prt + pgremaining.prt + pgtarget_G_missile.prt + pgtarget_cannon.prt + pgtarget_gun.prt + pgtarget_laser.prt + pgtimer.prt + +## CONTROL a prefix list harvested from the DATA adds nothing + directory prefixes taken from IDXD path values: 60 + jpn\Voice\ x2699 + eng\Voice\ x2382 + jpn\etc\ x2220 + eng\etc\ x1821 + Sight\ x420 + game:\hidden\ x348 + Radar\ x348 + Marker\ x324 + .prt resolving with the hand list 241 ; with hand+harvested 241 (of 376) + ## `_sub.rat` sub-bundles inside RATC distinct _sub.rat names: 11 pgmsg_end_sub.rat in 6 archives ['GP_MAIN_GAME_D2D.pak', 'GP_MAIN_GAME_E2D.pak'] diff --git a/docs/re/structures/mission-script-manifest.md b/docs/re/structures/mission-script-manifest.md index 41cc9f94..0bfadf82 100644 --- a/docs/re/structures/mission-script-manifest.md +++ b/docs/re/structures/mission-script-manifest.md @@ -191,8 +191,55 @@ beside `pgmanuva_eff0`, `pgtarget_*` — which reads as "a variant declared insi a parent bundle rather than a bundle of its own". **A reading, not adopted**; nothing here shows the variant mechanism. -**Still not settled**: those 32, and `pgmsg_update`, which is absent from every -route tried. What is +### ❌ The "variant inside a parent bundle" reading is REFUTED + +Censused the 32, with the 68 as the control: + +| | appear as an ELEMENT of some 2D bundle | +|---|---:| +| the 32 **without** their own bundle | **4** | +| **control** — the 68 **with** one | **58** | + +Being an element is normal for a part that exists (58/68); the bundle-less ones +are not elements either. **28 names are neither a bundle nor an element.** + +### 🔑 `HudResource` — the in-game counterpart of `tables.pak` + +The 28 are not unreferenced: they are named by a **`HudResource`** record inside +the 2D paks' *own* IDXD entries — the in-game screen config, exactly parallel to +`tables.pak` for menus. `GP_MAIN_GAME_E2D.pak` has 6 IDXD entries; two carry +`HudResource` (24 named fields) beside `ArmsStatus`, `Map`, `ArmsItem`, +`RangeFinder`, `Marker`, `Manuva`, `Number`, and two more carry the +`ObjectiveMarker_*` / `TutorialMarker_*` set. + +``` +HUD_RES_FONT DFSOGE5.TTC PGHUD_LOCATOR pghud_target_locator.prt +PGHUD_HITMARK Hitmark\pghud_hitmark.prt PGLOCKON Lockon\pglockon.t32 +PGHUD_OBREMAINDER Hitmark\pghud_OBremainder.prt PGTIMER pgtimer.prt +PGHUD_SUBTARGET pghud_subtarget.prt PGREMAINING pgremaining.prt +… plus the pitch ladder / yaw / cockpit `.t32` sprites +``` + +🔑 Its values carry **subdirectory prefixes** — `Hitmark\`, `Lockon\` — which my +hand-written prefix list never had. + +### 🧪 Control — a prefix list harvested from the data adds nothing + +Took every `IDXD` field value containing a backslash, kept the 60 commonest +directories (`Sight\`, `Radar\`, `Marker\`, `Wing\`, `ArmsSt\`, `Manuva\`, +`Hitmark\`, `Lockon\`, the `\Voice\` and `\etc\` trees …) and +re-ran the sweep. **241 of 376 with the hand list; 241 with hand + harvested.** +Zero new resolutions. After the `language\` miss, this is the negative built the +right way round: the prefix list came from the disc, not from me. + +**So 28 `.prt` names are referenced by the in-game configs and exist nowhere on +the disc** — not an entry, not a bundle, not an element, under any prefix the +data itself supplies. A coherent HUD family: `pghud_range_*`, `pghud_wing_*`, +`pghud_arms_active*`, `pgtarget_*`, `pgmanuva_eff2/3`, `pggauge_*_eff1`, +`pgtimer`, `pgremaining`, `pgmsg_update`. + +**Still not settled**: whether the 28 are cut features or built at runtime from +sprites. Nothing static can separate those two. What is now settled is that they are **not** pak entries while 241 of their siblings are, and that `pgmsg_update` is the odd one out even among them. diff --git a/tools/re-capture/prt_parts.py b/tools/re-capture/prt_parts.py index 5de2ac06..015320d1 100644 --- a/tools/re-capture/prt_parts.py +++ b/tools/re-capture/prt_parts.py @@ -30,6 +30,8 @@ def main(): names = set() ref = collections.defaultdict(set) pref2d, prefall = set(), set() + elem2d = collections.defaultdict(set) + dirs = collections.Counter() rat = collections.defaultdict(set) for pk in sorted(glob.glob('/work/sylph_extract/**/*.pak', recursive=True)): base = os.path.basename(pk) @@ -45,8 +47,16 @@ def main(): pfx = os.path.commonprefix([_stem(x) for x in e]).rstrip('_') if pfx: prefall.add(pfx) - if '2D.pak' in base: - pref2d.add(pfx) + if '2D.pak' in base: + if pfx: pref2d.add(pfx) + for x in e: elem2d[_stem(x)].add(pfx) + if b[:4] == b'IDXD': + try: rr = U.parse(b) + except Exception: rr = [] + for r in rr: + for t, nm, v in r['fields']: + if '\\' in v and v.count('\\') <= 2 and len(v) < 64: + dirs[v.rsplit('\\', 1)[0] + '\\'] += 1 print("# Where `.prt` screen parts live") print("# Regenerate: python3 tools/re-capture/prt_parts.py") @@ -100,6 +110,28 @@ def main(): for n in resid: print(" %s" % n) + have = [n for n in ing if n[:-4] in pref2d or n[:-4] + '_sub' in pref2d] + lack = [n for n in ing if n not in have] + asel = lambda n: n[:-4] in elem2d or n[:-4] + '_sub' in elem2d + print("\n## REFUTED the bundle-less names are NOT variants declared in a parent bundle") + print(" in-game names WITHOUT their own bundle (%d): appear as an ELEMENT of some 2D bundle: %d" + % (len(lack), sum(1 for n in lack if asel(n)))) + print(" CONTROL in-game names WITH a bundle (%d): appear as an element: %d" + % (len(have), sum(1 for n in have if asel(n)))) + dangling = sorted(n for n in lack if not asel(n)) + print(" neither a bundle nor an element -- %d names:" % len(dangling)) + for n in dangling: + print(" %s" % n) + + extra = [d for d, _ in dirs.most_common(60)] + print("\n## CONTROL a prefix list harvested from the DATA adds nothing") + print(" directory prefixes taken from IDXD path values: %d" % len(extra)) + for d, c in dirs.most_common(8): + print(" %-30s x%d" % (d, c)) + both = sum(1 for n in names if any(U.name_hash(q + n) in H for q in PRE + extra)) + print(" .prt resolving with the hand list %d ; with hand+harvested %d (of %d)" + % (len(hit), both, len(names))) + print("\n## `_sub.rat` sub-bundles inside RATC") print(" distinct _sub.rat names: %d" % len(rat)) for k in sorted(rat):