re: the rest of the stage-settings object -- cameras, player limits, difficulty
53 objects in GP_MAIN_GAME_E carry a Phase_1 record, in TWO families: 29 are the resource manifest the corpus already owns (Phase_N = 4 fields) and 24 are the settings table (Phase_N = 31-90 fields). That answers the 24-vs-28 puzzle left open by the scoring entry -- the 29 is a different table, not the settings. Camera: three chase rigs in metres, 13 of 14 fields identical in every stage -- Nose (0, 4.5, 7), Near (0, 10, 40), Far (0, 15, 80), FOV 0.92; only CameraFar varies, once. Player: BulletLimit 512 / HomingLimit 256 / LaserLimit 32 and the three 0.30 axis adjustments are constant, GravityFactor is non-zero in 4 of 24 stages, and IsBoss16Enable appears in exactly ONE object -- the first per-stage handle for a family whose filenames do not resolve. Difficulty_Easy/Normal/Hard is a SECOND difficulty record (8 damage and guidance multipliers), separate from Score_*. New doc structures/stage-settings-table.md; mission_scoring.py extended. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
@@ -76,5 +76,9 @@ Not settled. `AUTO_SETTINGS` names 28 files (`stage01…16`, `tutorial01…06`,
|
||||
`dat\`, `prt\`, `view\`, `language\`, `eng\`, `script\`, `Script\`, `mission\`,
|
||||
`Mission\`, `param\`, `Param\`). So either the settings files are loaded outside
|
||||
the pak namespace, or the scoring objects are keyed by something else entirely.
|
||||
**24 objects against 28 declared files is itself unexplained** — do not assume
|
||||
the missing four are the tutorials without checking.
|
||||
**The 24-vs-28 puzzle is answered** by
|
||||
[`stage-settings-table.md`](stage-settings-table.md): the same pack holds a
|
||||
*second* family of **29** objects that also uses `Phase_1/2/3` — the resource
|
||||
manifest — so the settings family really is 24 and the 29 is a different table.
|
||||
The only per-stage handle found so far is `IsBoss16Enable`, present in exactly
|
||||
one object.
|
||||
|
||||
87
docs/re/structures/stage-settings-table.md
Normal file
87
docs/re/structures/stage-settings-table.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# The per-stage settings table — cameras, player limits, difficulty
|
||||
|
||||
**✅ Settled 2026-08-27** (static; regenerator
|
||||
`tools/re-capture/mission_scoring.py`, artefact
|
||||
[`data/mission-scoring.txt`](../data/mission-scoring.txt) — the same object the
|
||||
scoring block lives in, see [`mission-scoring.md`](mission-scoring.md)).
|
||||
|
||||
Loader: `sub_8230D1F8`, whose 122 field names identify it.
|
||||
|
||||
**Docs checked.** [`isl-condition-builtins.md`](isl-condition-builtins.md) owns
|
||||
`Camera`, `ControlTweak` and `Rendering` **as records in
|
||||
`GP_HANGAR_ARSENAL.pak`** — the game-wide defaults (`NoseCameraFOV 0.92`,
|
||||
`BloomScale 0.5`, …). **What it does not say** is that `Camera` recurs **per
|
||||
stage** in the `GP_MAIN_GAME_*` packs, or that the per-phase records carry the
|
||||
same rendering fields again. `stage-definition-table.md` /
|
||||
`challenge-mission-gate.md` own `StageResource`; `stage-mission-tables.md` owns
|
||||
`LodResource` / `MotionResource`. `SplinterCell` and `Difficulty_*` are owned by
|
||||
nothing.
|
||||
|
||||
## ⚠️ Two different families both use `Phase_1/2/3`
|
||||
|
||||
Searching `GP_MAIN_GAME_E.pak` for objects containing a `Phase_1` record finds
|
||||
**53**, in two shapes — a textbook case of *a record name being a file-local
|
||||
role*:
|
||||
|
||||
| objects | record names | `Phase_N` named fields |
|
||||
|---|---|---|
|
||||
| **29** | `StageResource`, `LodResource`, `MotionResource`, `Phase_1/2/3` | **4** |
|
||||
| **24** | `Camera`, `Player`, `SplinterCell`, `Difficulty_{Easy,Normal,Hard}`, `Score_{Easy,Normal,Hard}`, `Phase_1/2/3` | **31–90** |
|
||||
|
||||
The 29 are the **resource manifest** the corpus already owns. The 24 are the
|
||||
**settings** table this document describes. Counting `Phase_1` records without
|
||||
partitioning first would have merged them.
|
||||
|
||||
That also answers the count left open by `mission-scoring.md`: the settings
|
||||
family really is **24**, and the **29** — matching `AUTO_SETTINGS`'s tag range
|
||||
1…29 — is a *different* family. 23 of the 24 carry `SplinterCell`; one does not.
|
||||
|
||||
## `Camera` — three chase rigs, in metres
|
||||
|
||||
Present in 24/24. Thirteen of its fourteen fields are **identical in every
|
||||
stage**:
|
||||
|
||||
```
|
||||
NoseCamera Pos (0.0, 4.5, 7.0) FOV 0.92
|
||||
NearCamera Pos (0.0, 10.0, 40.0) FOV 0.92
|
||||
FarCamera Pos (0.0, 15.0, 80.0) FOV 0.92
|
||||
CameraNear 1.0 CameraFar 3000000.0 (one stage: 500000.0)
|
||||
```
|
||||
|
||||
World unit is 1 metre (corpus), so these are metres behind and above the ship,
|
||||
and the near/far planes are 1 m / 3000 km. Only `CameraFar` varies, and only once.
|
||||
|
||||
## `Player` — projectile pools and gravity
|
||||
|
||||
```
|
||||
BulletLimit 512 HomingLimit 256 LaserLimit 32 (constant, 24/24)
|
||||
PitchAdjustment / RollAdjustment / YawAdjustment 0.30 (constant)
|
||||
AirDragFactor 1.0 (constant)
|
||||
GravityFactor 0.0 in 20 stages; 250.0, 400.0, 700.0 in three others
|
||||
IsBoss16Enable Yes — in exactly ONE object
|
||||
```
|
||||
|
||||
Two findings here. **`GravityFactor` is non-zero in 4 of 24 stages** — those
|
||||
missions pull the player. And **`IsBoss16Enable` appears in exactly one object**,
|
||||
which identifies that object as **stage 16**; it is the only per-stage handle
|
||||
found so far for a family whose filenames do not resolve.
|
||||
|
||||
## `Difficulty_Easy` / `_Normal` / `_Hard` — a second difficulty record
|
||||
|
||||
Eight fields, separate from the `Score_*` records: `DamageAdjustment`,
|
||||
`ShieldDamageAdjustment`, `FriendlyFireAdjustment`, `PlayerDamageAdjustment`,
|
||||
`PlayerShieldDamageAdjustment`, `PlayerMissileGuidanceAdjustment`,
|
||||
`AntiPlayerMissileGuidanceAdjustment`, `CollisionDamageRatio`. On `Normal`
|
||||
almost everything is `1.0`, with `CollisionDamageRatio 0.8` and
|
||||
`FriendlyFireAdjustment 0.5` (each with one stage that differs). So difficulty
|
||||
is expressed **twice** in the same object — once for *scoring*
|
||||
(`Score_{Easy,Normal,Hard}`) and once for *damage* (`Difficulty_*`).
|
||||
|
||||
## 🟡 Not settled
|
||||
|
||||
* The `Phase_1/2/3` block of the settings family (31–90 named fields:
|
||||
post-processing, fog, DOF, unsharp mask, supply squadrons and movies,
|
||||
`UnderCommandSquadron`, `MapPath`) is **not read here** — it is the largest
|
||||
remaining piece of this table.
|
||||
* Which object is which stage, beyond the single `IsBoss16Enable` hook.
|
||||
* `SplinterCell Count 5` — name and value only.
|
||||
Reference in New Issue
Block a user