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.
This commit is contained in:
92
docs/re/structures/arsenal-item-weapon-chain.md
Normal file
92
docs/re/structures/arsenal-item-weapon-chain.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# ✅✅ 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](unit-substructure-records.md) 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](unit-substructure-records.md) 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](../arsenal-develop-economy.md) 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.
|
||||
@@ -94,11 +94,16 @@ declared=1 records=2 x1 UN_e001_ADAN_Elan_EX4
|
||||
declared=8 records=9 x1 UN_e107_ADAN_AAFrigate_EX4
|
||||
```
|
||||
|
||||
🟡 The reading — **not adopted**: on the player craft the `Turret_NNN` list is
|
||||
a *hardpoint catalogue* and `TurretCount 4` is how many mount at once. It fits
|
||||
(63 slots, all `Frame=GN_mnt`, all `IsAuto=No`, 10 distinct `WeaponID`s across
|
||||
them, and the tutorial variants carry a cut-down 5) but nothing here shows the
|
||||
selection. The two `+1` warship/craft cases are unexplained.
|
||||
✅ **ADOPTED the next day** — on the player craft the `Turret_NNN` list is a
|
||||
*hardpoint catalogue* and `TurretCount 4` is how many mount at once. The
|
||||
Arsenal table proves it from an independent file: **59/59 of its items name a
|
||||
`Turret_NNN` slot in `PlayerWeapon`**, see
|
||||
[arsenal-item-weapon-chain](arsenal-item-weapon-chain.md). The two `+1`
|
||||
warship/craft cases are still unexplained.
|
||||
|
||||
⚠️ The "10 distinct `WeaponID`s" measured here is the **AI** variant
|
||||
`UN_f001_TCAF_DeltaSaber_T`. The `_Player` variants give the same 59 slots
|
||||
**59 distinct** weapon records — wingmen fly a collapsed 10-class set.
|
||||
|
||||
## 🧪 Control 2 — turret weapons resolve into the weapon datasheet
|
||||
|
||||
|
||||
Reference in New Issue
Block a user