From 82a3207745c1f9e11aea38416e6f3fbf3e2564f3 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Fri, 28 Aug 2026 04:17:15 +0000 Subject: [PATCH] re: EnumWeapon_EX5.tbl adds exactly one weapon; a tutorial expectation refuted Diffed S28's bespoke weapon table against the common one. The disc has exactly three weapon tables, and each is a single EnumWeapon record whose FIELD NAMES are the weapons - the Enumerate-style declaration shape again: EnumWeapon_Test.tbl 126 names EnumWeapon_EX5.tbl 127 names = the same 126, same order, plus one EnumWeapon_Tutorial.tbl 9 names = a strict subset of Test union 127 The whole of S28's bespoke table is one extra weapon, Weapon_TCAF_Ship_AAGun_EX5. Zero removals, identical order on the shared 126. That explains one of weapon-struct-runtime's five "never instantiated" disc records: the AA-gun variant is declared by EnumWeapon_EX5.tbl only, and that table belongs to S28 alone, which the captured save was not playing. It also refutes that document's expectation that "running the tutorial should instantiate the _Ttrl pair". It will not: EnumWeapon_Tutorial.tbl's nine names are Weapon_NULL, Weapon_ADAN_Puppy_NoseGun, Weapon_DSaber_P_wep_{01_Beam, 02_Missile,58_Laser} and Weapon_TCAF_DeltaSaber_{Beam,Cannon,Missile, ASMissile} - neither _Ttrl weapon is among them. Four of the five uninstantiated records are declared by no weapon table on the disc at all. EX is still not identified but narrowed hard: the entire content of S28's own weapon table is a single _EX5 AA-gun variant, and the only other _EX5 name on the disc is UN_f001_TCAF_DeltaSaber_T_EX5. All fifteen artefacts byte-identical. --- docs/re/BACKLOG.md | 41 +++++++++++++++++++++ docs/re/structures/weapon-struct-runtime.md | 22 ++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index e523cb3a..233c2ccb 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -6145,3 +6145,44 @@ Written up in `docs/re/structures/stage-numbering-and-player-craft.md`. 🟑 Not settled: what `EX` stands for; the two unnamed `_Test` variant objects; what `Placement_*`/`RouteTest_*` are for. + +--- + +## βœ…πŸ”΄ 2026-08-28 β€” `EnumWeapon_EX5.tbl` adds exactly one weapon, and a tutorial expectation is refuted + +Item (a): diff S28's bespoke weapon table against the common one. + +βœ… **The disc has exactly three weapon tables**, and each is a **single +`EnumWeapon` record whose *field names* are the weapons** β€” the `Enumerate`-style +declaration shape again: + +``` +EnumWeapon_Test.tbl 126 names +EnumWeapon_EX5.tbl 127 names = the same 126, same order, PLUS one +EnumWeapon_Tutorial.tbl 9 names = a strict subset of Test +union 127 +``` + +**The whole of S28's bespoke table is one extra weapon: +`Weapon_TCAF_Ship_AAGun_EX5`.** Zero removals, identical order on the shared 126. + +βœ… **That explains one of [[weapon-struct-runtime]]'s five "never instantiated" +disc records** β€” the AA-gun variant is declared by `EnumWeapon_EX5.tbl` only, and +that table belongs to **S28 alone**, which the captured save was not playing. + +πŸ”΄ **And it refutes that document's expectation.** It says "Running the tutorial +should instantiate the `_Ttrl` pair". It will not: `EnumWeapon_Tutorial.tbl`'s +nine names are `Weapon_NULL`, `Weapon_ADAN_Puppy_NoseGun`, +`Weapon_DSaber_P_wep_{01_Beam,02_Missile,58_Laser}` and +`Weapon_TCAF_DeltaSaber_{Beam,Cannon,Missile,ASMissile}` β€” **neither +`Weapon_TCAF_DeltaSaber_NoseGun_Ttrl` nor `_Laser_Ttrl` is among them.** Four of +the five uninstantiated records (`_NoseGun_Ttrl`, `_Laser_Ttrl`, `_NoseGun_None`, +`Weapon_ADAN_Attacker_S_GunTurret`) are **declared by no weapon table on the +disc at all** β€” a static answer to a question the runtime capture left open. + +❔ **`EX` is still not identified**, but it is narrowed hard: the entire content of +S28's own weapon table is a single `_EX5` AA-gun variant, and the only other +`_EX5` name on the disc is `UN_f001_TCAF_DeltaSaber_T_EX5`. + +🟑 Not settled: what `EX` stands for; the two unnamed `_Test` variant objects; +what `Placement_*`/`RouteTest_*` are for. diff --git a/docs/re/structures/weapon-struct-runtime.md b/docs/re/structures/weapon-struct-runtime.md index e9cc00f1..7a5f591e 100644 --- a/docs/re/structures/weapon-struct-runtime.md +++ b/docs/re/structures/weapon-struct-runtime.md @@ -262,8 +262,26 @@ whole `…Ratio` family that blocked Route B is simply "no penalty". objects; the 5 with no runtime object are context variants that this save never loads β€” `Weapon_TCAF_DeltaSaber_NoseGun_Ttrl` / `_Laser_Ttrl` (tutorial), `_NoseGun_None`, `Weapon_TCAF_Ship_AAGun_EX5`, - `Weapon_ADAN_Attacker_S_GunTurret`. Running the tutorial should instantiate - the `_Ttrl` pair. No runtime object lacked a disc record. + `Weapon_ADAN_Attacker_S_GunTurret`. No runtime object lacked a disc record. + + βœ…πŸ”΄ **Followed up statically 2026-08-28 β€” and "running the tutorial should + instantiate the `_Ttrl` pair" is refuted.** The disc has exactly **three** + weapon tables, and each is a single `EnumWeapon` record whose *field names* are + the weapons: `EnumWeapon_Test.tbl` (126), `EnumWeapon_EX5.tbl` (**127 β€” the + same 126 plus one**), `EnumWeapon_Tutorial.tbl` (**9, a strict subset of + Test**). Union: **127**. + + | of the five | declared by | + |---|---| + | `Weapon_TCAF_Ship_AAGun_EX5` | **`EnumWeapon_EX5.tbl` only** β€” and that table belongs to **S28 alone** ([[stage-numbering-and-player-craft]]) | + | `_NoseGun_Ttrl`, `_Laser_Ttrl`, `_NoseGun_None`, `Weapon_ADAN_Attacker_S_GunTurret` | **no weapon table at all** | + + So one of the five is explained β€” it loads only in Stage 28 β€” and the other + four are **declared by nothing on the disc**, tutorial included: the nine names + in `EnumWeapon_Tutorial.tbl` are `Weapon_NULL`, `Weapon_ADAN_Puppy_NoseGun`, + `Weapon_DSaber_P_wep_{01_Beam,02_Missile,58_Laser}` and + `Weapon_TCAF_DeltaSaber_{Beam,Cannon,Missile,ASMissile}` β€” **neither `_Ttrl` + weapon is among them.** Running the tutorial will not instantiate them. - Defaulted `Power` values vary per weapon (1, 10, 100, 300, 500, 1000), so they are **not** one constructor constant. Where they come from β€” the IDXD's undecoded binary node/index region, or per-type code defaults β€” is **not