This repository has been archived on 2026-09-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Syplheed-Reborn/docs/re/structures/mission-scoring.md
Claude (auto) 26b7728ceb 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
2026-08-27 18:35:05 +00:00

4.5 KiB
Raw Blame History

Mission scoring and the S/A/B/C/D rank thresholds

Settled 2026-08-27 (static; regenerator tools/re-capture/mission_scoring.py, artefact data/mission-scoring.txt).

Found by following sub_8230D1F8 — the loader that the AA_/AV_ investigation turned up as a contaminant, because it stores at the same object offsets the unit definition uses. Reading its field names instead of its offsets identified it as the stage-settings loader, and the scoring block is the part of it the corpus did not have.

Docs checked: isl-condition-builtins.md owns AUTO_SETTINGS — the 28 stageNN_settings.tbl / tutorialNN / challengeNN filenames; unit-datasheet-static.md and unit-struct-runtime.md own the per-unit ScorePoint / DamageScore / MassScore fields. What none of them says is how a mission score is assembled or what earns a rankRankScore, TimeBonus, KillBonus, FFPenalty, Difficulty_* appear nowhere in docs/re/.

The tables

24 IDXD objects per language pack × 6 packs = 144. Each holds exactly three records — Score_Easy, Score_Normal, Score_Hard — so 72 scoring records per pack, and they share one 22-field schema with no variants.

group fields
rank thresholds RankScore_S _A _B _C _D
score multipliers CraftScore_Adjustment, VesselScore_Adjustment, OtherScore_Adjustment
objective bonus MainMissionCount, MainMissionBonus
time bonus TimeBonus_Maximun (sic), TimeBonus_Basis_Minimum, TimeBonus_Basis_Maximum
kill / escort bonus KillBonus_Maximum, FriendlyVesselDamageBonus, GettingScoreBasis_Minimum, GettingScoreBasis_Maximum
penalties LostWingmanPenalty, FFPenalty_Craft_Basis, FFPenalty_Craft_Maximum, FFPenalty_Vessel_Basis, FFPenalty_Zessel_Maximum (sic — "Vessel")

Two of the game's own misspellings are load-bearing as join keys: TimeBonus_Maximun and FFPenalty_Zessel_Maximum.

Difficulty changes the earning rate, not the bar

Comparing the three difficulty records inside each object, 10 of the 22 fields move and 12 never do — and the ones that never move include all five RankScore_* thresholds:

differ between Easy/Normal/Hard   CraftScore_Adjustment 21   VesselScore_Adjustment 21
(count = objects out of 24)       OtherScore_Adjustment 21   LostWingmanPenalty     21
                                  FFPenalty_Craft_Maximum 21 FFPenalty_Zessel_Maximum 21
                                  KillBonus_Maximum      18  MainMissionBonus       18
                                  TimeBonus_Maximun      18  FriendlyVesselDamageBonus 13
never differ                      RankScore_S/A/B/C/D, MainMissionCount,
                                  GettingScoreBasis_*, TimeBonus_Basis_*,
                                  FFPenalty_*_Basis

So a rank bar is per stage, identical on every difficulty; what difficulty changes is how fast you earn against it (×0.5 / ×1.0 / ×2.0 on the three *Score_Adjustment multipliers) and how hard the penalties bite. That is a design statement a port has to reproduce exactly, and it is measured, not read off the names.

Per-stage variation

23 of the 24 objects differ from the commonest Score_Normal record, almost always in the RankScore_* thresholds and the objective count/bonus — as expected for per-mission tuning. Nine of the 72 records (three objects × three difficulties) zero the multipliers, the penalties and TimeBonus_Maximun outright: missions that are not scored. Full per-object diffs are in the artefact.

Which object is which stage

Not settled. AUTO_SETTINGS names 28 files (stage01…16, tutorial01…06, challenge01…06, tags 116/1823/2429 — tag 17 absent, the cut S17), but none of those 28 names resolves to any of the 24 objects under 19 prefixes (bare, stage\, Stage\, message\, settings\, 2d\, ui\, system\, 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. The 24-vs-28 puzzle is answered by 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.