Files
Sylpheed/docs/re/structures/arsenal-item-weapon-chain.md
Sylpheed RE agent 2519427bab re: the 59-of-131 arsenal question is closed -- an item names a hardpoint
An Arsenal item does not reference a Weapon record.  It references a
Turret_NNN HARDPOINT SLOT on the player craft's own unit table, and the
slot is what carries the WeaponID.  Three hops:

  Arbalest_155KG.PlayerWeapon -> Turret_050  (a slot on
  UN_f001_TCAF_DeltaSaber_T_Player) -> .WeaponID ->
  Weapon_DSaber_P_wep_50_Cannon

Controls, both in the same loop: 0/59 distinct PlayerWeapon values are a
Weapon.ID; 59/59 are a Turret_NNN slot id; the full chain lands on a
Weapon.ID 59/59.  WingmanWeapon resolves identically.  The WEAPONS
roster's 59 = 55 item names + 4 empty-slot sentinels.

Wingmen fly a cheaper gun: following the same 59 slots across craft
variants, the _Player tables give each item its own weapon record (59
distinct) while the AI tables collapse all 59 onto 10 generic classes.
That is most of the 131.

Upgrades yesterday's 'hardpoint catalogue' reading from 21 to adopted,
proved from an independent file, and corrects its '10 distinct WeaponID'
figure -- that was the AI variant, not the player's.

Also adds an __main__ guard to unit_substructures.py so importing
pak_entries from it does not run its report; its artefact is unchanged
and still byte-identical.
2026-08-27 12:49:22 +00:00

4.2 KiB

The 59-of-131 arsenal question — an item names a HARDPOINT, not a weapon

Open since the weapon datasheet was decoded: the Hangar's arsenal lists 59 weapons, the disc's Weapon table has 131, and the previous pass showed the two name sets overlap in 0 values. This closes it.

An Arsenal item does not reference a Weapon record. It references a Turret_NNN HARDPOINT SLOT on the player craft's own unit table, and the slot is what carries the WeaponID. Three hops:

GP_HANGAR_ARSENAL.pak      Arbalest_155KG
   .PlayerWeapon    ───▶   Turret_050            (a slot on UN_f001_TCAF_DeltaSaber_T_Player)
       .WeaponID    ───▶   Weapon_DSaber_P_wep_50_Cannon   (a Weapon record)

Artefact ../data/arsenal-chain.txt, regenerator tools/re-capture/arsenal_chain.py.

🧪 The controls

WEAPONS roster values 59
arsenal ITEM records (field set Model/Package/PlayerWeapon/Points/Power/Range/…) 59
item names that are roster values 55
roster values with no item record 4 — No_Equipment, NullWeapon_Arm1/2/3
distinct PlayerWeapon values that are a Weapon.ID 0 / 59
distinct PlayerWeapon values that are a Turret_NNN slot id 59 / 59
the full chain lands on a Weapon.ID 59 / 59

WingmanWeapon resolves identically, 59/59. The 4 roster entries with no item record are the empty-slot sentinels, so the roster is 55 real weapons + 4 nulls against 59 item records — the item table is the superset.

🔑 Wingmen fly a cheaper gun

Following the same 59 slots on different craft variants splits them cleanly:

craft variant slots distinct Weapon.ID reached
…DeltaSaber_T_Player, _W_Player, _A_Player 63 59 (Weapon_DSaber_P_wep_NN_*)
…DeltaSaber_T, _W, _T_EX5, _T_EX5_el 63 10 (Weapon_TCAF_DeltaSaber_Beam, …_Gun, …)

Same slot ids, same 59 arsenal items, but the _Player tables give each item its own weapon record while the AI tables collapse all 59 onto 10 generic behaviour classes. A wingman carrying an Arbalest_155KG does not fire the player's wep_50 ballistics.

That also explains the 131: 59 player weapons + 10 AI-Saber classes + the ship guns and ADAN weapons the turrets use.

Four of the player craft's 63 slots are referenced by no item: Turret_000 (the Weapon_NULL slot) and Turret_097 / _098 / _099.

Upgrades a 🟡 from the previous pass

unit-substructure-records read the player craft's 63 Turret_NNN records as "a hardpoint catalogue, TurretCount 4 = how many mount at once", marked 🟡 because nothing showed the selection. The arsenal table is the selection, from an independent file, 59/59. Adopted.

The item record

Model / Package            rou_f001_wep_50_hangar (+ .xpr)   the Hangar display mesh
PlayerPackage / _LOD / _Motion    rou_f001_wep_50.xpr, Equip_EnumLODSet_wep_50.tbl,
WingmanPackage / _LOD / _Motion   Equip_EnumGameModel_wep_50.tbl
SilhouetteModel            rou_f001_wep_50_NA
PlayerWeapon / WingmanWeapon      Turret_050
Points 25000   Stage 6            develop cost, and the stage that unlocks it
Power B  Range B  Size L  Speed -  Weight 1.5    the Hangar's stat bars
Type g04b                  the slot-compatibility class
Dependency  MissionObjective      (empty on this item)

Model ties an arsenal entry to the meshes the corpus already decodes; Points and Stage are the develop economy that arsenal-develop-economy recovered from the screen side.

🟡 Not settled

  • Type (g04b) is a slot-compatibility class. STANDARD_ARM1/2/3, STANDARD_NOSE, PlayerSET_*, ExSET_*, S01SET_*, S02SET_* are records whose only field is Type — the per-slot allow-lists — and the loadout records (Bird1-Sandra, Rhino1-Katana, … with Arm1/Arm2/Arm3/Nose/ UnitID) are the wingman loadouts. Named here, not opened.
  • Dependency and MissionObjective are empty on the sampled item; what fills them elsewhere is unread.
  • Which Weapon records the 26 never-on-a-turret weapons are.