re: mission scoring and the S/A/B/C/D rank thresholds

sub_8230D1F8 -- the loader that contaminated the AA_/AV_ offset search -- is the
stage-settings loader.  Reading its 122 field NAMES instead of its offsets found
the scoring block, which nothing in docs/re owned.

24 IDXD objects per language pack x 6 = 144, each holding Score_Easy /
Score_Normal / Score_Hard: 72 records per pack on one 22-field schema, no
variants.  Difficulty moves 10 of the 22 fields and never the five RankScore_*
thresholds -- the rank bar is per stage, difficulty scales the earning rate
(x0.5 / x1.0 / x2.0) and the penalties.  23 of 24 objects differ from the
commonest Normal record; 9 of 72 records zero the scoring entirely.

Not settled: which object is which stage.  None of AUTO_SETTINGS's 28 filenames
resolves to any of the 24 under 19 prefixes, and 24 vs 28 is unexplained.

New doc structures/mission-scoring.md, regenerator mission_scoring.py, artefact
data/mission-scoring.txt.  Twelve artefacts now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Claude (auto)
2026-08-27 18:22:36 +00:00
parent 1a1a8d98d9
commit 192d3bf67f
5 changed files with 312 additions and 0 deletions

View File

@@ -4524,3 +4524,54 @@ a future iteration.
`sub_82398CC0` by eye before writing the six-line name-resolution script that
settled both candidates. **Write the script first** — it is in the standing rules
and I broke it again.
---
## ✅ 2026-08-27 — mission scoring and the S/A/B/C/D rank thresholds
The side finding from the blocked `AA_`/`AV_` item, followed up. New doc
[`structures/mission-scoring.md`](structures/mission-scoring.md); regenerator
`tools/re-capture/mission_scoring.py`; artefact `data/mission-scoring.txt`
(**TWELVE artefacts now**).
**Docs checked first:** `isl-condition-builtins.md` owns `AUTO_SETTINGS` (the 28
`stageNN_settings.tbl` **filenames**); `unit-datasheet-static.md` and
`unit-struct-runtime.md` own the *per-unit* `ScorePoint`/`DamageScore`/
`MassScore`. **`RankScore`, `TimeBonus`, `KillBonus`, `FFPenalty` and
`Difficulty_*` appear nowhere in `docs/re/`** — the scoring rules were unowned.
✅ **`sub_8230D1F8` is the stage-settings loader**, not just a rank table: its
122 name→offset pairs cover cameras, post-processing (bloom/DOF/fog/colour),
supply squadrons and movies, phase names — and the scoring block. Reading its
**names** rather than its offsets is what identified it; the offsets were the
contaminant that blocked the `AA_`/`AV_` item.
✅ **24 IDXD objects per language pack × 6 = 144**, each holding exactly
`Score_Easy` / `Score_Normal` / `Score_Hard` ⇒ 72 records per pack, **one**
22-field schema, no variants. Groups: five `RankScore_*` thresholds; three
`*Score_Adjustment` multipliers; `MainMissionCount`/`Bonus`; three `TimeBonus_*`;
`KillBonus_Maximum`, `FriendlyVesselDamageBonus`, `GettingScoreBasis_*`; five
penalties. Two of the game's typos are join keys: **`TimeBonus_Maximun`** and
**`FFPenalty_Zessel_Maximum`**.
✅ **Difficulty changes the earning rate, never the bar.** Comparing the three
records inside each object, **10 of 22 fields move and 12 never do — and the 12
include all five `RankScore_*`**. Multipliers run `×0.5 / ×1.0 / ×2.0`. So a rank
bar is per stage and identical on every difficulty; difficulty scales how fast
you earn against it and how hard penalties bite. Measured over all 24 objects,
not inferred from the names.
✅ **23 of 24 objects differ** from the commonest `Score_Normal` record, mostly in
the thresholds and the objective count/bonus. **Nine of the 72 records** (three
objects × three difficulties) zero the multipliers, penalties and time bonus —
unscored missions.
🔴 **Which object is which stage is NOT settled.** None of `AUTO_SETTINGS`'s 28
filenames resolves to any of the 24 objects under **19** prefixes. **24 objects
vs 28 declared files is itself unexplained** — and the standing rule applies: do
not assume the missing four are the tutorials without opening them.
**Method note, and it worked:** the offsets that made `sub_8230D1F8` a false
positive last iteration are the same offsets that made it findable — but only
after switching from *offset* to *name*. Read what a loader names, not where it
stores.