From 98082e64a020a1919f0e582f71bbfda4e898c9a1 Mon Sep 17 00:00:00 2001 From: Joe DiPrima Date: Fri, 7 Aug 2026 11:22:47 -0500 Subject: [PATCH] KB sweep: retire the three claims that WERE the scoring bugs Night 13 turned up three confident KB/source notes that each closed off a working path, and each one was the defect: 1. context/combat-damage.md -- "@0x4c0200 is in NO table entry: dead code", used to justify retiring per-hit inflicted credit in build 787. It is reached through BTPlayer's Dispatch override (vtable @00513300 slot 3). (corrected in 2772175) 2. context/decomp-reference.md -- "shipped content authors NO role keys, so the cost is 0 in the field". Wrong on both halves: the fields come from the role MODEL's GameModel record, not notation keys, and dfltrole authors killBonus=500 / deathPenalty=500 / dmgInf=1 -- the manual's chart verbatim. The cost read 0 because the role was never bound. 3. docs/RECONCILE.md -- "role registry has no WinTesla analog -> stubbed; base-set scenarioRole stands". The base ctor sets it NULL, so nothing stood, and Mission::GetScenarioRole IS the analog. Common shape worth remembering: all three asserted an absence (dead code, no authored data, no analog) and none was re-tested against the binary before being built on. An absence claim in this KB should carry the check that established it. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NCJQkvq6G2JNrpVbA75tVZ --- context/decomp-reference.md | 12 +++++++++++- docs/RECONCILE.md | 11 +++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/context/decomp-reference.md b/context/decomp-reference.md index e1226aa..6f11a2a 100644 --- a/context/decomp-reference.md +++ b/context/decomp-reference.md @@ -439,7 +439,17 @@ From the weapon `.SUB` records + the charge-curve `.data` constants (PE-parsed a Direct call, NOT dispatched — bypasses the BT handlers' type Verifies. NUANCE [T4]: the 1995 engine adds at Player+0x1c8 while every BT scoreboard reads +0x278 — the pod's death cost may never have displayed; our single-cell port shows it. Shipped - content authors NO role keys, so the cost is 0 in the field. Other role+0x1c reader: + content authors NO role keys, so the cost is 0 in the field. **CORRECTED 2026-08-07 — + that sentence was wrong on both halves.** The role's scoring fields are not authored via + notation keys at all: the ctor `@00429a9c` loads them from the role MODEL's GameModel + record (type 0xf, 7 dwords — rec[0]=killBonus, rec[1]=specialCaseDeathPenalty, + rec[2]=dmgRcvd, rec[3]=dmgInflctd, rec[4]=bias, rec[5]=friendlyFire, + rec[6]=returnFromDeath); the notation keys are optional OVERRIDES. Shipped content + authors `Role::Default` (model `dfltrole`) with **killBonus=500, deathPenalty=500, + dmgInf=1, dmgRcv=0, bias=1, ff=1, return=1000** — the original manual's scoring chart + verbatim (`reference/manual/scoring_chart.webp`). The cost read 0 only because + `BTPlayer::scenarioRole` was never BOUND (the registry lookup sat commented out); wired + 2026-08-07 and the cost is verified APPLYING at 500. Other role+0x1c reader: `@0x4a0506` inside the deferred id-0x16 report tail (#45) reads killBonus. - **THE SIM TIME MODEL — CLOSED 2026-08-02 (issue #96) [T1]:** the arcade `Simulation::PerformAndWatch` is **`FUN_0041c018`** (part_002.c:5101): diff --git a/docs/RECONCILE.md b/docs/RECONCILE.md index b82d0ce..62a400f 100644 --- a/docs/RECONCILE.md +++ b/docs/RECONCILE.md @@ -14,8 +14,15 @@ Resolve AFTER all 7 families report (Stage 1 reconciliation), then again at link - **Player__VehicleDeadMessage**: BT build carried `killerName` (+0x1c) the engine base lacks; read via offset. ### Stubbed (no WinTesla analog) — revisit at integration -- BTPlayer ctor role/mission-registry resolution: `GetMissionRegistry()` / `GetRoleRegistry()->Lookup()` / - `GetMission()->GetGameModel()` have no WinTesla analog → stubbed; base-set `scenarioRole` stands. +- ~~BTPlayer ctor role-registry resolution~~ — **RESOLVED 2026-08-07.** The claim "no WinTesla + analog → stubbed; base-set `scenarioRole` stands" was wrong twice over: the base ctor sets + `scenarioRole` to **NULL** (PLAYER.cpp:680), so nothing "stood"; and the analog exists — + `Mission::GetScenarioRole(name)` (MISSION.h:162) walks the same `scenarioRoleChain` that + `BTL4Mission` fills via `AddScenarioRole()` when it parses the role pages. A NULL role zeroed + EVERY scoring value (a kill scored 4.88 instead of 505.88, the eject charge read 0, the death + cost was skipped). Now bound, with a `Role::Default` fallback and a BOUND/NULL receipt. + `GetMission()->GetGameModel()` (the freeForAll compare) stays genuinely stubbed — the shipped + code discarded its result anyway. ### Link-time externs to be PROVIDED by owning modules (Stage 3) - `ToggleVoiceAssist`, `Is_Destroyed` (mechmppr)