re: the static weapon datasheet -- Weapon, Shell, AssortMissileParam
The corpus's weapon numbers came from a runtime capture; the static tables are now read with no emulator. The move: IDXD field names are literal strings in the pool, so the stat-shaped keys already harvested from the disassembly (MegaTons, GuidanceType, SpiralType, ...) can be searched directly. 8648 records carry at least one, clustering on three record names in every per-language GP_MAIN_GAME_*.pak: Weapon 131 records, 21 fields -- the launcher Shell 131 records, 37 fields -- the projectile AssortMissileParam 9 records, 20 fields -- missile guidance 131, not the 59 of the WEAPONS roster: that roster is the arsenal menu's list, not the full set. Controlled negative in the same pass: stageNN_settings.tbl does not exist. AUTO_SETTINGS names 28; four path prefixes give 0/116 while both controls in the same loop are found. Also decoded: EnumUnit (54 unit ids tying eNNN/fNNN mesh prefixes to faction/class names), ArmsItemFile (59 weapon -> HUD icon mappings), SETTINGS (sound config), Parameters (HUD markers). New structure doc + artefact; ISL artefacts byte-identical.
This commit is contained in:
@@ -786,6 +786,47 @@ unknown, what evidence exists, and what the first step would be. Move an item in
|
||||
and the corpus's existing weapon datasheet came from a runtime capture, so the
|
||||
static table behind it is still unlocated.
|
||||
|
||||
* ✅✅ **(2026-08-27) THE STATIC WEAPON DATASHEET IS FOUND — `Weapon` (131),
|
||||
`Shell` (131), `AssortMissileParam` (9).
|
||||
[structures/weapon-datasheet-static](structures/weapon-datasheet-static.md),
|
||||
artefact `data/weapon-shell-static.txt`.**
|
||||
The corpus's weapon numbers came from a RUNTIME capture; the static tables
|
||||
behind them are now read with no emulator. 🔑 **The move: IDXD field names are
|
||||
literal strings in the pool**, so the stat-shaped keys already harvested from
|
||||
the disassembly (`MegaTons`, `GuidanceType`, `SpiralType`, `Straight1Type`, …)
|
||||
can be searched directly. **8 648 records carry at least one**, clustering on
|
||||
three record names in every per-language `GP_MAIN_GAME_*.pak`.
|
||||
**`Weapon`** (21 fields): `ID`/`Name`, `TargetType Vessel,Craft,Structure`,
|
||||
`ShotType`, `HitRatio`, `Interval`, `TriggerShotCount`/`TriggerShotInterval`,
|
||||
`LoadingCount`, `Heating`/`Cooling`, `SprayAngle`, `Mass`, `ReticleType`, plus
|
||||
SE and muzzle-flash FX names.
|
||||
**`Shell`** (37 fields): `Power`, `Velocity`, `Acceleration`, `AngularVelocity`,
|
||||
`MinimumRange`/`MaximumRange`, `LifeTime`, `CollisionType Capsule`,
|
||||
`Radius`/`Length`/`Volume`, `ShellMass`, `HP`, `DamageType`, `MovementType`,
|
||||
`IsGravitated`/`IsDestructible`/`IsLockable`/`IsFullCollision`, `Color_R/G/B`,
|
||||
`ShellModel`, hit/jet/contrail FX and SE. With **world unit = 1 metre**, the
|
||||
sample rocket is 6 km range at 3 km/s.
|
||||
**`AssortMissileParam`** (20 fields): the guidance model — `GuidanceType`,
|
||||
`SpiralType`, `Straight1Type/2Type` and min/max ranges for three named motion
|
||||
modes (`sp_sp_*` spiral, `sp_qu_*` quick-turn, `sp_zg_*` zig-zag) plus straight
|
||||
aperture/pitch. Nine variants ship.
|
||||
⚠️ **131, not 59.** The `WEAPONS` roster read last iteration lists 59 — that is
|
||||
the *arsenal menu's* list, not the full weapon set.
|
||||
🔴 **Controlled negative in the same pass: `stageNN_settings.tbl` does not
|
||||
exist.** `AUTO_SETTINGS` names 28 of them; probing pak entry names with **four**
|
||||
path prefixes finds **0 / 116**, while the two controls in the same loop
|
||||
(`stage\UnitGroup_S02.tbl`, `stage\AIParams_S02.tbl`) are **both found**. Same
|
||||
shape as `STAGENN_UNIT_MAX` — named but not shipped.
|
||||
📎 Also decoded on the way: `EnumUnit` = 54 real unit ids
|
||||
(`UN_e107_ADAN_AAFrigate`, `UN_f102_TCAF_LightCarrier_Inv`, …), tying the
|
||||
`eNNN`/`fNNN` mesh prefixes to readable faction/class names; `ArmsItemFile` = 59
|
||||
weapon-id → HUD icon `.t32` mappings (icons, not stats); `SETTINGS` in
|
||||
`tables.pak` = the sound config (`PATH game:\dat\sound.pak+`,
|
||||
`PARAM Pj_Silph.xgs`, member `BANK_SE`); `Parameters` = HUD marker config.
|
||||
🟡 Not settled: reconciling the 131 records against the runtime capture field by
|
||||
field; the stat keys in records not opened here (`MegaTons`, `BulletLimit`,
|
||||
`CrewCount`, `HP_CLASS`); why the roster lists 59 of 131.
|
||||
|
||||
## ✅✅ SOLVED — the mission freeze was a modal sign-in dialog (2026-08-26)
|
||||
|
||||
`XamShowSigninUI` opens a modal dialog and `xeXamDispatchDialog` blocks the
|
||||
|
||||
@@ -99,6 +99,7 @@ files, which is how the same ground got covered twice.
|
||||
| [`structures/sound-cue-table.md`](structures/sound-cue-table.md) | The cue index in `tables.pak` — message id -> cue -> sound id -> `.slb` bank | ✅ CONFIRMED, 1 326/1 338 script message ids bind to a bank; SOUNDS and FILES agree on the same 12 absentees, 0 orphan files |
|
||||
| [`structures/cutscene-message-table.md`](structures/cutscene-message-table.md) | Cutscene dialogue — speaker, portrait, on-screen seconds, audio cue per page | ✅ CONFIRMED, field count = 9·PageCount+2 for all 7 PageCounts, 1 252/1 252 caption keys match, 138 ids close both ways |
|
||||
| [`structures/isl-mission-timer.md`](structures/isl-mission-timer.md) | The mission timer — two sequential countdowns, not a limit and a warning | ✅ CONFIRMED — read from `sub_822639B8`; the threshold reading is |
|
||||
| [`structures/weapon-datasheet-static.md`](structures/weapon-datasheet-static.md) | The static weapon datasheet — `Weapon`, `Shell`, `AssortMissileParam` | ✅ CONFIRMED — 131 Weapon + 131 Shell + 9 AssortMissileParam records read |
|
||||
| [`structures/isl-timers.md`](structures/isl-timers.md) | A ScriptPhase owns 32 stopwatches, and they count seconds | ✅ CONFIRMED — the advance is read from `sub_822710D0`, the unit from |
|
||||
| [`structures/isl-message-dialogue-link.md`](structures/isl-message-dialogue-link.md) | Mission scripts as dialogue — built-in 64 -> message id -> caption text | ✅ CONFIRMED total, 2 683/2 683 call sites across all 28 stages resolve, no residue |
|
||||
| [`structures/mission-objective-counter.md`](structures/mission-objective-counter.md) | `REMAINING OB` — the mission's own objective counter, in RAM | ✅ CONFIRMED for one Stage 02 run: a big-endian u32 whose value |
|
||||
|
||||
236
docs/re/data/weapon-shell-static.txt
Normal file
236
docs/re/data/weapon-shell-static.txt
Normal file
@@ -0,0 +1,236 @@
|
||||
# The STATIC weapon datasheet: `Weapon`, `Shell`, `AssortMissileParam`
|
||||
|
||||
Found by scanning every IDXD record for the stat-shaped FIELD names taken from
|
||||
the config-key vocabulary (`MegaTons`, `GuidanceType`, `SpiralType`, ...). IDXD
|
||||
field names are literal strings in the pool, so they can be searched directly.
|
||||
These are the static tables behind the corpus's RUNTIME weapon/Shell capture.
|
||||
|
||||
## Record counts per pak
|
||||
GP_MAIN_GAME_D.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_D.pak Shell 131
|
||||
GP_MAIN_GAME_D.pak Weapon 131
|
||||
GP_MAIN_GAME_E.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_E.pak Shell 131
|
||||
GP_MAIN_GAME_E.pak Weapon 131
|
||||
GP_MAIN_GAME_F.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_F.pak Shell 131
|
||||
GP_MAIN_GAME_F.pak Weapon 131
|
||||
GP_MAIN_GAME_I.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_I.pak Shell 131
|
||||
GP_MAIN_GAME_I.pak Weapon 131
|
||||
GP_MAIN_GAME_J.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_J.pak Shell 131
|
||||
GP_MAIN_GAME_J.pak Weapon 131
|
||||
GP_MAIN_GAME_S.pak AssortMissileParam 9
|
||||
GP_MAIN_GAME_S.pak Shell 131
|
||||
GP_MAIN_GAME_S.pak Weapon 131
|
||||
|
||||
## Weapon -- 31 distinct field names, 131 distinct IDs
|
||||
Cooling in 786 records
|
||||
Cracker_ShotInterval in 6 records
|
||||
Cracker_SubShotCount in 6 records
|
||||
FinishSE in 762 records
|
||||
Heating in 786 records
|
||||
HitRatio in 786 records
|
||||
ID in 786 records
|
||||
Interval in 786 records
|
||||
IsCharging in 48 records
|
||||
LoadingCount in 786 records
|
||||
LockIntervalMulti in 618 records
|
||||
LockIntervalSingle in 618 records
|
||||
Mass in 786 records
|
||||
MaximumCharging in 18 records
|
||||
MinimumCharging in 18 records
|
||||
MultiTargetCount in 6 records
|
||||
MuzzleFlashFxModel_Loop in 768 records
|
||||
MuzzleFlashFxModel_OneShot in 768 records
|
||||
Name in 786 records
|
||||
OverlapLockon in 618 records
|
||||
ReadyInterval in 762 records
|
||||
ReadySE in 762 records
|
||||
ReticleType in 450 records
|
||||
ShootSE in 786 records
|
||||
ShotType in 768 records
|
||||
Skip in 24 records
|
||||
SpecialWeaponType in 438 records
|
||||
SprayAngle in 786 records
|
||||
TargetType in 780 records
|
||||
TriggerShotCount in 786 records
|
||||
TriggerShotInterval in 786 records
|
||||
sample record (GP_MAIN_GAME_D.pak entry 091d7331):
|
||||
TargetType Vessel,Craft,Structure
|
||||
MuzzleFlashFxModel_Loop eff_e0054
|
||||
HitRatio 1.0
|
||||
ReadyInterval 0.0
|
||||
ShotType Single
|
||||
MuzzleFlashFxModel_OneShot
|
||||
Interval 1.0
|
||||
ReticleType 5
|
||||
TriggerShotCount 1
|
||||
Name WeaponCannonName_TCAF_DeltaSaber_Rocket_P
|
||||
ID Weapon_TCAF_DeltaSaber_Rocket_P
|
||||
ReadySE SE_SW_nvu03_2
|
||||
Mass 100
|
||||
ShootSE SE_SWP_VULCAN_1
|
||||
TriggerShotInterval 0.1
|
||||
Heating 0.00
|
||||
LoadingCount 1000
|
||||
Cooling 0.10
|
||||
SpecialWeaponType 0
|
||||
SprayAngle 4.0
|
||||
FinishSE SE_SW_nvu03_3
|
||||
|
||||
## Shell -- 71 distinct field names, 130 distinct IDs
|
||||
Acceleration in 786 records
|
||||
AngularVelocity in 786 records
|
||||
BeginGuidanceTime in 180 records
|
||||
BeginGuidanceTimeAdjust in 180 records
|
||||
Chaff in 6 records
|
||||
ChaffResistRatio in 162 records
|
||||
ChargingDamageRatio in 18 records
|
||||
ChargingSizeRatio in 18 records
|
||||
CollisionType in 786 records
|
||||
Color_B in 786 records
|
||||
Color_G in 786 records
|
||||
Color_R in 786 records
|
||||
ContrailFxFrame in 762 records
|
||||
CustomParams in 108 records
|
||||
DamageType in 786 records
|
||||
EMP in 12 records
|
||||
EndGuidanceTime in 180 records
|
||||
EndGuidanceTimeAdjust in 180 records
|
||||
ExplosionDamage_Core in 6 records
|
||||
ExplosionDamage_Maximum in 54 records
|
||||
ExplosionDamage_OuterEdge in 60 records
|
||||
ExplosionLifeTime in 60 records
|
||||
ExplosionRadius_Core in 6 records
|
||||
ExplosionRadius_OuterEdge in 6 records
|
||||
ExplosionTurnTime in 54 records
|
||||
Explosion_MaxDamageRadius in 54 records
|
||||
FadeInTime in 120 records
|
||||
FadeOutTime in 120 records
|
||||
FailedDamageRatio in 786 records
|
||||
GuidanceType in 114 records
|
||||
HP in 786 records
|
||||
HitFxInEnd in 768 records
|
||||
HitFxModel in 762 records
|
||||
HitSE_Damage in 786 records
|
||||
HitSE_NoDamage in 786 records
|
||||
ID in 786 records
|
||||
IsDestructible in 786 records
|
||||
IsFixedModel in 96 records
|
||||
IsFullCollision in 786 records
|
||||
IsGravitated in 786 records
|
||||
IsLockable in 786 records
|
||||
JetFxFrame in 762 records
|
||||
JetFxModel in 762 records
|
||||
Length in 786 records
|
||||
LifeTime in 786 records
|
||||
ManeuverResistRatio in 162 records
|
||||
MaximumRange in 786 records
|
||||
MaximumVelocity in 786 records
|
||||
MinimumRange in 786 records
|
||||
MinimumVelocity in 786 records
|
||||
MovementType in 786 records
|
||||
Name in 786 records
|
||||
PlayerLaserPower in 84 records
|
||||
Power in 786 records
|
||||
Radius in 786 records
|
||||
ShellMass in 786 records
|
||||
ShellModel in 762 records
|
||||
SphereRadiusBegin in 60 records
|
||||
SphereRadiusEnd in 60 records
|
||||
SphereRadiusTurn in 54 records
|
||||
Spiral_BeginTime in 180 records
|
||||
Spiral_BeginTimeAdjust in 180 records
|
||||
Spiral_EndTime in 180 records
|
||||
Spiral_EndTimeAdjust in 180 records
|
||||
SplitCone in 12 records
|
||||
SplitTime_Maximum in 12 records
|
||||
SplitTime_Minimum in 12 records
|
||||
SubMissileID in 12 records
|
||||
ThrusterSE in 786 records
|
||||
Velocity in 786 records
|
||||
Volume in 786 records
|
||||
sample record (GP_MAIN_GAME_D.pak entry 091d7331):
|
||||
Power 100.0
|
||||
LifeTime 3.0
|
||||
HitSE_NoDamage SE_IMP_MISSILE
|
||||
AngularVelocity 0.0
|
||||
MinimumVelocity 0.0
|
||||
MaximumVelocity 0.0
|
||||
CollisionType Capsule
|
||||
Velocity 3000.0
|
||||
HitSE_Damage SE_IMP_MISSILE
|
||||
Length 10.0
|
||||
Radius 30.0
|
||||
Volume 10.0
|
||||
Name WeaponShellName_TCAF_DeltaSaber_Rocket_P
|
||||
FailedDamageRatio 1.0
|
||||
ShellMass 0.005
|
||||
ID Shell_TCAF_DeltaSaber_Rocket_P
|
||||
HP 0.0
|
||||
IsFixedModel Yes
|
||||
Color_B 0.7
|
||||
Color_G 0.85
|
||||
IsDestructible No
|
||||
Color_R 1.0
|
||||
HitFxInEnd Yes
|
||||
IsGravitated Yes
|
||||
MinimumRange 10.0
|
||||
Acceleration 0.0
|
||||
MaximumRange 6000.0
|
||||
JetFxFrame
|
||||
JetFxModel
|
||||
HitFxModel eff_h000
|
||||
IsLockable No
|
||||
DamageType Shell
|
||||
ContrailFxFrame GN_Trc_01
|
||||
ShellModel wep_t085
|
||||
MovementType Shell
|
||||
ThrusterSE SE_MW_wAA0x_2
|
||||
IsFullCollision No
|
||||
|
||||
## AssortMissileParam -- 20 distinct field names, 0 distinct IDs
|
||||
GuidanceType in 54 records
|
||||
SpiralType in 54 records
|
||||
Straight1Type in 54 records
|
||||
Straight2Type in 54 records
|
||||
sp_qu_bias_pow_max in 54 records
|
||||
sp_qu_bias_pow_min in 54 records
|
||||
sp_qu_cycle_time_max in 54 records
|
||||
sp_qu_cycle_time_min in 54 records
|
||||
sp_sp_round_time_max in 54 records
|
||||
sp_sp_round_time_min in 54 records
|
||||
sp_sp_spiral_pow_max in 54 records
|
||||
sp_sp_spiral_pow_min in 54 records
|
||||
sp_zg_bias_max in 54 records
|
||||
sp_zg_bias_min in 54 records
|
||||
sp_zg_cycle_max in 54 records
|
||||
sp_zg_cycle_min in 54 records
|
||||
st1_df_aperture in 54 records
|
||||
st1_df_pitch in 54 records
|
||||
st1_up_aperture in 54 records
|
||||
st1_up_bias_pow in 54 records
|
||||
sample record (GP_MAIN_GAME_D.pak entry 155bb764):
|
||||
st1_df_aperture 0.5
|
||||
SpiralType 1
|
||||
st1_up_bias_pow 0.5
|
||||
Straight1Type 1
|
||||
Straight2Type 0
|
||||
st1_up_aperture 1.0
|
||||
sp_zg_cycle_min 0.2
|
||||
sp_zg_cycle_max 0.4
|
||||
sp_qu_cycle_time_min 0.6
|
||||
sp_qu_cycle_time_max 1.2
|
||||
sp_sp_round_time_min 0.35
|
||||
sp_sp_round_time_max 0.5
|
||||
sp_sp_spiral_pow_min 0.05
|
||||
sp_sp_spiral_pow_max 0.1
|
||||
sp_qu_bias_pow_min 0.35
|
||||
sp_qu_bias_pow_max 0.65
|
||||
st1_df_pitch 10
|
||||
GuidanceType 0
|
||||
sp_zg_bias_min 0.1
|
||||
sp_zg_bias_max 0.3
|
||||
|
||||
91
docs/re/structures/weapon-datasheet-static.md
Normal file
91
docs/re/structures/weapon-datasheet-static.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# ✅ The STATIC weapon datasheet — `Weapon`, `Shell`, `AssortMissileParam`
|
||||
|
||||
The corpus's weapon numbers came from a **runtime capture**
|
||||
([weapon-datasheet-runtime](../weapon-datasheet-runtime.md),
|
||||
[weapon-struct-runtime](weapon-struct-runtime.md)). The static tables behind them
|
||||
are now located and read, with no emulator involved.
|
||||
|
||||
## How they were found
|
||||
|
||||
Not by guessing a filename. **IDXD field names are literal strings in the string
|
||||
pool**, so the stat-shaped keys already harvested from the disassembly
|
||||
(`data/config-keys.txt` — `MegaTons`, `GuidanceType`, `SpiralType`,
|
||||
`Straight1Type`, `BulletLimit`, `CrewCount`, `HP_CLASS`, …) can be searched
|
||||
directly across every record on the disc. 8 648 records carry at least one, and
|
||||
they cluster on three record names.
|
||||
|
||||
## What is there
|
||||
|
||||
| record | per pak | fields | what it is |
|
||||
|---|---|---|---|
|
||||
| `Weapon` | **131** | 21 | the launcher — rate of fire, heat, ammo, SE/FX |
|
||||
| `Shell` | **131** | 37 | the projectile — damage, ballistics, collision, FX |
|
||||
| `AssortMissileParam` | **9** | 20 | missile guidance tuning |
|
||||
|
||||
131 `Weapon` and 131 `Shell` records, one-to-one, in **each** of the per-language
|
||||
`GP_MAIN_GAME_*.pak` files; a weapon and its shell share a pak entry. Note this is
|
||||
**131**, not the 59 of the `WEAPONS` name roster — the roster is the *arsenal
|
||||
menu's* list, not the full set.
|
||||
|
||||
### `Weapon` (sample: `Weapon_TCAF_DeltaSaber_Rocket_P`)
|
||||
|
||||
```
|
||||
ID / Name Weapon_TCAF_DeltaSaber_Rocket_P
|
||||
TargetType Vessel,Craft,Structure
|
||||
ShotType Single ReticleType 5
|
||||
HitRatio 1.0 SprayAngle 4.0
|
||||
Interval 1.0 ReadyInterval 0.0
|
||||
TriggerShotCount 1 TriggerShotInterval 0.1
|
||||
LoadingCount 1000 Heating 0.00 Cooling 0.10
|
||||
Mass 100 SpecialWeaponType 0
|
||||
ShootSE / ReadySE / FinishSE, MuzzleFlashFxModel_Loop / _OneShot
|
||||
```
|
||||
|
||||
### `Shell` (sample: `Shell_TCAF_DeltaSaber_Rocket_P`)
|
||||
|
||||
```
|
||||
Power 100.0 DamageType Shell FailedDamageRatio 1.0
|
||||
Velocity 3000.0 Acceleration 0.0 AngularVelocity 0.0
|
||||
MinimumVelocity / MaximumVelocity 0.0
|
||||
MinimumRange 10.0 MaximumRange 6000.0 LifeTime 3.0
|
||||
CollisionType Capsule Radius 30.0 Length 10.0 Volume 10.0
|
||||
ShellMass 0.005 HP 0.0 MovementType Shell
|
||||
IsGravitated Yes IsDestructible No IsLockable No IsFullCollision No
|
||||
IsFixedModel Yes ShellModel wep_t085
|
||||
Color_R/G/B 1.0 / 0.85 / 0.7
|
||||
HitFxModel eff_h000 HitFxInEnd Yes ContrailFxFrame GN_Trc_01
|
||||
JetFxModel / JetFxFrame, HitSE_Damage / HitSE_NoDamage, ThrusterSE
|
||||
```
|
||||
|
||||
`MaximumRange 6000.0` with the corpus's **world unit = 1 metre** makes this a
|
||||
6 km rocket; `Velocity 3000.0` is 3 km/s.
|
||||
|
||||
### `AssortMissileParam` — the guidance model
|
||||
|
||||
```
|
||||
GuidanceType 0 SpiralType 1 Straight1Type 1 Straight2Type 0
|
||||
st1_df_aperture 0.5 st1_up_aperture 1.0 st1_up_bias_pow 0.5 st1_df_pitch 10
|
||||
sp_sp_round_time 0.35 … 0.5 sp_sp_spiral_pow 0.05 … 0.1
|
||||
sp_qu_cycle_time 0.6 … 1.2 sp_qu_bias_pow 0.35 … 0.65
|
||||
sp_zg_cycle 0.2 … 0.4 sp_zg_bias 0.1 … 0.3
|
||||
```
|
||||
|
||||
Three named motion modes with min/max ranges — `sp` spiral, `qu` quick-turn,
|
||||
`zg` zig-zag — plus a straight-flight aperture and pitch. Nine variants ship.
|
||||
|
||||
## 🔴 And a controlled negative: `stageNN_settings.tbl` does not exist
|
||||
|
||||
`AUTO_SETTINGS` names 28 files `stage01_settings.tbl` … `stage29_settings.tbl`.
|
||||
Probing pak entry names (`name_hash`) with **four** path prefixes — bare,
|
||||
`stage\`, `arsenal\`, `dat\` — finds **0 of 116**, while the two controls in the
|
||||
same loop (`stage\UnitGroup_S02.tbl`, `stage\AIParams_S02.tbl`) are **both
|
||||
found**. So the reader and prefix convention are right and those files are simply
|
||||
not on the disc — the same shape as `STAGENN_UNIT_MAX`.
|
||||
|
||||
## 🟡 Not settled
|
||||
|
||||
* Whether the 131 `Weapon` records reconcile with the runtime capture field by
|
||||
field — this locates and reads the table; it does not cross-check it.
|
||||
* The other stat keys (`MegaTons`, `BulletLimit`, `CrewCount`, `HP_CLASS`,
|
||||
`HPGauge`, `WEAPON_CATEGORIES`) belong to records not opened here.
|
||||
* Why the arsenal roster lists 59 of the 131 weapons.
|
||||
Reference in New Issue
Block a user