diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index fed7241..a59e890 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -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 diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 610864f..1f05605 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -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 | diff --git a/docs/re/data/weapon-shell-static.txt b/docs/re/data/weapon-shell-static.txt new file mode 100644 index 0000000..89f80c7 --- /dev/null +++ b/docs/re/data/weapon-shell-static.txt @@ -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 + diff --git a/docs/re/structures/weapon-datasheet-static.md b/docs/re/structures/weapon-datasheet-static.md new file mode 100644 index 0000000..7824f31 --- /dev/null +++ b/docs/re/structures/weapon-datasheet-static.md @@ -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.