Corrections (wrong claims fixed + swept): - open-questions: the DuckState 'no CODE consumer, authentic [T1]' verdict RETRACTED (consumer = the unexported posture block; squat clips shipped in BTL4.RES all along); the searchlight fog swap re-marked DONE (was 'STILL DEFERRED'); crouch index pointer updated. - combat-damage: old task-#60 kill-score section marked SUPERSEDED by the report tail (BTPostKillScore retired). - pod-hardware: crouch census rows -> COMPLETE; gauges-hud: 07-20 note (generators 'unreconstructed') re-swept. New knowledge: - reconstruction-gotchas #20: EXPORT-GAP BLINDNESS (4 incidents, 2 falsely T1; the byte-scan/named-member/RES-TOC/manifest checklist) + the verification-viewpoint bullet in #13 (the crouch capture errors). - decomp-reference: master posture/crouch block offsets (+0x3f8/+0x79c, the myomers cluster) + 8 new bench env gates. - rendering: beam-material decode (btfx brighten) + look-pass acceptance. - experience-levels: crouch novice lockout in the +0x25c consumer list. - build-and-run: the stale-link build ritual; test-harness: bench-script gotchas (both previously oral tradition). - glossary: export-gap-blindness; multiplayer: crouch/searchlight ride existing records; subsystems: searchlight visuals pointer. Status refresh: CLAUDE.md front + project-overview current-state -> core gameplay reconstruction COMPLETE (774->801), polish phase, #60 census next. Ledger addenda: INPUT_PATH row 6 complete; RESPAWN_REARM VehicleDead-sender note. .gitignore: content/ bench artifacts (pngs/logs/eggs/exe) out of status. checkctx CLEAN. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
10 KiB
10 KiB
id, title, status, source_sections, related_topics, key_terms, open_questions
| id | title | status | source_sections | related_topics | key_terms | open_questions | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| experience-levels | Experience levels / simulation modes — novice, standard, veteran, expert | established | decomp part_013.c:10816-10871 (@4c0bc8), part_014.c:7830-7900 (@4d2f3e), FUN_004ad7d4/FUN_004ac9c8/FUN_004bbfcc; BTMSSN.HPP (survived); Tesla40_BT_manual.pdf pp.7,11-14,21,22,24 |
|
|
|
Experience levels / simulation modes
The egg's per-pilot experience field is the pod's simulation-fidelity tier — the thing the
1995 site operator set per player at sign-up. It is NOT the BAS/MID/ADV control mode (a free
in-cockpit choice, locomotion/pod-hardware) and NOT the scenario role (scoring modifiers).
Researched end-to-end 2026-07-18; this file supersedes the older "role display toggles" /
"ROOKIE-role lockout" readings (see Corrections below).
The data path [T1]
- Egg: pilot page key
experience∈ {novice,standard,veteran,expert}; required unlessvehicle=camera; unknown value = hard abort. Parse @4d2f3e (part_014.c:7830-7900, strings @51e6f1);tools/eggmodel.pyknows the value set. - BTMission (
BTMSSN.HPPsurvived, T0): stored atmission+0xe4(experienceLevel, accessorExperienceLevel()); the neighboring egg keyadvancedDamage→mission+0xf0(advancedDamageOn) — the separate site-technician splash/collision switch (manual p13). - BTPlayer ctor @4c0bc8 (part_013.c:10816-10871): on the MASTER branch
(
(simulationFlags & 0xc) != 4; the replicant branch instead swaps in the console-update Performance) it readsbtMission(+0x1f8)->experienceLevel(+0xe4)and fans it out:
| egg value | +0x25c | +0x260 | +0x26c | +0x270 | +0x274 (raw) |
|---|---|---|---|---|---|
| novice | 0 | 0 | 0 | 0 | 0 |
| standard | 1 | 0 | 1 | 1 | 1 |
| veteran | 1 | 1 | 1 | 1 | 2 |
| expert | 1 | 1 | 0 | 1 | 3 |
then unconditionally +0x264 = +0x268 = mission->advancedDamageOn(+0xf0) (both copies). [T1]
What each flag gates (binary consumers, all reached via mech+0x190 → BTPlayer) [T1]
- +0x25c — "sim live", off only for novice. Consumers: the CROUCH posture selector
(master-perf @0x4a9f70: novice → mapPosture 0 → squat/rise refused — 2026-08-06,
locomotion §CROUCH); ballistic jam roll
CheckForJam@4bbfcc early-returns NO-JAM when 0 (projweap.cpp calls thisLiveFireEnabled); ThermalSightToggleLamp@4b860c (thermalsight.hppControlsAllowLights) — ⚠ CORRECTED 2026-07-25 (#61): this was listed as Searchlight's gate. It is not. Raw disassembly of Searchlight's real handler @004b838c (a Ghidra export gap) shows it gates on the PRESS ALONE and never reads +0x25C, so a NOVICE pilot CAN work the searchlight; only the thermal sight is locked [T1,scratchpad/dis838c.py]; PoweredSubsystem message handler @4b0efc (powersub.cpp's "message-manager short-event flag" — same flag, misattributed); the mech combat-ineffective evaluation (part_012.c:9364: mech state ∈ {3,4} && novice is an extra OR-term settingmech+0x414). The#if 0block in surviving PPC.CPP:63-95 (novice PPCs deal no damage) shows the original intent of the tier. - +0x260 — the HEAT-MODEL master switch, ON for veteran+expert. This is
FUN_004ad7d4(*(*(sub+0xD0)+0x190)+0x260), the single most-called gate in the subsystem family: Myomers work→heat (movement heat, MyomersSimulation @4b8d18), Emitter/energy-weapon firing heat, missile launch heat, the heat.cpp simulation, projectile-weapon heat, and the heat-scaled part of the jam chance. Standard mode has NO heat consequences; that is authentic, not a port gap. - +0x274 — the raw level.
FUN_004ac9c8= (level == 0), the NOVICE lockout used as the condenser-valve guard (gauges-hud task #13) and by the PoweredSubsystem handler @4b21d0 (not-novice gate). The port'sBTPlayerRoleLocksAdvancedbridge implements this predicate (correct behavior, wrong seeding — see Port state). - +0x264/+0x268 — advancedDamage copies. Read in the heat-family sim (part_013.c:8757). Independent of experience.
- +0x26c / +0x270 — consumers NOT located via the mech→player hop. 0x26c (standard+veteran only) best fits the manual-p22 myomer supercharge clamp (standard locked, expert unlocked) [T4].
Player-facing behavior (Tesla 4.0 manual) [T1 primary source]
Manual pp. 7, 11-14, 21, 22, 24 (the dedicated Simulation Modes page, manual p2, is MISSING from
the Tesla40_BT_manual.pdf scan along with p3):
- Standard: armor-only damage — no criticals, no generator outages, no jams, no heat concerns; MechTech limited to the leg-damage audio warning; viewscreen hunting aids (red hot box + guide arrow, 60° FOV) on; myomer supercharge locked.
- Veteran: critical hits (any hit can go internal; likelihood rises as armor thins; a crit can kill the mech), generators take damage/go offline (reroute power), ballistic jams (manual clearing), full MechTech audio + smart buttons; viewscreen hunting aids OFF (radar hot box stays).
- Expert: veteran + heat as a core mechanic: movement generates heat (accel/decel worst), heat slows recharge/top speed, incoming fire causes coolant leaks, ammo-bay fires/cook-off; myomer supercharge allowed.
- Scoring identical in all modes (p4). Splash/collision damage = a separate technician setting.
4.0 → 4.10 drift [T1]
- The viewscreen hunting-aid gate is GONE in 4.10: part_014 (HUD/btl4vid TU) reads none of the player flags — the target hotbox/edge arrows (@4cdf6f) are gated on lock state only, every mode. Fits the 4.10 arcade-cities positioning.
- Movement heat is veteran+expert in 4.10 (the +0x260 gate), not expert-only as the 4.0 manual states. Whether a coefficient still differentiates them is open.
Port state (as of 2026-07-20) — WIRED (issue #2) [T2]
The wiring landed (uncommitted during the coordination pause; issue #2):
- Seed: the
BTPlayermaster ctor (btplayer.cpp~1305) now reads((BTMission *)playerMission)->ExperienceLevel()+->AdvancedDamageOn(). The binary's +0x1f8 mission pointer IS the inheritedPlayer::playerMission(master: set by the base ctor; replicant: back-filled fromApplication::GetCurrentMission()= app+0xc8) — the old separatebtMissionmember was a phantom duplicate, never set on the master branch; removed. The two switch slot errors are fixed (binary rows verified against part_013.c:10843-10870). A[exp]sentinel logs the seeded flags per master player. - Renames (btplayer.hpp): showDamageReceived→
simLive(0x25c), showKills→heatModelOn(0x260), showDamageInflicted→advancedDamageOn(0x264), roleReturnDelay→advancedDamageOn2(0x268, was mistyped Scalar), roleReturnDelay2→levelFlag26c(0x26c), showScore→levelFlag270(0x270), roleClassIndex→experienceLevel(0x274). - Bridges (btplayer.cpp, complete-type TU):
BTPlayerExperienceSimLive(+0x25c) andBTPlayerExperienceHeatModelOn(+0x260) joinBTPlayerRoleLocksAdvanced(+0x274==0). All consumers route mech→GetPlayerLink()→named member; NULL player reads permissive [T3]. - Gates unified:
HeatSink::HeatModelActive()(heat.hpp; also serves mislanch/projweap/ heatfamily call sites) +Myomers::OwnerAdvancedDamage()(myomers.hpp) → the +0x260 bridge;ProjectileWeapon::LiveFireEnabled()(projweap.cpp) +ThermalSight::ControlsAllowLights()(thermalsight.hpp) → the +0x25c bridge (notSearchlight::ControlsAllowLights(), which #61 showed is unused — its handler has no novice gate; the accessor is retained but dead);PoweredSubsystem::HandleMessage@4b0efc (powersub.cpp) → not-novice + the +0x25c bridge (the old "message-manager short-event flag" misattribution and its deadBT_GetMessageManagerguard are gone). - FUN_004ac9c8 family corrected:
MechSubsystem::IsDamaged(mechsub.cpp — was a live raw-offset databinding trap*(*(*(owner+0xd0)+0x190)+0x274)),BT_IsBusLive(btstubs.cpp — wasreturn True), and powersub'sIsDamaged()call sites @4b11bc/@4b21d0/@4b179c now all route throughBTPlayerRoleLocksAdvanced.HeatSink::IsDamaged(heat.hpp) deliberately keeps the simulationState shadow for the gauge tint (btl4gaug.cpp:172). - SHIPPED EGGS ARE ALL
expert(every pilot page in all 19 content/*.EGG, camera pages included) — so the default felt behavior is unchanged by the wiring (expert and the old hardwired veteran agree on every LOCATED consumer: sim live, heat on, controls unlocked; they differ only in the unlocated +0x26c flag). The glass front-end writesveteranwhen a pilot's experience is empty (btl4fe.cpp:307). - Myomers movement heat remains arithmetically inert (the Owner* motion accessors still return neutral 0s — the gate is wired, the couplings are the reconciled follow-up).
Corrections (swept 2026-07-18)
btplayer.hpp"per-role display toggles from returnFromDeath" for 0x25c-0x274 was WRONG — the source isbtMission+0xe4/+0xf0, not the role; theshowKills/roleClassIndexnames date from the scoring work and don't match the gate semantics (kept in code for now, comments corrected).gauges-hud.md"ROOKIE-role lockout" for FUN_004ac9c8 → novice-EXPERIENCE lockout.open-questions.md"true semantic of player+0x260/0x274 not yet pinned" → pinned here.
Key Relationships
- Feeds: subsystems (the heat model + jam/valve gates) · combat-damage (criticals tier intent) · gauges-hud (valve guard)
- Sourced from: the egg (multiplayer egg format) ·
BTMission(BTMSSN.HPP, T0) - Offsets: decomp-reference §3 (mech+0x190 row + BTPlayer flag block)
- Manual audit: pod-hardware §Manual