re: the variant reading is refuted; HudResource is the in-game screen config
Censused the 32 bundle-less in-game .prt 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. Last iteration's 'not adopted' reading is 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, 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; two more carry the ObjectiveMarker_*/TutorialMarker_* set. 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, 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. Artefact +45 lines / 0 deletions; the other six regenerate byte-identical.
This commit is contained in:
@@ -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 `<lang>\Voice\` and `<lang>\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),
|
||||
|
||||
@@ -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)
|
||||
|
||||
## `<stem>_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']
|
||||
|
||||
@@ -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 `<lang>\Voice\` and `<lang>\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.
|
||||
|
||||
|
||||
@@ -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## `<stem>_sub.rat` sub-bundles inside RATC")
|
||||
print(" distinct _sub.rat names: %d" % len(rat))
|
||||
for k in sorted(rat):
|
||||
|
||||
Reference in New Issue
Block a user