FableCSharp · human overview

What’s done / what’s left

Skimmable status for the evidence-first C# / Vulkan reimplementation of Fable: The Lost Chapters. Not a rewrite of the evidence ledgers. If a number, address, or “done” claim is not in those files or in tests/code, treat it as UNREAD.

Same text: docs/status/README.md. Live: https://samg-coder.github.io/FableCSharp/docs/status/index.html (or open this file locally).

This pageThe ledgers
Skim what’s locked and what’s next Authoritative tables, addresses, tests
Sequenced by dependency Do not copy their raw tables here
North star: close first-scene New Game (StartOakValeWest / Q_NewOakValeIntro / HerosOldHouse / CAM_OVIF_SHOT2) so CS_OAKVALE_INTRO_FATHER can run on a real world clock.

Snapshot: 2026-08-24 morning AEST (~8am), previous snapshot runtime HEAD 4f1819d via PR #54 merge 480f0f9 (~8:13am AEST 21 Aug 2026), runtime HEAD 12118bd (ExeIndex evidence exporters + persist Layer recover, scene-capture tool / retain-first-parsed-map, authored intro dialogue/audio + kid spawn on StartOakVale, UpdateAtClock + live actor MeshDraw refresh, intro-father parent continuation + sortDraws:false + present semaphore, in-game PlayAVI skip, QuestLifecycleRuntime / S_QNOVI post-cutscene map). Just locked: 7 runtime commits since 4f1819d. Headline locks in order: ExeIndex evidence exporters + persist Layer recover (951b7f2); scene-capture tool / retain-first-parsed-map (fa79419); authored intro dialogue/audio + kid spawn on StartOakVale (e004fe3); UpdateAtClock + live actor MeshDraw refresh (b6923a3); intro-father parent continuation + sortDraws:false + present semaphore (a02ab21); in-game PlayAVI skip (41e97c9); QuestLifecycleRuntime / S_QNOVI post-cutscene map (12118bd). Ignore merge 480f0f9, docs-only freeze 1f49729, and gitignore/hide-console 56f5f93. CSS unchanged. Freeze at 12118bd. Do not include any later runtime if master moves. dest still invented 512,384,512,384; NativeDestTupleUnread stays true; DIP (0,0) stand-in; DisplayFlushShouldDip(0, 0) always false; 009DA9F0 flush is still Note-only (DisplayFlushQueueIsNoteOnly). Point dest still skips DIPUP (00BADB36). Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. leave #14 open. FrontendPresentBodyIsLive means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14. a02ab21 does not lock #14 dest/Present. e004fe3 SetFrontendBatch can record world verts under frontend — leftover already #14, do not file a new issue. Frontend 0042DF9E / 00595222 still Note-only; New Game keyboard N/Enter stays leftover. FrontendDisplayCursorRan stays false. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open. dest 0044C72B as [01232C24+8] is not rdata-locked. leave #42 open. New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host). NativeDestTupleUnread stays true. leave #48 open. LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. leave #50 open. dest invented 512,384,512,384. leave #36 open. Exclusive-walk leftover is STALE (tracker already done). Skip VAs 0052F180/0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. leave #14 and #20 open (also leave #36 #42 #48 #50 open). Also leave leftover #4 #5 #9 #12 #15 #17 #19 open. Do not reopen #8. Do not reopen #46. Master is still proving boot / world clock, not animation. README’s long-term priority list still starts with animation; that list is not the current phase.

How to read this

Statuses are the project’s own words:

WordMeaning here
PROVENLocked from exe / assets / tests
PARTIALScript-layer or host path recovered; apply or runtime body not
UNREADNot filled with a look-better guess
DISPROVENA previous assumption, recorded so it does not return
TEMPORARYStand-in classified as such (often a D3D default)

Parse / dispatch / return ≠ apply ≠ runtime. A finished fixture is script-layer apply, not a mesh or UI body.

This is not a “finish every UNREAD command” roadmap.

Authoritative files

LedgerWhat it owns
docs/PARITY.mdWorked / DISPROVEN / Open
docs/runtime/COMMAND_COVERAGE.mdToken counts and per-verb overall
docs/runtime/COMMAND_MAP.generated.mdGenerated parse / dispatch / apply / runtime
docs/runtime/COMMAND_MAP.mdHand map + StartNewGame bindings
docs/runtime/FIXTURE_COMMAND_AUDIT.mdScript-layer fixture outcomes
docs/runtime/FORWARD_TREE.mdPE → WinMain → no-save New Game function tree
docs/render/DX9_VULKAN_PARITY.mdDX9 → Vulkan matrix
docs/render/FIRST_SCENE_CONTRACT.mdFirst-scene submit contract
docs/render/FIRST_SCENE_AUDIT.mdLive-path classification + leftover UNREAD
docs/render/FIRST_SCENE_WORLD_PARITY.mdWorld/space/visibility checklist

Boot/clock facts below are from EngineLifecycle / EngineLifecycleTests (not yet copied into PARITY.md).

Coverage snapshot

From COMMAND_COVERAGE.md (generated from exe token list 0x012C1500–0x012C2C00 + ScriptCommandMap):

MetricCount
Native command tokens185
Recovered dispatch / return156
Recovered apply95
Implemented runtime13
UNREAD tokens29

The 13 PROVEN overall runtimes are FadeOut / FadeIn (global and entity), SetTime, WaitFlag, SetFlag, PlayAVI, GamePause, DoOneFrame, CameraPause, ScriptFrame, DoScriptFrame. PlayAnimation apply is now PROVEN; runtime still PARTIAL. FirstSeenPlayAnimationAppliesPose=false. Type-6 XSEQ first-key sample drives PaletteForPose 48-byte locals (00A999B0 / 00AA4680 / 00A4C5E0). Time interpolation 00AA0090 unread. WaitPlayAnimation apply is now PROVEN; leftover is vtbl+104.

Do not grind the 29 UNREAD tokens (Crowd*, debug, LadyGreyIntro, boss fights, …) as a phase.

What’s done

Sequenced as the engine actually runs. Wrong assumptions named only when a ledger or test already records them.

Formats / first-scene world (already locked)

ItemStatusWhere
TLC data formats (WLD, WAD/BBB, LEV/TNG, QST, bins, C3D, STB, …) PROVEN PARITY.md Worked
New Game view is StartOakValeWest / HerosOldHouse / CAM_OVIF_SHOT2, not Lookout PROVEN FIRST_SCENE_CONTRACT.md, WorldSceneTests
Adult Lookout is not the first-scene camera PROVEN FIRST_SCENE_WORLD_PARITY.md
TNG local vs STB WLD; STB − (MapX, MapY) meeting space PROVEN same
House 6909/6911, kid 4300 bind-pose, landscape strips, sky else-path 0x2000 PROVEN contract + world parity
DX9 → Vulkan first-scene submit (layers 0x40x400x200x1000x2000) PROVEN / EQUIVALENT DX9_VULKAN_PARITY.md; 0x100 drain 676bf63
T(cam) on host world-space STB verts DISPROVEN world parity; submit uses identity W
Invented stars.dat billboards / 1 m landscape fill DISPROVEN PARITY / world parity
S_QNOVI + NOVI_LiveFatherCS_OAKVALE_INTRO_FATHER PROVEN COMMAND_MAP.md, PARITY
00DB8680 starts the intro DISPROVEN start is 00DB86B0 (PARITY)
Intro fixture CS_OAKVALE_INTRO_FATHER Finished def+60 (script layer) FIXTURE_COMMAND_AUDIT.md
Fade / PlayAVI / DoScriptFrame / UseCamera / GamePause at script layer PROVEN command map + PARITY 0b
return is interpreter stop DISPROVEN it is a RemoveExtras named-arg

Phase 1 in progress — boot / world clock (current master)

Recent commits (951b7f212118bd) lock ExeIndex evidence exporters + persist Layer recover, scene-capture tool / retain-first-parsed-map, authored intro dialogue/audio + kid spawn on StartOakVale, UpdateAtClock + live actor MeshDraw refresh, intro-father parent continuation + sortDraws:false + present semaphore, in-game PlayAVI skip, and QuestLifecycleRuntime / S_QNOVI post-cutscene map. Previous snapshot 4f1819d via PR #54 480f0f9 (~8:13am AEST 21 Aug 2026). Just locked this batch: ExeIndex evidence exporters + persist Layer recover, scene-capture tool / retain-first-parsed-map, authored intro dialogue/audio + kid spawn on StartOakVale, UpdateAtClock + live actor MeshDraw refresh, intro-father parent continuation + sortDraws:false + present semaphore, in-game PlayAVI skip, QuestLifecycleRuntime / S_QNOVI post-cutscene map. MATCH for named-stage Add Def Class is still Note-only + *DefClassRegistered flag, not a live constructed object. dest 0044C72B as [01232C24+8] is not rdata-locked. leave #42 open. dest still invented 512,384,512,384; NativeDestTupleUnread stays true; DIP (0,0) stand-in; DisplayFlushShouldDip(0, 0) always false; 009DA9F0 flush is still Note-only (DisplayFlushQueueIsNoteOnly). Point dest still skips DIPUP (00BADB36). Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. leave #14 open. FrontendPresentBodyIsLive means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14. a02ab21 does not lock #14 dest/Present. e004fe3 SetFrontendBatch can record world verts under frontend — leftover already #14, do not file a new issue. Frontend 0042DF9E / 00595222 still Note-only; New Game keyboard N/Enter stays leftover. FrontendDisplayCursorRan stays false. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open. New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host). NativeDestTupleUnread stays true. leave #48 open. LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. leave #50 open. dest invented 512,384,512,384. leave #36 open. Exclusive-walk leftover is STALE (tracker already done). Skip VAs 0052F180 / 0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. Do not invent DrawContainerWalk calls of those VAs. Do not file a new leftover for that unread gap. #5 grok-goal dump still written — do not re-file. Host NAudio FrontendAudioPlayer (Intro.ogg / Frontend.lug CS_GUI_1/2) does not lock leftover #15 (Init Sound 00417A58) or leftover #9 (WmvPlayer IBasicAudio). 3D stays Compatibility host.Draw after Leave. F2 fly is Game-only. WM_CHAR is type 15; Press Start / New Profile / New Game are LMB type 4/6. Type-10 packet is widget +352, not MessageId. leave #14 and #20 open (also leave #36 #42 #48 #50 open). Also leave leftover #4 #5 #9 #12 #15 #17 #19 open. Do not reopen #8. Do not reopen #46. CSS unchanged.

ItemStatusEvidence
Launch from PE 00401067 / WinMain 00403480 / bootstrap 00402510 PROVEN EngineLifecycleTests.Pe_entry_is_crt_not_new_game
New Game is leave-frontend → FinalAlbion.wld → Init Game 004184BD PROVEN same + New_game_is_leave_frontend_then_FinalAlbion_wld
Init World Map 005066E0; Load .wld 00507C30 token switch PROVEN Load_wld_is_00507C30_not_00DBDE40
Region graph 00506D40 / 00828710 PROVEN Install_banks_and_startup_videos_exist
Create Players: 5 × 0x22C slots, 4 active — not hero_swap_*.tng PROVEN CreatePlayers_is_five_0x22C_slots_not_hero_swap. Runs at the named 004166A8 stage (b8a2b21). Hero swap names hero_swap_1.tng_4.tng belong on the player owner at game+28 (4a03969), not here.
Load GTNG 0050959F stem+.gtng; TLC missing → skip PROVEN same install test (Gtng null, “missing”)
Global things: BSS [0x13B8609]=0 → per-map .tng 004FDBC0; flag → .gtg 004FE2A0 PROVEN Gtng_is_stem_gtng_gtg_is_004FE2A0_single_file
Current region index is WorldMap+156 (004FB150); ctor 0 is dummy PROVEN Game_pump_is_004189C2_not_00DBDE40
First 004189C2 pump does not SetRegionAsLoaded PROVEN install test
No-save enqueue 0050145000500540(1,0,0) LookoutPoint (native index 1) PROVEN first i=1; then i=2..141
00501450 is only 00500540(1,0,0) DISPROVEN loops all i; last +156=141 Filler_NorthernWastes_02; restore (0,0,1) no pump
005198B0 releases the 0048D400 list DISPROVEN second collector: +145 then CTCActionUseScriptedHook
00501450 E8/E9/imm/vtbl UNREAD 0 hits; not 004162B5 / 00418289 / 004189C2 (0049D9E0 is ret)
Live client dummy → first playable region HOST BRIDGE After the first dummy pump, Program calls EnsureFirstPlayableRegionLoaded: persist uses 00487C20; no-save uses the proven first WLD slot through 00500540 / 006C2170. This deliberately does not claim the unread native caller and does not run the 141-region 00501450 catalogue walk. It fixes the post-New-Game black frame without restoring the allocation spike. Locked by Live_client_after_New_Game_loads_first_playable_region_without_catalogue_walk.
Host seeds type-1 tick on InitGame DISPROVEN first-seen game+164 empty; 0041726D skips
Inner loop 009F8BA0 before 004162B5 PROVEN [game+52]==0; IAT 0x14404B4; +90556
00416E78 skipped when WorldFrame<=1 DISPROVEN prefix always runs; only 004457F0 is gated
Persist PlayerRegionName 00487C20 / 00449E60 loads named region (e.g. StartOakVale = 4) PROVEN Persist_PlayerRegionName_is_00487C20_not_new_game
SetRegionAsLoaded 004FC8A0 writes +156, then 00B42750 mode 1 DISPROVEN 004FC8A0 is MiniMap only. 00B428E0 is 004A1840 vtbl+208
004FC8A0 calls 005064C0 / 00B428E0 DISPROVEN 004FC8A0 is +156/00437CE0/0082BA00. 005064C0 is vtbl+88 before it. SetRegionAsLoaded_004FC8A0_is_minimap_after_005064C0
00B428E0 after 004AFC00 DISPROVEN 00500540 tail is dtor/ret 12. Caller is 00B23DC0 from 004A1840 004A1BD3
004A1840 WLD before Startup WAD DISPROVEN 00507C30 is world vtbl+8 0049E220 after WAD; 006C20A0 empty; Generate Offline skipped
First-seen 00B428E0 opens Lookout STB DISPROVEN arg is Data\Levels\FinalAlbion.stb; file absent; 00B42750 miss
OpenStaticMap 00B42530 STB height + compiled .lev (v25 / 0x1904) PROVEN 7869e8e / install test
00418289 / 004AEBA0 gate player/world on [player+9826]; 00417001 still skips camera body while WorldFrame<=1 PROVEN 7cc44c0 / Update_00418289_* / Render_00417001_*
WorldFrame inc at 004A5E10 via 0049DFB0 type-1 (00629270 / 004A5A40) PROVEN ced722f / WorldFrame_004A5E10_unblocks_004164E0
Camera body 004164E0 steps arg/15 when [0x13B8630]>0 PROVEN 6d7545a
0041707E interpolates when catchup ticks are 0 (default New Game) PROVEN c3be891
006B4900 world+24 slots; 006B42F0 lerps +6296/+6312/+6328 into ScriptedCamera PROVEN 6e1ff8e / World_camera_006B4900_slots_lerp_into_ScriptedCamera
Leave Press Start: 0059A238 msg 0xE500599D5C empty 005955AB0059584500596917 slot 0x17 NEW_PROFILE PROVEN Frontend_0059A238_msg_E5_empty_005955AB_is_00595845_then_00596917. Type-4 posts type-10 +352 only (48133e9). Host LMB edge queues Type4 (5dcc1fc). Host Return quarantined as accept. Return→msg 15 from Press Start DISPROVEN. Type-10 0xE5 is the 00598A1C attach write (00598EE6 is the mov inside it) → widget+352 (61e430f). #37 already locked. Later 59fde69 writes 0xE5 through slot 0x14 0059B5D7 then vtbl+284 0054E4F0.
New Profile accept: 00851770 seeds 0x122DE80 "Default"; msg 0x126008519200059697A MAIN_MENU_NO_CONTINUE PROVEN Frontend_00851770_seeds_Default_then_0x126_is_0059697A_main_menu. Persist CRC 0x53C644E4 as MessageId (def+228 via 0055B040 / 00632500): type-38 UI_ACCEPT_NEW_PROFILE stores 0x126 (f38f9f9). Action 26 posts widget+372 from def+224 (0 first-seen). LMB-up action 28 posts +228 after arm (48133e9).
Frontend New Game click: 0059A238 msg 15 → [retail+41]=1 → Leave 0042F2A2 PROVEN 64a2e14 / Frontend_00595582_new_game_message_leaves_without_RequestNewGame. Type-11 UI_FRONTEND_BUTTON_NEW_GAME stores 15 at +228 (f38f9f9). Action 26 posts empty +224 first-seen (9e94ef9). LMB-up action 28 posts +228 after arm (48133e9).
Menu built at 00595B24 (UI_TEXT_NEW_GAME id=0); not 00DBDE40 PROVEN same
Frontend frame 0042EC7C: input 0042E3EE → fill → draw 0042DF9E (BeginScene / UI vtbl+8 / EndScene / Present) PROVEN 0d8f5e5 / Frontend_0042EC7C_frame_is_input_then_0042DF9E_Present
Same Present as PlayAVI (009BEEB0); extra .wmv after draw skipped (00595A03 always 0) PROVEN same
006C2170 Loading objects → 00522720 / 00521AE0 current-map .tng (LookoutPoint on no-save) PROVEN 1ebece6 / Loading_objects_00521AE0_loads_LookoutPoint_tng
0051FD80 Load Single Thing: no-save LookoutPoint TNG has no PlayerCreature; HOLY_SITE_PLAYER_START GuildArrivalHSP00489D40 / 006AC910 inserts PlayerCreature at that pose. RHSet axes later (ff808b1); #18 done PROVEN 8f89aad / Load_single_thing_0051FD80_spawns_hero_at_LookoutPoint (refined by e0e0511)
No-save hero is 00DBDE40 / CREATURE_HERO_CHILD / StartOakVale DISPROVEN same
004AE940 Create Players writes [player+9826]=1 because 0099A350 always returns 1 (al=1) PROVEN ea479d2 / CreatePlayers_004AE940_sets_plus9826_via_0099A350
+9826 stays 0 after Create Players (first 004162B5 skips world) DISPROVEN same; first pump takes player/world/vtbl+24; WorldFrame increments
No-save first rendered scene is LookoutPoint RegionThings + hero camera 006B3FF0; client BindLifecycleFirstRegion skips if map name contains StartOakVale PROVEN fe6a11e / same LookoutPoint test + client early return
00662880 / 004CA010 insert binds CREATURE_HERO mesh 4299 after the PLAYER_HERO miss chain PROVEN e0e0511 / Load_single_thing_0051FD80_spawns_hero_at_LookoutPoint (HeroMeshId=4299)
0049F180 after characters: Init GUI 0043A380 PLAYER_GUI_PC PROVEN 21491ac / same test (PlayerGuiReady); bind still #17 / PARTIAL (Note-only)
00403079 / 009C0E50 display defaults 1024×768, title TEXT_GUI_WINDOW_TITLE PROVEN 48a879ac / Window_00403079_defaults_1024x768_and_title. Client Size = BackBufferWidth/Height. DefaultVulkan 1600×900 DISPROVEN (issue #8 done).
004B4260 activates QST AddQuest TRUE as world+172 (FinalAlbion then GlobalQuests, not WLD START_INITIAL_QUESTS) PROVEN 5dcc1fc / Init_quests_004B4260_activates_wld_initial_list (QuestsInitDone=true). 00507C30 has no START_INITIAL_QUESTS case.
00CB5AD0 starts QuestFactoryTable factory scripts (not S_QNOVI) PROVEN 48a879ac / Activate_quests_00CB5AD0_starts_factory_scripts. QM+44 (004B2850 / 004B00C0) gates activate before 00CB5AD0 (f38f9f9).
0042E3EE type/key events dispatch 0041E5F2 actions 0–5 / 20–21 (not WASD) PROVEN e7b3c76 / Input_0042E3EE_dispatches_0041E5F2_actions. 0055CB10 records actions; no recovered player-move listener. Not WASD. Host LMB edge queues Type4 (5dcc1fc). New Game keyboard N/Enter leftover still stands (leave #14 open).
009BEF80 SetViewport vtbl+188 full backbuffer 1024×768 MinZ 0 MaxZ 1 PROVEN 12e0d75 / Window_00403079_defaults_1024x768_and_title + Game_00435530_Presents_009BEEB0_and_pumps_input
Game 00435530 / 00435F50 Present is the same 009BEEB0 as frontend and PlayAVI PROVEN 12e0d75 / Game_00435530_Presents_009BEEB0_and_pumps_input. 00417001 does not Present; it calls 00435F7000435530 after WorldFrame>1. Client Draw is that Present, not a second swapchain.
00435530 flushes ScenePasses via 009DA9F0(1) DIP vtbl+332 (bits 0x40x400x200x1000x2000) PROVEN be8545e / 676bf63 / same Game_00435530 test (SubmittedLayerBits). Order BeginScene, Clear, PlayerOverlay 0043500000639E40, PlayerInterface 00435070, Flush2D 009D9C80, FlushLayers 009DA9F0(1), EndScene, Present. Overlay/interface still Note.
00CDC070 binds Q_SunnyvaleMaster persist slots via 004045C0 bool / 00410BE0 int PROVEN a708e60 / Activate_quests_00CB5AD0_starts_factory_scripts. PersistTable.Sunnyvale length 38, defaults 00CDBA10 zeros. BindBool 004045C0, BindInt 00410BE0, SunnyvaleBind 00CDC070.
00416E78 vtbl+24 after WorldFrame>1 pumps [game+32].vtbl+4 00446A30 player-interface listeners (0123758C / 0041649C) PROVEN 012dccad / Player_interface_00446A30_pumps_listeners_after_WorldFrame. Init Player Interface 004473A0 alloc 0x898 vtbl 01231BDC stored at game+32. Then 004457F0 [+2196]=0, poll 00446330 / 009F4ED0. Skip device 2 / key 15 / type 0. Listeners vtbl+32 accept 00687DB0, vtbl+16 apply 00687FD0 (0123758C). Zero E8 of 00446A30 itself; caller is 00416E78. After hit: 0041649C unless paused. Not the retail frontend 0042E3EE walk. Not 00DBDE40.
0123758C ActionInputListener: accept 00687DB0, apply 00687FD0; factory 00488D20. RecordingInputListener is gone PROVEN 6b02b3b / Player_interface_00446A30_pumps_listeners_after_WorldFrame
After 00446A30 hit: 0041649C unless paused; action==2 queues 009F1650. Default KeyMove3 DeliveredCount=0 until owner ResultSelect (recovered) PROVEN 6b02b3b / Player_apply_0041649C_queues_009F1650_on_action_2
WorldGeometry.ApplyActorPositions consumes 006A9960 dest via World.Positions. Father still NOVI_LiveFather via 00DB86B0. Not a renderer hack PROVEN 666df8f / WalkTo_writes_destination_and_entity_task
PlayAnimation apply 004C7470 / 0070D580 (vtbl+72 walk; +68 00686920 accept; 00662A00 table; 0070C050+0070D580 inner) PROVEN apply f778853. XSEQ first-key PaletteForPose (00A999B0/00AA4680/00A4C5E0) / XSeqFormatTests. Runtime still PARTIAL. Time interp 00AA0090 unread. FirstSeenPlayAnimationAppliesPose=false.
Engine primary-map draw, unload AVI, seed camera 006B3FF0 (LookoutPoint only; neighbour headers stay closed) PROVEN 9c625bc / Install_banks_and_startup_videos_exist / Open_records_instances_without_c3d_or_tiles (primaryOnly)
PlayAVI 00A3B380/00A3BC20 unload graph before the next 006286F0 slot PROVEN 0ace433 / PlayAvi_rewrites_xmv_to_installed_wmv_and_blocks (WmvPlayer.ReleaseGraphFn, PlayerDtorFn, GraphReleased). Does not lock leftover #20 3D Draw.
Client is IEngineHost; Pump owns AVI, New Game, world submit. Host only queues input and Presents PROVEN d9977fb / EngineFrame_constructs_for_host_present / Unexpanded_world_is_not_a_geometry_submit / Install_banks WorldSubmitted
Engine submit: unique primary C3Ds + primary terrain, no world triangle soup. SubmittedWorld stays unexpanded PROVEN f63b741 / Install_banks_and_startup_videos_exist (SubmittedMesh verts, LookoutPoint)
Engine submit skins PALSKIN C3Ds (TrianglesForPose / 00BD2F91) not static flatten. Hero 4299 is in SubmittedPalskinMeshIds PROVEN 5cb3435 / Install_banks_and_startup_videos_exist + Kid_c3d / Wake_loop_3420. First-seen dest later file triangles (cb22533); no CPU re-skin.
Submit before 00435530. Terrain is 00BDC2D0 AABB then 00BF4570 cells on opened patches PROVEN b062c5d / TessellateVisible_uses_00bdc2d0_aabb / Install_banks. Instances stay primary-only. Later persistent cells (3dba4a1); cell DIP 0x40 only (40037b1).
Init Graphics opens GBANK_MAIN_PC; submitted ids go on EngineFrame.Textures. Game Present waits for seed+submit PROVEN 991bab2 / Install_banks SubmittedTextures. Program no longer constructs TextureLibrary.
First-seen Lookout green is leftover c3=(0,0.125,0) × mul_x2 × oT1=(0,0), not a missing sampler PROVEN Dx9VulkanShaderConstants.UnlitRgbIsC3Leftover. Do not invent world UV.
Q_NewOakValeIntro / SHOT2 is not first no-save Present. First playable is Lookout 006B3FF0 PROVEN 004162B5 dump: +20 then +28. Frontend 00595222 is the resident-slot vtbl+8 walk (7adf621 / b4a2c89). Present 0042DF9E still Note-only.
0042DF9E walks [ui+84] vtbl+8, then 009D9C80/009DA9F0(1) twice. 00404A80 is getter 0x13B7CD8 PROVEN 5657176 / 6607c1e / Frontend_0042EC7C_frame_is_input_then_0042DF9E_Present (FrontendFlushCount=2, FrontendDisplayHelperFn, FrontendDisplaySingletonVa). Walks every resident [ui+84] slot (b4a2c89 / Frontend_tick_and_draw_walk_resident_ui84_slots). Present 0042DF9E still Note-only. New Game still keyboard N/Enter (leave #14 open).
PRESS_START is type 10 0054E3D0 vtbl 012497E4; draw 00530260 +176; 005339B0 +272=1; UI_PRESS_START_TEXT TEXT_GUI_MENU_PRESS_BUTTON PROVEN Frontend_PRESS_START_is_type_10_with_text_child. Type-0 0041B800 / dest-always-0 / 0041AFA0 as the menu draw is DISPROVEN. 00595222 calls [node+20].vtbl+8. Types 5/10/12/18 are 00530260. Attach no longer Finds UI_PRESS_START_TEXT after every root (7adf621).
Press Start sprites are frontend.big FRONTEND_TITLE_01/02_SPRITE + FORREST_1_* + mouse PROVEN decoded via TextureFile (Rgba8 framed LZO); title 256×128 gold logo; forest DXT1 oak grove
frontend.bin drives widget tree, dest, sprites and DX9-to-Vulkan submit PROVEN 0d77c2c. e79f7b4 drops unused usings from FrontendWidgetFactory (cleanup of 0d77c2c). Type-10 draw is 00530260 vtbl+8 DrawsChildList (7adf621). Present 0042DF9E still Note-only. Host LMB edge queues Type4 (5dcc1fc). Host queues LMB-up as type 6 (48133e9). leave #14 and #20 open.
Press Start dest inherits type-10 remap scale. Leftover +204/+208 only when GraphicIndex != 0. leftover+204 GraphicIndex gate recovered (76edbbd): index 0 → leftover 0. dest still invented 512,384,512,384; tests lock that dest. Type-6 leftover 16×16 is gone; leftover204 is widget +204 (0 first-seen). Type-6 dest is a point at remapped origin (512,384,512,384), not ctor 0,0,0,0. UI_TITLE_01 dest still from texture FrameWidth 256. Nonempty dest draw path is still 00BAE2D0 / 00BAD8A0. EnqueuesDisplayQueue still false. No E8 009DB700. FrontendEnqueueRan still true on nonempty dest / PRESS START. Host Notes 009DA9F0(1) [+16020] empty / skip DIP — stand-in, not a recovered queue read. DisplayFlushShouldDip(0, 0) always false PROVEN / leftover #36 1a08cc0 / later b1d6877 / 76edbbd / Type6_leftover204_is_widget_plus204_not_dest_width / Leftover204_is_0041AC20_graphic_index_not_persist_size / Press_Start_type6_dest_is_a_point / Frontend_PRESS_START_is_type_10_with_text_child / Press_Start_first_seen_dest_table_matches_0041AFA0 / Frontend_0041AC20_dest_and_0xE5_new_profile_0x126_main_menu_15 / Nonempty_dest_draws_via_00BAE2D0_not_009DB700. leave #36 open.
Type-4 posts 0xE5 on Press Start. Host Return quarantined as accept. 0x126/15 were still injected at this SHA. CUIDef persist 00631C60 +189/+190 u8s consumed so Absolute stays aligned. Type-6 Font 26051 is a names.bin offset that resolves to ENG_ARIAL_24, not the 0054F4B0 ENG_ARIAL_16 helper PROVEN db36334
Persist CRC 0x53C644E4 as MessageId (def+224 via 0055B040). Type-38 UI_ACCEPT_NEW_PROFILE stores 0x126; type-11 UI_FRONTEND_BUTTON_NEW_GAME stores 15. Type 4 is 00A03C80 (+40=4), not a DIK. Action 26 posts stored id. Lifecycle no longer injects 0x126/15 PROVEN c180b8c / Type4_drives_lifecycle_0xE5_then_0x126_then_15. Later f38f9f9 moves MessageId to persist +228.
QST AddQuest TRUE as world+172 (FinalAlbion then GlobalQuests, not WLD START_INITIAL_QUESTS). Host LMB edge queues Type4. DikPosterUnread=false PROVEN 5dcc1fc
MessageId is persist +228 / 0x53C644E4 (00632500), not +224 (0x230364D6). QM+44 (004B2850 / 004B00C0) gates activate before 00CB5AD0 PROVEN f38f9f9
Action 26 posts widget+372 from def+224 (0 first-seen on Accept/New Game). 0x53C644E4 at +228 still holds 0x126/15. Widgets carry Plus224 PROVEN 9e94ef9
Type 11/38 +228 via 0055ACF0. Type-10 0xE5 is only the 00598A1C attach write (00598EE6 is the mov inside it). Empty widget lists no longer invent 0xE5. Press Start name-check invent gone. 0xE5 host fill gone PROVEN 61e430f / Frontend_press_start_type4_without_widgets_does_not_invent_0xE5. #37 first half locked.
Type 11/38 +228 on LMB-up action 28 after action 26 arms. Type 4 still posts type-10 +352 only (not first-visible +228). Type 6 (00A03D60) is action 28 / vtbl+588 / 0055ACF0. Host queues LMB-up as type 6. Unarmed +228 lists stay silent PROVEN 48133e9 / Type4_action_26_posts_stored_widget_message (ActionType4 accept == null) / Type4_drives_lifecycle_0xE5_then_0x126_then_15 (Type4 then Type6). #37 second half locked.
Press Start 0xE5 host fill gone; Type4 posts type-10 +352 only; Type6 LMB-up action 28 posts +228 after arm. Unarmed lists silent. #37 already locked PROVEN 61e430f / Frontend_press_start_type4_without_widgets_does_not_invent_0xE5. 48133e9 / Type4_action_26_posts_stored_widget_message / Type4_drives_lifecycle_0xE5_then_0x126_then_15
Draw type-10 menus via vtbl+8 DrawsChildList. 00595222 calls [node+20].vtbl+8. Types 5/10/12/18 are 00530260. Attach no longer Finds UI_PRESS_START_TEXT after every root. 00598EE6 stays on the 00598A1C slot-0x14 write PROVEN 7adf621. Present 0042DF9E still Note-only.
Write Press Start 0xE5 through slot 0x14 0059B5D7. Native attach looks up [ui+84] key 0x14 then vtbl+284 0054E4F0. Dropped leftover widgets[0] type-10 / MessageId==0 walk. Host still collapses [packet+0] onto MessageId (leftover field) PROVEN 59fde69 / Frontend_attach_0xE5_is_slot_0x14_0059B5D7_not_type10_walk
Keep [ui+84] slots 0x14 and 0x17 across menu switch. 00596763 switches current screen; it does not drop the map. 00595A06 overwrites existing key 0 with Main Menu. Stop AttachFrontendTree from clearing the slot map. Host current _frontendWidgets is still the switched screen (input leftover) PROVEN 84a8350 / Frontend_ui84_keeps_slot_0x14_and_0x17_after_main_menu
Walk every resident [ui+84] slot on tick and draw. 00595222 vtbl+8 and 0059A0C4 vtbl+4 are the same in-order map walk; they do not filter to the current screen. Keep _frontendWidgets as the switched tree for input PROVEN b4a2c89 / Frontend_tick_and_draw_walk_resident_ui84_slots (FrontendResidentSlots)
Write +332 via SelectState(6) on slot switch; construct world in Init World. 0052CF40 stores vtbl+192 arg at +332. 004A67D0/004A6E30 belong inside "Init World" 0041735A, before "Init Display Engine" 00417418. CreatePlayers runs at the named 004166A8 stage PROVEN b8a2b21 / Frontend_attach_0xE5_is_slot_0x14_0059B5D7_not_type10_walk (kept.State == 6, Note +332=6) / Init_World_004A67D0_runs_inside_0041735A_before_00417418
+332 SelectState(6) is a +302 hide DISPROVEN 0052CF40 stores vtbl+192 arg at +332 (b8a2b21)
Run Init Fonts after Graphics and select +332=5 on the new current. 004168DC looks up ENG_ARIAL_18 via 009E2C80 and stores it at game+90444. That is not frontend type-6 ENG_ARIAL_16/ENG_ARIAL_24. 0059A119 applies vtbl+192(5) to the incoming slot after the old current got vtbl+192(6) PROVEN 9901d3b / Init_Fonts_004168DC_stores_ENG_ARIAL_18_at_game_plus90444
Ensure the 0xE0 [0x13B879C] singleton before Thing Components. 0044C6B6 is a present-check; first-seen miss constructs 0044C6C2 / 0044C71F. Init frontend 005952C3 applies vtbl+192(5) to Press Start PROVEN 6ae001f / Init_Game_0044C6B6_ensures_0xE0_singleton_before_Thing_Components
0044C6B0 is the 0xE0 singleton ctor DISPROVEN 0044C6B0 remains the later getter (6ae001f)
Register Data\Defs\misc_def_types.h into [0x13B8A54] at Init Subtitled. 004CDB10 via 00A39010. Not Speak. 00A38E50 payload UNREAD PROVEN 540e30c / Init_Subtitled_004CDB10_registers_00A39010_at_13B8A54
Bind STANDARD_TALK and CONVERSATION names at Init Conversation Attitude. 004CD670 via 0099EFE0 (18/12/12). Not Speak. Later Thing Components Notes Add Def Class for CHeroMorphDef then CHighlightItemDef / CSmokeGeneratorDef / CTimeAppearanceFadeDef / CCreatureNavigationDef / CInventoryItemDef / CLookDef / CReadableDef / CVillageDef / CVillageMemberDef / CBuyableHouseDef / CBuyHouseDef / CWifeDef / CDoorDef / CLightDef / CSpotLightDef / CClockDef / CHeroDef; MATCH is Note-only + *DefClassRegistered flag, not a live constructed object PROVEN fe6c09c / Init_Conversation_004CD670_binds_STANDARD_TALK_tables
Store the 44-byte player owner at game+28 during Init Player Manager. 0041732A: 00BFEA1A(44) / 0044C6B0 / 0044A3B0 vtbl 01231CD0 size 44 / 004193A0 [game+28]. Not Create Players (004166A8). Hero swap names hero_swap_1.tng_4.tng belong on this owner PROVEN 4a03969 / Init_Player_Manager_0041732A_stores_44byte_owner_at_game_plus28
Host ctor note of 0044A3B0 under Init Player Interface DISPROVEN moved to Init Player Manager (4a03969)
+24=0 write on the player owner DISPROVEN 4a03969 / same owner test
Add CHeroMorphDef against the live +40 cap during Init Thing Components. 004EE337 / 0044C6B0 / 009B0AC0 / factory 004E4219 / 009AD6E0 / 009FC4F0 [this+40]=0x80000. Host Note-only + FirstDefClassRegistered. MATCH is Notes+flag, not a live object. LoadDef field walk stays PARTIAL. Do not invent 00A38E50 PROVEN b7f4c34 / Init_Thing_Components_004EE23F_adds_CHeroMorphDef_against_plus40
Prepare the definition manager via vtbl+8 0044C72B and 009ACB10. Host PrepareDefinitionManager() Notes 0044C6B0 / 0044C72B [vtbl+8] / 009ACB10 / 009E5250 and sets DefinitionManagerPrepared. dest 0044C72B as [01232C24+8] is not rdata-locked (sibling proofs/00416005-def-manager dest UNREAD). Leave #42 open. Do not call dest PROVEN. Not a game.bin parse. Different object from later Subtitled [0x13B8A54] PROVEN 587baae / Init_Definition_Manager_00416005_resets_plus88_via_vtbl8
Add CHighlightItemDef after CHeroMorphDef during Init Thing Components. Site 004EE565 / dest 009B0AC0 / factory 004D8671 size 72 vtbl 0123BD14. Note-only + SecondDefClassRegistered. MATCH is Notes+flag, not a 72-byte object PROVEN acfe46f / Init_Thing_Components_004EE565_adds_CHighlightItemDef
Add CSmokeGeneratorDef after CHighlightItemDef. Site 004EE62B (0044C6B0), dest 009B0AC0 at 004EE632, factory 004DA82B size 48 vtbl 0123E924, name CSmokeGeneratorDef. Host Note-only + ThirdDefClassRegistered. MATCH is Notes+flag, not a live 48-byte object PROVEN 100e5cf / Init_Thing_Components_004EE632_adds_CSmokeGeneratorDef
CTCSmokeGenerator 004EE588 is the next 009B0AC0 / Add Def Class DISPROVEN CTC row, not Add Def Class (100e5cf / Init_Thing_Components_004EE632_adds_CSmokeGeneratorDef)
Add CTimeAppearanceFadeDef after CSmokeGeneratorDef. Site 004EE6FD (0044C6B0), dest 009B0AC0 at 004EE704, factory 004D84C8 size 56 vtbl 0123B7CC, name CTimeAppearanceFadeDef. Host Note-only + FourthDefClassRegistered. MATCH is Notes+flag, not a live 56-byte object PROVEN 1a4c51d / Init_Thing_Components_004EE704_adds_CTimeAppearanceFadeDef
CTCTimeAppearanceFade 004EE64E is the next 009B0AC0 / Add Def Class DISPROVEN CTC row, not Add Def Class (1a4c51d / Init_Thing_Components_004EE704_adds_CTimeAppearanceFadeDef)
Add CCreatureNavigationDef after CTimeAppearanceFadeDef. Site 004EE92B / dest 009B0AC0 at 004EE932 / factory 004DA871 size 56 vtbl 0123E98C. Host Note-only + FifthDefClassRegistered. MATCH is Notes+flag, not a live 56-byte object PROVEN ee08490 / Init_Thing_Components_004EE932_adds_CCreatureNavigationDef
CTC physics/nav rows (CTCPhysicsLight / CTCPhysicsStandard / CTCPhysicsControlled / CTCCreatureNavigation) are the next 009B0AC0 / Add Def Class DISPROVEN CTC rows, not Add Def Class (ee08490 / Init_Thing_Components_004EE932_adds_CCreatureNavigationDef)
Add CInventoryItemDef after CCreatureNavigationDef. Site 004EF23D / dest 009B0AC0 at 004EF244 / factory 0044F644 jmp 0044C108 size 112 vtbl 01231DBC. Host Note-only + SixthDefClassRegistered. MATCH is Notes+flag, not a live 112-byte object. Also started proofs/github-issues-verify (index only at that SHA). Do not close issues from Note-only PROVEN 3a7b594 / Init_Thing_Components_004EF244_adds_CInventoryItemDef
Add CLookDef after CInventoryItemDef. Site 004EF37F / dest 009B0AC0 at 004EF386 / factory 004D80E4 ctor 0044C0C0 size 88 vtbl 0123AE14. Host Note-only + SeventhDefClassRegistered. MATCH is Notes+flag, not a live 88-byte object. Type-6 leftover 16×16 is gone; leftover204 is widget +204 (0 first-seen). Type-6 dest is a point at remapped origin (512,384), not ctor 0,0,0,0. UI_TITLE_01 dest still from texture FrameWidth 256. Host Notes 009DA9F0(1) [+16020] empty / skip DIP: DisplayFlushShouldDip(0, 0) is always false; host never stores [this+16020]. That empty Note is stand-in, not a recovered queue read. FrontendEnqueueRan still true on nonempty dest / PRESS START. EnqueuesDisplayQueue still false. No E8 009DB700. Draw path is still 00BAE2D0 / 00BAD8A0. Leave #36 open PROVEN b1d6877 / Init_Thing_Components_004EF386_adds_CLookDef / Type6_leftover204_is_widget_plus204_not_dest_width / Press_Start_type6_dest_is_a_point / Frontend_PRESS_START_is_type_10_with_text_child / Press_Start_first_seen_dest_table_matches_0041AFA0 / Nonempty_dest_draws_via_00BAE2D0_not_009DB700
CTCCreatureExpression / CTCLook are the next 009B0AC0 / Add Def Class DISPROVEN CTC rows, not Add Def Class (b1d6877 / Init_Thing_Components_004EF386_adds_CLookDef)
Add CReadableDef after CLookDef. Site 004EF5AD / dest 009B0AC0 at 004EF5B4 / factory 004DAA0E ctor 0044C0C0 size 38 vtbl 0123E9F4. Host Note-only + EighthDefClassRegistered. MATCH is Notes+flag, not a live object. Size 38 is thin (no factory dump) PROVEN 113a514 / Init_Thing_Components_004EF5B4_adds_CReadableDef
CTCActionUseTorch / CTCActionUseReadable are the next 009B0AC0 / Add Def Class DISPROVEN CTC rows, not Add Def Class (113a514 / Init_Thing_Components_004EF5B4_adds_CReadableDef)
Type-6 host Notes 00543910 / 0x27 size 64; add CVillageDef after CReadableDef. Site 004F0171 / dest 009B0AC0 at 004F0178 / factory 004E213B pack 0042DAE0 ctor 004DFF04 size 0x10C vtbl 01241DDC. Host Note-only + NinthDefClassRegistered. MATCH is Notes+flag, not a live object. Type-6 0x27 is the host packer Note vs old 0x22 host pack (Type6_widget_packs_00543910_type_27_not_0041BEB0). Last present packer stays 0041BEB0 / 0x22. EnqueuesDisplayQueue still false. No native pack into +16020. Host still Notes 009DA9F0(1) [+16020] empty. Leave #36 open PROVEN a141c27 / Init_Thing_Components_004F0178_adds_CVillageDef / Type6_widget_packs_00543910_type_27_not_0041BEB0
CTCActionUseSearch is the next 009B0AC0 / Add Def Class DISPROVEN CTC row, not Add Def Class (a141c27 / Init_Thing_Components_004F0178_adds_CVillageDef)
Recover 0041AC20 leftover +204 from GraphicIndex (index 0 → leftover 0); dest still invented 512,384,512,384 through 0xE5 leave; add CVillageMemberDef after CVillageDef. Site 004F0227 / dest 009B0AC0 at 004F022E / factory 004DA7AD ctor 0044C0C0 size 38 vtbl 0123E854. Host Note-only + TenthDefClassRegistered. MATCH is Notes+flag, not a live object. DIP still DisplayFlushShouldDip(0, 0) always-empty stand-in. Leave #36 open PROVEN 76edbbd / Init_Thing_Components_004F022E_adds_CVillageMemberDef / Leftover204_is_0041AC20_graphic_index_not_persist_size / Frontend_0041AC20_dest_and_0xE5_new_profile_0x126_main_menu_15
Add CBuyableHouseDef after CVillageMemberDef. Site 004F02DD / dest 009B0AC0 at 004F02E4 / factory 004E0148 ctor 004DDB2C size 76 vtbl 0124131C. Host Note-only + EleventhDefClassRegistered. MATCH is Notes+flag, not a live object. proofs/frontend-no-screen-draw-fork is a host grep labeled PROVEN, not a native dest lock. Quiet leftover; do not file a new issue PROVEN 91564bd / Init_Thing_Components_004F02E4_adds_CBuyableHouseDef
Dump three frontend screens after AVI skip; add CBuyHouseDef after CBuyableHouseDef. Site 004F0393 / dest 009B0AC0 at 004F039A / factory 004D7B5B ctor 0044C0C0 size 38 vtbl 0123A61C. Host Note-only + TwelfthDefClassRegistered. MATCH is Notes+flag, not a live object. Optional FABLE_SKIP_STARTUP_AVI is host FinishStartupVideo, not native DIK skip. Screen dumps re-lock invented dest. proofs/frontend-screens-vs-native dest MATCH oversell restates #36. Leave #36 open. Do not treat the AVI skip env as a 3D Draw fix (leave #20 open) PROVEN f30c099 / Init_Thing_Components_004F039A_adds_CBuyHouseDef / Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip
Present type-16/18 persist child 0; add CWifeDef after CBuyHouseDef. Site 004F04B4 / dest 009B0AC0 at 004F04BB / factory 004D7BA1 ctor 0044C0C0 size 44 vtbl 0123A69C. Host Note-only + ThirteenthDefClassRegistered. MATCH is Notes+flag, not a live object. Type 16 CTextSlider vtbl+8 is 00530260. First-seen +348=0 keeps ARROWS/NORMAL. Type-6 dest stays a POINT (512,384,512,384). At this SHA host DrawContainerWalk / IsPresented exclusive-walked kids[ActiveChild] for SelectsChild. Proof proofs/type16-18-present-child DISPROVES 00530260 exclusive-walk (native walks every +176 child, skip vtbl+400 / +420). Unused ApplySelectState maps one state onto all type 16/18. Filed issue #46. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Leave #46 open. Dest still invented. Leave #36 open PROVEN 71ae66e / Init_Thing_Components_004F04BB_adds_CWifeDef / Factory_builds_press_start_then_main_menu_from_the_same_walk
Present skip from listing (constants + proof only); add CDoorDef after CWifeDef. Site 004F0640 / dest 009B0AC0 at 004F0647 / factory 004D7BE7 ctor 0044C0C0 size 60 vtbl 0123A714. Host Note-only + FourteenthDefClassRegistered. MATCH is Notes+flag, not a live object. Test Init_Thing_Components_004F0647_adds_CDoorDef. 405b1e8 also fixes the thirteenth early-return (if (!ThirteenthDefClassRegistered) then fourteenth) so CWifeDef and CDoorDef both register — a real host fix. Shape-2 pack 0042DAE0. FrontendWidgetType constants: BorrowedVisibleFn 0052F180 ([+300]>>7, persist def+504), ClipBitFn 0052F1D0 ([+302]&1, persist def+392, CRC UNREAD), ForwardSelectFn 0041C5A0, TextSliderIndexOffset 348. Those VAs are never read by DrawContainerWalk or IsPresented. At this SHA host exclusive-walked kids[ActiveChild] for SelectsChild. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip now asserts FrontendResidentSlots keep 0 / 0x14 / 0x17. Proof proofs/listing-present-skip: 00530260 walks every +176 then +188; skip is vtbl+400 / vtbl+420. Native 00530260 does NOT exclusive-walk. Host SelectsChild + Visible=false on k!=0 is still the first-seen present set (forest_1 / ARROWS / NORMAL). Do not treat skip as recovered in the host walk. Leave #46 open. Dest still invented 512,384,512,384. Leave #36 open. Next leftover (not an issue): CLightDef 004F06F6 / 004D7C73 size 92 vtbl 0123A814 PROVEN 405b1e8 / Init_Thing_Components_004F0647_adds_CDoorDef / Factory_builds_press_start_then_main_menu_from_the_same_walk / Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip
Forward SelectState +332 via 0041C5A0; add CLightDef after CDoorDef. Site 004F06F6 / dest 009B0AC0 at 004F06FD / factory 004D7C73 / ctor 0044C0C0 / size 92 / vtbl 0123A814. Host Note-only + FifteenthDefClassRegistered. MATCH is Note-only + *DefClassRegistered flag, not a live constructed object. SelectFrontendState now ForwardSelectState: writes +332 and Notes 0041C5A0 to persist +176 children. Not ActiveChild, not Visible=false, not current-slot-only draw. Tests lock CLightDef Notes plus leftover Press Start State=6 / UI_PRESS_START_TEXT Visible / FORREST_1_1 Visible / 0041C5A0 Note. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Leave #46 open. Dest still invented. Leave #36 open PROVEN 46663e3 / Init_Thing_Components_004F06FD_adds_CLightDef / Factory_builds_press_start_then_main_menu_from_the_same_walk / Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip
Skip leaf DIP when packed alpha is 0; add CSpotLightDef after CLightDef. Site 004F07AC / dest 009B0AC0 / factory 004D7CB9 / ctor 0044C0C0 / size 68 / vtbl 0123A88C. Host Note-only + SixteenthDefClassRegistered. MATCH is Note-only + *DefClassRegistered flag, not a live constructed object. 0041AFA0 and 0054EF00 skip 0041BEB0 when +151==0. Dest-zero already skips sprites. Not current-slot-only draw. LeafDipSkipped is a real CompositeFrontendPresent gate, but PackPersistColour(0,0,0,0) returns 0xFFFFFFFF so unread/ctor colour never skips. Tests lock CSpotLightDef Notes and LeafPresentFn 0041AFA0 / Type6PresentFn 0054EF00 / LeafDipSkipped helper, not leftover-slot actual +151. Style-6 persist flags remain UNREAD and are not applied. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Do not file style-6 UNREAD. Leave #46 #36 open PROVEN db3899a / Init_Thing_Components_004F07B3_adds_CSpotLightDef / Factory_builds_press_start_then_main_menu_from_the_same_walk
Add CClockDef after CSpotLightDef; name 0052C7E0 style-tick flags. Site 004F0862 / dest 009B0AC0 / factory 004E4477 / ctor 004E380E / size 56 / vtbl 01242C34. Host Note-only + SeventeenthDefClassRegistered. MATCH is Note-only + *DefClassRegistered flag, not a live constructed object. Style-tick dword0 bits 0x10/0x20/0x40 are named from StyleTickFn 0x0052C7E0. They are not applied. Persist style-6 dword0 remains UNREAD. StyleFlagsZeroDest comment misnames native 0x20 (zeros +76/+80 parent-local, not dest) — do not file that comment as a leftover. Later 88a9ab8 dropped exclusive-walk; dest still invented. Native skip vtbl+400 (+504) still unused. Leave #46 #36 open PROVEN 065eb28 / Init_Thing_Components_004F0869_adds_CClockDef / Factory_builds_press_start_then_main_menu_from_the_same_walk
Add CHeroDef after CClockDef; name 0052CEB0 style lookup +20. Site 004F0918 / dest 009B0AC0 / factory 004D7CFF / ctor 0044C0C0 / size 48 / vtbl 0123A904. Host Note-only + EighteenthDefClassRegistered. MATCH is Note-only + *DefClassRegistered flag, not a live constructed object. 00631C60 persist of CUIDef+64 is 00632E00 stride 124; 00433FE0 starts at style +60. StyleLookupFn 0x0052CEB0 returns map node +20. Named only, not applied. Persist style-6 dword0 is UNREAD and is not applied. Next leftover CCreatureModeDef 004F0D26 / 004E0B4B is not shipped — do not file. Later 88a9ab8 dropped exclusive-walk; dest still invented. Native skip vtbl+400 (+504) still unused. Leave #46 #36 open PROVEN 6577614 / Init_Thing_Components_004F091F_adds_CHeroDef / Factory_builds_press_start_then_main_menu_from_the_same_walk
Recover New Profile frontend layout and hit-test from exe. Not an Add-Def-Class MATCH. This is a recover commit. Persist parse of type-12 UI_NEW_PROFILE_MENU +326=30 (CRC 0xD7495328) and Sprites (key, defIndex) / Plus96 CRC 0x38BB7ED4 is real file recover. Layout writes authored Y index * 30 into PersistY. Type-2 leftover +204/+208 claimed as persist W/H (00551340); UI_BUTTON_OPTIONS_LEFT leftover (180, 0). PlaceTableCell claimed 00551EA0 when +96 bit 0; count==3 invents left/right leftover W and a middle fill. ExpandTableDests sets table DestY1 from children when dest height is 0. Hit-test: new FrontendHitTest claimed 0055B8F0 / 0055BF10; dest AABB if area else union of presented descendants; smallest-area reverse-walk. Type6 maps MessageFromPlus228List. Empty space does not Accept. Client maps LMB to dest space (fb / BackBuffer, else 1024×768). Enter still queues TypeKey (AVI skip), not New Game. No Key.N / ActivateNewGame in Program.cs. Press Start dest table unchanged: type-6 still remapped point 512,384,512,384. DIP path not touched (DisplayFlushShouldDip(0,0) still false; no [this+16020]). Later 88a9ab8 dropped exclusive-walk (IsPresented no longer kids[ActiveChild]). Native skip vtbl+400 (+504) still unused. Style-6 still UNREAD. Tests do not lock dest numbers: they assert ≥4 distinct live DestY0, Apply/Cancel hits disjoint, empty-space no Accept, Apply ClickNamed → Main Menu, tautology VAs. Oversell: “from exe” pins 00551EA0 / 0055B8F0 / 00551340 onto host heuristics. Filed #48. Leave #14 #20 #36 #42 #46 #48 open. leave #14 open on ClickNamed PROVEN b075dd3 / New_Profile_type12_rows_use_persist_plus326_not_equal_Y / New_Profile_apply_cancel_hit_rects_are_disjoint / New_Profile_empty_space_Type4_Type6_does_not_accept / New_Profile_Apply_hit_posts_0x126_Cancel_does_not
Pack type-12 rows so persist X=-100 is not dest X=-45. Persist Plus322 CRC 0xA04E63BE. ListChildAuthoredPos packs children; persist X=-100 discarded. Stopped writing packed Y back onto PersistY (partial #48 item 4). Added ExpandControlDests (type-16/37 dest grown from rightmost type-2 — invented dest). Tests lock host pack formula and “has area”, not dest numbers. Press Start dest table unchanged: type-6 still remapped point 512,384,512,384. DIP (0,0) stand-in. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Style-6 still named-only. #48 stays open. Leave #14 #20 #36 #42 #46 #48 open PROVEN 43b1cf2 / New_Profile_type12_rows_use_persist_plus326_not_equal_Y
Hit New Profile widgets from dest, not leftover unions. UnionDescendants deleted. HitRect = dest AABB only. Point dests miss. Dest writers unchanged (ExpandControlDests, PlaceTableCell n==3, ExpandTableDests). #48 stays open (union stop is item 2 only). Press Start dest table unchanged. DIP (0,0) stand-in. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Leave #14 #20 #36 #42 #46 #48 open PROVEN 6e76ac5 / New_Profile_per_control_LMB_uses_dest_not_empty_space / New_Profile_apply_cancel_hit_rects_are_disjoint
Tile type-2 leftover cells and keep type-16 dest a point. ExpandControlDests deleted. Type-16/37 dest is a point again (honest undo of 43b1cf2 size invent). PlaceTableCell n==3 fill is NOT gone — first/last sibling leftover W as caps. BindEditBoxSeed / SpritesThenGlyphs claimed 00851770 / 0054EF00 — oversell. Tests: slider/edit dest is a point; live cells tile-the-bar, not dest tuples. #5 grok-goal dump still written — do not re-file. #48 stays open. Press Start dest table unchanged. DIP (0,0) stand-in. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Leave #14 #20 #36 #42 #46 #48 open PROVEN 68eb1c5 / New_Profile_persist_child_order_and_layers / New_Profile_type12_rows_use_persist_plus326_not_equal_Y
Pair type-2 sprite keys as left/right caps and stretch. Persist Sprites sorted by key → clone order L, R, M. SpriteKeys == [0,1,4] MATCH persist. PlaceTableCell index 1 is now right cap; n==3 leftover fill still invented. TryChromeHit: if dest is a point, hit = dest origin + rightmost type-2 table dest size. Claimed 0055B8F0. Regresses 6e76ac5 “hit dest AABB only” for type-16/37. SpritesThenGlyphs now per [ui+84] tree (0054EF00 oversell). Tests lock tiling / nonempty chrome hit / click (700,300), not dest numbers. Persist leftover LEFT still (180, 0); helper uses 288×32. #48 stays open. Press Start dest table unchanged. DIP (0,0) stand-in. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. Leave #14 #20 #36 #42 #46 #48 open PROVEN 069c6a9 / New_Profile_persist_child_order_and_layers / New_Profile_apply_cancel_hit_rects_are_disjoint
New Game TNG load + menu cap slice. TNG: LoadGlobalThingsFile now breaks on the first LoadedOnPlayerProximity map, Notes LoadGlobalThingsPerMap (004FDBC0) as "004FBF60 " + lookout.ScriptName + ".tng", loads that one TNG, sets GlobalThingMapsLoaded = 1. Does not look up map.Index == 1 or name LookoutPoint; takes first proximity map in WLD parse order. Comment claims 004FDBC0 ebx=1 skips dummy slot 0 and first 004FBF60 is LookoutPoint (NewMap 1); later maps stay closed until 00501450 / ContainsMap. Real reason in code: parsing every proximity .tng OOMs the New Game pump. Menu slice: Type-2 PlaceTableCell only when persistW == 0 && persistH == 0. Persist-size kids (mouse-area) skip the table helper and fall through to generic dest / inherit-scale 005339B0. PlaceTableCell body unchanged from 069c6a9 (count==3 host L/R/mid fill claimed as 00551EA0). AttachSpriteCells still attaches every SpriteDefIndices entry. Tests: New_Game_004FDBC0_opens_LookoutPoint_only locks GlobalThingMapsLoaded == 1 + LookoutPoint in the Note, no Bowerstone Note. Does not lock NewMap index, ebx=1, 004FBF60 callee, or 00501450. Main_Menu_button_slices_are_sprite_keys_not_mouse_area locks SpriteKeys == [0,1,4], mouse-area persist W>0 / alpha 0, kids[1..3] tile the table dest. Host dest tiling, no native dest tuple. Filed leftover #50: host first-proximity TNG / OOM workaround sold as recovered 004FDBC0 NewMap 1. Do not fold #50 into #4 (ledgers vs TNG pump). Persist-size skip is #48 family, not a new leftover. Press Start dest table unchanged. DIP (0,0) stand-in. Later 88a9ab8 dropped exclusive-walk; native skip vtbl+400 (+504) still unused. CompositeFrontendPresent still BuildBatch(..., 0, 0, width, height). Leave #14 #20 #36 #42 #46 #48 #50 open PROVEN d628952 / New_Game_004FDBC0_opens_LookoutPoint_only / Main_Menu_button_slices_are_sprite_keys_not_mouse_area
Recover 0055BF10 hover so Accept LMB posts 0x126. Host HitIndex + Hovered. HoverSelectFn == 0x0055BF10 is a tautology. No +352 byte. Later rewritten by e3208eb. dest still invented. DIP (0,0) stand-in. leave #14 #20 #36 #42 #46 #48 #50 open PROVEN 681620d / New_Profile_hover_0055BF10_swaps_type38_on_off
Present frontend as 0042DF9E 2D only; skip State-6 DIP. Host gate _frontendReady && !playAviOnly skips mesh/gizmos in VulkanLineRenderer.Record. window.Render still always host.Draw. Not a recovered 0042DF9E walk (no BeginScene / 00595222 / EndScene / 009BEEB0). CompositeFrontendPresent State-6 tree skip was host and was REMOVED in e3208eb. Present 0042DF9E still Note. DisplayFlushShouldDip(0,0) still false. dest still 512,384,512,384. New Game still not locked (Enter is PlayAVI skip). leave #14 open. PlayAVI still host.Draw. leave #20 open. Leave #14 #20 #36 #42 #46 #48 #50 open PROVEN dd0a0f0
Dump type 11/38 vtbls; drop leftover hover hacks. DrawsChildList now includes type 11 and 38 (comment dumps 01249554+8 / 0124B04C+8 as 00530260). Table[11].Vtbl is still 0; dump is comment-only. Tests lock ContainerDrawFn == 0x00530260 tautology. Hover is host Contains||HitIndex on type 11/38 when TypeMouse is in Applied. Hovered stand-in for +352 on Arm. Dropped TryMouseAreaDest dest copy, ON/OFF colour/texture swap, type-32 pointer dest, State-6 present skip. Test New_Profile_hover_0055BF10_swaps_type38_on_off no longer checks ON/OFF colour swap. dest still a point. leave #14 #20 #36 #42 #46 #48 #50 open PROVEN e3208eb / New_Profile_hover_0055BF10_swaps_type38_on_off
Parse persist clip/align/style ColourA and drop leftover sibling hide. Wire persist +392 Clip (vtbl+420), +504 CRC parsed but NOT applied to vtbl+400 skip, +508 type-6 align (tests lock arrows Plus508=1 and Flag302 centre bit). 00530260 walks every child: DrawContainerWalk / IsPresented no longer exclusive-walk kids[ActiveChild]; ApplyFirstSeenState no longer Visible=false on siblings. Type-18 inactive forest tiles now Visible dest 410x410 opaque (dump batchDraws 193→223). Sampler D3D POINT locked (Dx9VulkanParityTests Sampler_and_blend_translations MagFilter Nearest). StyleFlagsZeroDest 0x20 still unused. dest still invented. Native skip via vtbl+400 (+504) still unused; type-18 inactive siblings present. leave #46 open. Leave #14 #20 #36 #42 #46 #48 #50 open PROVEN 88a9ab8 / Factory_builds_press_start_then_main_menu_from_the_same_walk / Sampler_and_blend_translations
First-seen colour is persist style 0 (005339B0 packs style 0 into +132). Type-16 child 0 StyleIndex=3 because vtbl+176 0041C5C0 is style-exists; present colour stays style 0. Unselected siblings stay StyleIndex 0. ChildrenOf by parent index, not name (duplicate persist names no longer steal DrawContainerWalk / ForwardSelectState). Dropped StyleFlagsForceOpaque pack. Tests: Factory_builds_press_start_then_main_menu_from_the_same_walk locks arrows Visible + StyleIndex TextSliderFirstSeenSelect (3), wasd Visible + StyleIndex FirstSeenState (0), arrows.Colour == wasd.Colour, both LeafDipSkipped. EngineLifecycleTests.Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip locks the same StyleIndex + LeafDipSkipped on ARROWS/WASD. VA tautologies StyleExistsFn 0x0041C5C0 and InheritPackedColourFn 0x0052E930. dest still invented 512,384,512,384; DIP (0,0); BuildBatch(..., 0, 0, width, height). Present 0042DF9E still Note. Native skip via vtbl+400 (+504) still unused. leave #14 #20 #36 #42 #46 #48 #50 open PROVEN b216990 / Factory_builds_press_start_then_main_menu_from_the_same_walk / Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip
Walk Bootstrap from dumped PE entry. Host starts at assembly listing 00401067 (CRT, WinMain 00403480, 00402510), not a live Fable.exe attach. Setup Language loads Data\lang\English\lang_settings.txt through 004045C0 into the three bootstrap bools, then Notes 009BC890/009BC8A0. Tests already on the page: Pe_entry_is_crt_not_new_game, Assembly_dump_pe_entry_is_crt_then_winmain, Bootstrap_first_seen_matches_assembly_pe_entry. dest still invented. leave #14 and #20 open PROVEN 6314dad / Pe_entry_is_crt_not_new_game / Assembly_dump_pe_entry_is_crt_then_winmain / Bootstrap_first_seen_matches_assembly_pe_entry
Route first frontend Present through IDirect3DDevice9. Split bootstrap at CreateDevice so the Vulkan DX9 device exists before 0042EFF7/0042DF9E. Frontend Present is Clear/Begin/End/Present on that device, not EngineFrame. Honor DeviceWindowed; FABLE_FORCE_WINDOWED is opt-in. Typed DX9 records and writable locks. Sprite DIP on dest 0,0,0,0 stays UNREAD. This SHA briefly used NativeSemantic attach; be8d987 reversed attach to Shadow; 131e34d then owns Present for real. dest still invented. leave #14 and #20 open PROVEN e9af3a8
Start windowed and toggle fullscreen with Alt+Enter. Host Silk window defaults Normal. Alt+Enter toggles Fullscreen. Native DeviceWindowed remains the D3D flag. Alt+Enter does not queue Enter as AVI skip. dest still invented. leave #14 and #20 open PROVEN 70709c1
Keep compatibility frontend Present and shadow-record recovered draws. Device attach is Shadow, not NativeSemantic. FrontendBatch and host.Draw stay active. Record recovered 00A0AEA0 DIPUP and 00A0ABE0 glyph verts between BeginScene and EndScene. Zero dest still skips. VulkanDx9Device does not consume the swapchain. dest still invented. leave #14 and #20 open PROVEN be8d987
Own frontend Present and recover NativeSemantic sprite and glyph draws. Live client sets sprite+glyph capabilities and OwnsSwapchainPresent. VulkanDx9Device batches DIPUP and glyph UP then presents. 3D stays Compatibility host.Draw after Leave. Startup AVI is 006286F0 blit only; F2 fly is Game-only. WM_CHAR is type 15; Press Start / New Profile / New Game are LMB type 4/6. Type-10 packet is widget +352, not MessageId. Exclusive ActiveChild walk is STALE: DrawContainerWalk foreach ChildrenOf, IsPresented parent-chain Visible/Clip, ApplyFirstSeenState Visible=true on every widget. Test FrontendUiDefTests.Factory_builds_press_start_then_main_menu_from_the_same_walk locks ContainerDrawWalksEveryChild, ExclusiveWalkSelectsChild == false, Leftover46ExclusiveWalkIsStale, type-18 FORREST_1 and FORREST_2 Visible, type-16 ARROWS/WASD and NORMAL/INVERTED Visible. Extra landscape strips, XSEQ time-to-key, Thing Component factories, and leftover dest/Present/Oakvale intro proofs. Constants: FrontendPresentBodyIsLive = true, DisplayFlushQueueIsNoteOnly = true, Leftover14OpenForDestPresentNotes stays true. Tests also cited by leftover-14 proof: Frontend_0042EC7C_frame_is_input_then_0042DF9E_Present, Native_semantic_frontend_present_builds_device_batch. Skip VAs 0052F180/0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. dest still invented 512,384,512,384; DIP (0,0) stand-in; DisplayFlushShouldDip(0, 0) always false; 009DA9F0 flush is still Note-only. Point dest still skips DIPUP (00BADB36). Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. leave #14 open. FrontendPresentBodyIsLive means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. leave #20 open. dest 0044C72B as [01232C24+8] is not rdata-locked. leave #42 open. New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit). leave #48 open. First-proximity TNG is host OOM workaround, not locked 004FDBC0 NewMap 1. leave #50 open. dest invented 512,384,512,384. leave #36 open. Exclusive-walk leftover is STALE (tracker already done). Do not collapse no-save first region LookoutPoint vs first-scene Oakvale intro view. #5 grok-goal dump still written. Do not re-file. MATCH named-stage Add Def Class is still Note-only + *DefClassRegistered flag PROVEN 131e34d / Factory_builds_press_start_then_main_menu_from_the_same_walk / Frontend_0042EC7C_frame_is_input_then_0042DF9E_Present / Native_semantic_frontend_present_builds_device_batch
Fix frontend menu parity and custom cursor. Silk cursor Hidden on frontend; CursorDest arithmetic; type-6 LayoutFormatted wrap/centre at draw; FontFile.GlyphAt null-page fix. Tests lock helper math + pointer fields (Type6_setter_centres_press_start_and_wraps_legal_notice, Type32_cursor_preserves_size_at_live_input_position). FrontendDisplayCursorRan stays false; leftover+204 stays 0. Comments pin 0041A980 / 0054FBC0 / 0054F8E0 on host helpers (same pattern as leftover #36 — do not file a leftover). dest still invented. leave #14 and #20 open PROVEN b03756c / Type6_setter_centres_press_start_and_wraps_legal_notice / Type32_cursor_preserves_size_at_live_input_position
Fix frontend colors and text underlay. TextureFile / FrontendTextDraw / LineShaders / Dx9VulkanFrontend. Tests that landed here: Frontend_ps_keeps_clock_sprites_white_and_applies_glyph_diffuse, Type6_text_has_native_black_underlay_and_colour_pass, A8R8G8B8_surface_bytes_are_decoded_from_bgra_to_rgba. dest still invented. leave #14 and #20 open PROVEN e7eac64 / Frontend_ps_keeps_clock_sprites_white_and_applies_glyph_diffuse / Type6_text_has_native_black_underlay_and_colour_pass / A8R8G8B8_surface_bytes_are_decoded_from_bgra_to_rgba
Fix frontend compositing and upload stalls. VulkanLineRenderer.Frontend/Textures + FrontendWidgetFactory. Test that landed here: Frontend_texture_sets_reuse_cached_pixel_storage. dest still invented. leave #14 and #20 open PROVEN 32588e0 / Frontend_texture_sets_reuse_cached_pixel_storage
Match native frontend animation and text rendering. Type-18 swap dwell (Frontend_type18_primes_then_cycles_zero_dwell_forest_states); type-6 black underlay then colour pass with Type6OriginPad, mouse last in Frontend_PRESS_START_is_type_10_with_text_child; vsync FIFO when window.VSync; live client trace opt-in FABLE_LIFECYCLE_TRACE. Also Press_Start_type18_lists_match_00547500. VA comments on 00547380 / 0052CF40 / 0054EF00 are host helpers — do not file leftover. dest still invented. leave #14 and #20 open PROVEN 7b2d2ab / Frontend_type18_primes_then_cycles_zero_dwell_forest_states / Frontend_PRESS_START_is_type_10_with_text_child / Press_Start_type18_lists_match_00547500
Recover complete frontend UI schema and parity behavior. New FrontendUiFieldCatalog.cs + FrontendUiSchema.cs. Cite only tests that exist: FrontendUiDefTests (Every_frontend_UI_entry_matches_the_complete_native_CUIDef_schema, Complete_CUIDef_catalog_uses_original_names_and_matching_file_CRCs), FrontendLayoutTests, FrontendInputTests. NativeDestTupleUnread stays true at HEAD. dest still invented. leave #14 and #20 open PROVEN 0374d7b / FrontendUiDefTests / FrontendLayoutTests / FrontendInputTests
Map frontend states to recovered UI fields. Hovered / LeftClicked / RightClicked persist CRCs and widget copies. No new test method; assertions landed in FrontendUiDefTests. dest still invented. leave #14 and #20 open PROVEN b9d37c8 / FrontendUiDefTests
Map frontend UI controls from native definitions. Hit-test still host: HEAD FrontendLayoutTests still TryChromeHitIsNativeHit == false, PlaceTableCellCount3IsNative == false. Tests that landed: Silk_backspace_is_queued_as_the_native_type15_character, Frontend_batch_reuses_exact_size_arrays_between_frames, New_profile_sliders_construct_persisted_arrow_controls_and_ranges. dest still invented. leave #14 and #20 open PROVEN 168317a / FrontendLayoutTests / New_profile_sliders_construct_persisted_arrow_controls_and_ranges
Fix frontend hover stalls and UI field parity. Sprite2DFlag persist +548 → widget +372; LayerIndependant; persist Angle; dual linear/point frontend samplers (Dx9VulkanParityTests.Sampler_and_blend_translations locks FrontendType22(2) Linear vs FrontendType22(0) Point and PreservesPerFrameFilter). Resident texture set to avoid DeviceWaitIdle on hover. BindDefaultNewProfileValues hardcodes 0.5 camera sensitivity (host). FirstSeenState now 0 not a magic style. dest still invented. leave #14 and #20 open PROVEN e852b52 / Sampler_and_blend_translations / Persist_quarter_turn_rotates_sprite_corners_without_allocating_geometry
Restore authored frontend controls and audio. Host NAudio FrontendAudioPlayer plays Sound/Intro.ogg + Frontend.lug RIFF CS_GUI_1/2. This does not lock leftover #15 (Init Sound 00417A58) or leftover #9 (WmvPlayer IBasicAudio). Tests: New_Profile_name_hover_reaches_nested_authored_panel_styles, New_Profile_Apply_and_Cancel_follow_their_authored_messages. dest still invented. leave #14 and #20 open PROVEN 16cf83b / New_Profile_name_hover_reaches_nested_authored_panel_styles / New_Profile_Apply_and_Cancel_follow_their_authored_messages
Eliminate frontend hover stalls. HoveredState on the button (not first child); GRAPHIC-name hit AABB fallback is host heuristic (same family as leftover #48). Independent layer -1024 later reverted. Test: New_Profile_arrow_hover_uses_button_state_and_authored_graphic_bounds. dest still invented. leave #14 and #20 open PROVEN 094478b / New_Profile_arrow_hover_uses_button_state_and_authored_graphic_bounds
Restore visible frontend rendering. Reverts style-texture residency and independent-layer offset so logos draw (Native_semantic_frontend_present_builds_device_batch locks 256×128 logo textures). Does not re-enable world Draw under frontend/AVI. dest still invented. leave #14 and #20 open PROVEN 86b8ff4 / Native_semantic_frontend_present_builds_device_batch
Apply frontend sprite rotation in live path. DestCorners used by FrontendDx9Submit FillSpriteVertices and BuildDx9Quad; Y-down sign flip. Persist_quarter_turn_rotates_sprite_corners_without_allocating_geometry locks live quad (15,-5)/(15,15)/(5,-5). Dest rects themselves still from layout. dest still invented. leave #14 and #20 open PROVEN 29c88e9 / Persist_quarter_turn_rotates_sprite_corners_without_allocating_geometry
Eliminate profile hover texture rebuilds. Hover broadcasts only to immediate children (New_Profile_name_hover_updates_authored_components_without_replacing_nested_sprites). Comments pin 0055AEB0/0055AEF0 on host helpers — do not file leftover. dest still invented 512,384,512,384 in Press_Start_first_seen_dest_table_matches_0041AFA0; NativeDestTupleUnread == true. DIP (0,0) stand-in: Empty_dest_does_not_issue_dipup; DisplayFlushQueueIsNoteOnly == true; FrontendPresentBodyIsLive == true (Clear/Begin/recovered DIPUP/Present when Device set — does not dest-lock leftover #14). Device_does_not_own_game_host_present; 3D stays Compatibility host.Draw after Leave. Startup AVI blit-only; leftover #20 Game-stage PumpGame 00435530 remains. grok-goal dump still written in FrontendLayoutTests (leftover #5 — do not re-file). GRAPHIC-name AABB is host (leftover #48). Host frontend audio does not lock leftover #15 or leftover #9. leave #14 open. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. leave #20 open. dest 0044C72B as [01232C24+8] is not rdata-locked. leave #42 open. New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host). HEAD FrontendLayoutTests still TryChromeHitIsNativeHit == false, PlaceTableCellCount3IsNative == false. leave #48 open. First-proximity TNG is host OOM workaround, not locked 004FDBC0 NewMap 1. leave #50 open. dest invented 512,384,512,384. leave #36 open. Exclusive-walk leftover is STALE (tracker already done). Skip VAs 0052F180/0052F1D0 stay named constants. Do not collapse no-save first region LookoutPoint vs first-scene Oakvale intro view. #5 grok-goal dump still written. Do not re-file. MATCH named-stage Add Def Class is still Note-only + *DefClassRegistered flag PROVEN 4f1819d / New_Profile_name_hover_updates_authored_components_without_replacing_nested_sprites
ExeIndex evidence exporters + persist Layer recover. Click UI_FRONTEND_BUTTON_NEW_GAMERetailNewGameFlag + Game. Exporters are not dest/DIP recovery. dest still invented. NativeDestTupleUnread stays true. leave #14 and #20 open PROVEN 951b7f2
scene-capture tool. LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. Keep Lookout (no-save first region) vs Oakvale intro view separate. dest still invented. leave #14 and #20 open. leave #50 open PROVEN fa79419
authored intro dialogue/audio. Spawn CREATURE_HERO_CHILD only on StartOakVale + intro quest. SetFrontendBatch can record world verts under frontend — leftover already #14, do not file a new issue. dest still invented. leave #14 and #20 open PROVEN e004fe3
UpdateAtClock + live actor MeshDraw refresh. This commit added no tests. dest still invented. leave #14 and #20 open PROVEN b6923a3
intro-father parent continuation order 00DB88FD; mesh concat sortDraws:false; Vulkan present semaphore per image. Does not lock #14 dest/Present. dest still invented. leave #14 and #20 open PROVEN a02ab21
Game_PlayAVI_006286F0_polls_the_retail_skip_scan (in-game skip). Startup still Draw(default). Does not lock #20. dest still invented. leave #14 and #20 open PROVEN 41e97c9 / Game_PlayAVI_006286F0_polls_the_retail_skip_scan
QuestLifecycleRuntime / S_QNOVI post-cutscene map (CHEERING journal, HUD, scripted-Thing 3/4). Oakvale intro after the father cutscene, not Lookout. dest still invented. leave #14 and #20 open PROVEN 12118bd
[node+20] is 0041DB1D/0041D21B type0 0041B800 vtbl 0122F5D4; draw 0041AFA0 not 0052D900 DISPROVEN PRESS_START Type=10. Type 0 is UI_FRONTEND_BUTTON.
00A09F20 miss: [bank].vtbl+4 is 009D56C0 Open Bank File Async then 009A7F80 on [0x13CA79C] PROVEN bbee903 / Pe_entry_is_crt_not_new_game / Install_banks_and_startup_videos_exist (MeshBank.OpenVtbl4)
00404C00 first-seen [0x13B7CD8+8]==0 skip; 0041AFA0 packs 0041BEB0 type 0x22 (not sibling 0041BF60) dest [edx+92] this+0x15C size 0xC0 PROVEN c612ad5 / same frontend test (Frontend2dLastPacker=0041BEB0, FrontendDisplayFlag=false). Type-0 stays 0041BEB0 / 0x22; type-6 host Notes 00543910 / 0x27 (a141c27 / Type6_widget_packs_00543910_type_27_not_0041BEB0). Dest leftover +204 is widget +204 (b1d6877). leave #14 open.
00418289 dump: 00416296/00490A22 frontend+GUI gate; 009E1BC0[game+90544]; fade/player 004AEBA0; world 0049D9E0; vtbl+24 00416E78; 0041726D WorldFrame. START_INITIAL_QUESTS factories 00CDE2F0/00F01760/00CDBD20/00CB8690 (vtbls 012C3000/012F72D0). 006B3FF0 seed PROVEN (208); 006B63C0 bank copy 6×0x1F4 PROVEN (91). Pose leftover 006B8640/008889C0 stay UNREAD; 006B2CA0 later PROVEN (204a214). Host SeedAt(1.6m) later DISPROVEN as live New Game (204a214). FOV 72 is SHOT2 leftover; Lookout helper FOV later 70 (be3339e). Do not StartCutscene(S_PSM) from the factory ctor. PROVEN 18ef09b / FORWARD_TREE.md §11
006B3FF0 +68 → 006B2CA0 pose (not invented SeedAt 1.6 m eye). First-seen V2/V3 (1,0,0), V4 (-1,0,0). 00A14440 normalize. Host SeedAt(1.6m) is not the New Game path PROVEN 204a214 / World_camera_006B4900_slots_lerp_into_ScriptedCamera / Camera_004164E0_runs_on_install_after_WorldFrame / Load_single_thing_0051FD80_spawns_hero_at_LookoutPoint (PoseComputed, WorldCamera.PoseFn). Do not reopen #6
004A5A40 type-1 tick pumps 004B4490 [0x13B89FC]00CB8220 / 00CB7C40 / 00CB8170. First-seen QuestVtbl24Calls=0 (+41==0 takes vtbl+4 start). 006B3030 V0 spring: Weight0 stays ctor 0.2; V0 stays (1,0,0) (no invented V0). 004978A0 LCG seed UNREAD; 00A14260 yaw/pitch not applied first-seen PROVEN 52e26bc / Camera_004164E0_runs_on_install_after_WorldFrame (QuestPumpRan, QuestPumpWalked>=6, FollowSpringRan, SubjectFillNoted). FORWARD_TREE §11
First-seen 006B3B80 skip (+460=0, qword +24 = −1.0 from [0x1236700], fcomp [0x122ED70]=0 → ret). No V0 write. Fiber +41 setter 00CB78D0 (mov al,[esp+4]; mov [ecx+41],al; ret 4). 00CB7950 clears +41 after update; first-seen stays 0. Not in factory vtbls 012C3000 / 012F72D0 / 012C3688 / 0129B938 / 012C1648 / 012C2748 PROVEN fab17be / World_camera_006B4900_slots_lerp_into_ScriptedCamera (CameraTickSkipped, CameraTickTimer=-1.0, PoseTickFn) / Camera_004164E0_runs_on_install_after_WorldFrame (FiberUpdateFlagSetter)
009DA9F0(1) first-seen empty → 009DB6E6 skip DIP. Nonempty would be 00A058C0 then [device+88].vtbl+332. No cmp …,0x22. Type-0x22 DIP is vtbl+332, not a 0x22 switch. 009D9C80 first 250: dirty-list only. Queue begin +16020. Later b1d6877 host Notes 009DA9F0(1) [+16020] empty / skip DIP: DisplayFlushShouldDip(0, 0) is always false; host never stores [this+16020]. That is stand-in, not a recovered queue read. FrontendEnqueueRan can still be true. Frontend2dDipIssued=false. Leave #36 open PROVEN 6493c77 / b1d6877 / Frontend_present_runs_on_install_after_videos / Frontend_009DA9F0_first_seen_is_empty_skip_not_type_22 (DisplayQueueBeginOffset=16020, DrawIndexedPrimitiveVtbl=332, DisplayPrimitiveFn=00A058C0). leave #14 open
0042E204 Init Engine: 00B26340 alloc 0x178 ctor 00B260B0 vtbl 012A0F3C at retail+88. 0041AFA0 [012A0F3C+92] = 00B23BC000B324A0([0x1436E80], widget+0x15C, rec, 0xC0, 0). Type [rec]=0x22[0x1436E84]+16+0x22*4. dest+4=0 first-seen. Handler vtbl+20 UNREAD (not memcpy +16020) PROVEN d6821b8 / Frontend_0042EC7C_frame_is_input_then_0042DF9E_Present (FrontendSubmitFn=00B23BC0, FrontendSubmitDispatchFn=00B324A0, FrontendEngineVtbl=012A0F3C, FrontendEngineObjectSize=0x178). leave #14 open
First-seen WorldCamera +6296 is the ctor axis, not the eye (IsCtorAxis). 00B314E0 consumes helper from the hero (look 006B2CA0 V4, up (0,0,1) FirstSeenCameraUp, FOV 70 from 00A0C130 / 0x3E471B48 turns). Letterbox 1024×768 (00B30B50 camera +176/+180). AABB-cull neighbour STB before height parse (00BDC2D0 / 00BF6F80). textures.h resolve cached (LevelLibrary.LandscapeEnums). Skip SetMesh/SetTextures when payload unchanged PROVEN be3339e / Load_single_thing_0051FD80_spawns_hero_at_LookoutPoint / Install_banks_and_startup_videos_exist (RendererHelperBound, GameCamera.FirstSeenFovDegrees) / CameraProjectionTests (ApplyRendererHelper, LandscapeFrustum.CameraUpdate=00B314E0) / World_submit_is_stable_between_frames / BuildFrame_reuses_texture_array / Texture_decode_is_cached / Lookout_tile_origin_is_region_local / MeshBank_does_not_reparse_c3d / Native_draw_order_is_begin_layers_end_present. Do not reopen #6 / #13
Landscape 00BF4570 cells as persistent draws. Each STB 16 m tile is one LandscapeCell (cached on LevelLibrary). Submit builds per-cell MeshDraws; landscape and C3D on separate VBs. Concat stays a test rollup. Print LoadTiming on first New Game submit PROVEN 3dba4a1 / Lookout_cells_match_stb_tiles / World_submit_is_stable_between_frames (SubmittedLandscapeCells, LastLoadTiming). First commit submitted bits 0x4/0x40; cell DIP later 0x40 only (40037b1)
Static C3D: preserve native instance transform. C3D verts stay file-local. MeshDraw.World is the ObjectTransform 3x4 (009881F0 wrapper+496). Draw multiplies W*VP. No per-triangle bake PROVEN 5e57e64 / Instance_world_is_009881f0_not_baked_verts
Sky: submit 0x2000 midday dome on New Game. CEngineSkyRenderer GRAPHIC_ATMOSPHERIC_SKY_MIDDAY after static C3D (layer order 0x4/0x40/0x20/0x2000 at this commit). Uses SkyViewProjection PROVEN 63336fd / Install_banks_and_startup_videos_exist (PassBit == 0x2000) / Native_draw_order_is_begin_layers_end_present / ScenePassTests.Registration_is_34_layers_and_walks_landscape_before_sky. PALSKIN 0x100 later (676bf63)
PALSKIN: drain on layer 0x100 before sky. 00B33010 type-0/1 first slots use bit 0x100 (registration index 7), after static 0x20 and before sky 0x2000. 0x80/0x200 after sky later (f4a1efc) PROVEN 676bf63 / Game_00435530_Presents_009BEEB0_and_pumps_input (SubmittedLayerBits) / Native_draw_order_is_begin_layers_end_present / ScenePassTests.Registration_is_34_layers_and_walks_landscape_before_sky / Instance_world_is_009881f0_not_baked_verts (static stays 0x20)
Resources: unload region patches; one WAD for TNG. 00B40000 / 00B3EF40 release map-slot LEV/STB/cells. Banks and WAD handle stay process-lifetime PROVEN 7c93828 / LevelLibrary_unload_map_drops_region_not_wad / Install_banks_and_startup_videos_exist (HasCachedCells, sky 0x2000)
Landscape: 00BF4570 cell DIP is layer 0x40 only. Bit 0x4 is 00BF71D0 tessellator background, not the stored cell mesh PROVEN 40037b1 / Lookout_cells_match_stb_tiles (LayerForeground; no LayerBackground)
Resources: cache game.bin and meshdata.h at process lifetime. 009AD410-style: one def table, not a per-map GameBin open PROVEN cf0ee50 / Install_banks_and_startup_videos_exist / LevelLibrary_reuses_lev_and_height_parses. LevelLibrary.Defs / MeshEnums
Camera: lock 00A0C130 ctor helper and 00988A50 WVP numbers. 00A0C130 is a packer. GameCamera ctor look is +Z, up (1,1,1). 006B42F0 tail 008857E0 is bank lerp; vtbl+244 is colour-filter. Does not change the consumed first-Present helper (still UNREAD) PROVEN a6f939a / CameraMatrixParityTests.GameCamera_ctor_look_default_is_plus_z / WorldCamera_tail_is_colour_filter_not_helper / GameCamera_ctor_helper_wvp_at_1024x768 / Projection_numbers_match_009883F0. Do not reopen #6 / #13
PALSKIN: submit file dest triangles, print load timing. MeshFile.Triangles already apply 00A9E1E0 × IBM. First-seen does not re-skin on the CPU. Hero 4299 stays on layer 0x100 PROVEN cb22533 / Palskin_submit_uses_file_triangles_not_repose / Install_banks_and_startup_videos_exist (SubmittedPalskinMeshIds 4299) / World_submit_is_stable_between_frames (LastLoadTiming)
Static C3D: one file-local VB per mesh, instance W on the draw. 00BB2540 copies locals once (shl idx,4, no matrix). 009881F0 owns the 3x4 per instance. Repeated Lookout lamps no longer duplicate the C3D soup PROVEN 306e83c / Instance_world_is_009881f0_not_baked_verts (shared verts, distinct Worlds)
Environment: bind REGION.EnvironmentTheme name, not lighting. Lookout RegionDef is ENVIRONMENT_THEME1 #2346 (same as Oakvale intro), not ENVIRONMENT_OAKVALE. Live first-seen lights stay 00B482A0 record 0 (c19/c20/c35, fog 1000/2000, packed count 0). Seven Lookout streetlamps are C3D 4978, not 2LIGHTS PROVEN 4429113 / Install_banks_and_startup_videos_exist / GameBinFormatTests (AuthoredEnvironmentTheme, FirstSeenPackedLightCount)
Scene: drain PALSKIN 0x80/0x200 after sky. 00B33010 walks slots 8+10 on bit 0x100, then sky 0x2000, then slot 14 on 0x80 and Flag1 slot 9 on 0x200. Static 0x18 stays slot 0 on 0x20. PALSKIN geometry still submits on 0x100 until type1/Flag1 routing is wired (leftover research, not a new issue) PROVEN f4a1efc / Dx9VulkanParityTests / EngineLifecycleTests / ScenePassTests / WorldPipelineTests
Hero: copy GuildArrivalHSP RHSet axes on 006AC910 spawn. Lookout start marker faces +X / +Z. #18 done. Exist set 465/465; primary C3Ds 193/193 PROVEN ff808b1 / Install_banks_and_startup_videos_exist (hero ObjectTransform forward +X)
Resources: skip unused 1 m height grid on 00BF4570 cell load. Native draw is stored STB tiles, not bilinear FineHeights. LevelLibrary reuses WLD already parsed at Init World. Open/Present records primary Graphic handles only PROVEN 8bfbf39
PALSKIN: bind adult Hero as the script/move/draw Thing. BindScene no longer only accepts CREATURE_HERO_CHILD. 006AC910 spawn binds HERO/Hero and seeds World.Positions. PlayLoopingAnim 00CC186C now ApplyInner so ClipKey is set. Thing XYZ writable so WalkTo writes back. c38 dest upload is later GPU path (do not file). leave #19 open PROVEN 27cb7ee / Install_banks_and_startup_videos_exist (Resolve HERO/Hero same as life.Hero) / PlayLoopingAnim_is_vtbl80_not_PlayAnimation (ClipKey, InnerApplied)
Render: INNER_SKY does not write oFog. VSHADER_INNER_SKY is dp4 oPos + mov oD0, v1. D3D default oFog is 1. Applying 1000/2000 land plane to the 6500 dome made native brightness path black. Land leftover c3 unchanged. No invented ambient or extra x2 PROVEN d7615a6 / GpuTextureTests / ShaderFormatTests / WorldGeometryTests
Landscape: INDEX16 strip on the 00BFE050 mesh, DrawIndexed. 00BF4570 DIPs mesh+52/+56 (vtbl+328, type 5, prims+2), not the 72-byte cell. Bit 0x4 is still 00BF71D0, not this IB. Host unwinds strip to a list; verts unique per cell. W = I on region-local STB PROVEN 35f3d20 / WorldGeometryTests
PlayAVI: native 00628B79 dest and clear leftover frames. Scale to viewport width, center leftover height. Recreate video image when height changes so 640×400/480/360 do not share leftover rows. Clear one frame between startup videos. #11 done. leave #20 open PROVEN 98c4acc / PlayAVI_00628B79_resizes_to_viewport_width_and_centers / PlayAvi_rewrites_xmv_to_installed_wmv_and_blocks
WaitPlayAnimation 00CC18E0 plays via vtbl+72 (or vtbl+76 if IsTrue arg3) then leftover vtbl+104 PROVEN 1eec3bc / WaitPlayAnimation_plays_then_polls_vtbl104
FORWARD_TREE PE→WinMain→no-save New Game. Mesh bank MBANK_ALLMESHES at 0049E620 / 00A09F20 / 00A27030 / 004BBFD0. Engine owns map open/close 00B40000 / 00B42750. Client must not open a second graphics.big dump PROVEN f0fb184 / Pe_entry_is_crt_not_new_game / Install_banks_and_startup_videos_exist
Game vtbl+32 00416953 is Loading world (no-save [+90588] empty skips 004A3200 Loading save). Then 004A1840 WLD/quests. 00B3E820 current handle LookoutPoint; 00B41E50 neighbours (PicnicArea); 00B420F0 name table; 00BDF010 neighbour patch. 00B42530 is STB-miss fallback only PROVEN fc8b261 / same install test + Pe_entry constants
00416953 no-save tail: path +90576 FinalAlbion.wld (Leave 0042F44D / 00415E17); 0x122EE14 updatedscenic.wld is fallback only. 004A1840 then [0x13B8648]==00049F180 / 004B4A10; 004BBC00 is ret 4. Not a region PROVEN LoadWorld_00416953_no_save_is_004A1840_then_0049F180
004184BD after vtbl+32: 0049BA70 / 00416392 / 004AE9D0 / default_user.ini miss / user.ini 009EC890 / seed 004167DA++90592. Not first pump or region PROVEN InitGame_004184BD_after_00416953_reserves_then_user_ini
user.ini ActivateQuest("Gameflow"): 00419CE0 [world+56] 006E7740 vtbl 01260F0C+1104 00892E80004B4A1000CB5AD0 PROVEN UserIni_009EC890_RunScript_joystick_is_00999230_miss. Direct 00CB5AD0 from user.ini DISPROVEN.
[0x1375454]=1 .data; 004B3CE0 constructs. Gameflow 00CE6CF0/00CE75B0 Main watcher. S_GF cutscene at activate DISPROVEN. 00501450 not reached PROVEN Gameflow_00CE75B0_is_Main_watcher_not_S_GF
Type-1 00CB8220 Main 00A4488000CE7670 state 0 yields on Q_NewOakValeIntro. Same walk 00CEF3B0/00CEF550 yield. No Oakvale/trader activate. 004167DA not called PROVEN Type1_00CB8220_Gameflow_state0_yields_on_Q_NewOakValeIntro
After parked watchers: [esi+56] Gameflow last; 006874B000687540(55,50) skip fire ([0x13B89BC]+50). Empty-list DISPROVEN PROVEN same type-1 test
After 006874B0: 006BB990 1/15 time; 004C5E90 ret; 006E60F0/0051F070/006E37D0 empty; 006BDC60 miss; 0043A080; 006B2260 PROVEN same type-1 test
First 00416E78 with 0049D870>1: 004457F0 then empty 00446A30 (00446330 miss, 00446220 +168=0, no 0041649C). Prefix 009A57B0 always. 00416E78 runs before 004A5E10 PROVEN After_WorldFrame_gt_1_00416E78_is_004457F0_then_00446A30
First 00417001 WorldFrame>1: [0x13B8630]=00041707E/0049E080. 004AEA70=0 and [0x13B8688]=0 skip 00435F70. Always-Present leftover DISPROVEN PROVEN After_WorldFrame_gt_1_00417001_is_0041707E_then_004AEA70_skip
Later 004AEA70=1: Pump(0)×5 after skip then 00435F70/009BEEB0. WorldSubmitted Present gate DISPROVEN. No region PROVEN After_004AEA70_eq_1_00417001_is_00435F70_Present
First-seen 00435530 dest empty: 00434CD0009D8250 ret; 00435000/00435070 miss; 009DA9F0 empty no DIP. Invented layer bits DISPROVEN PROVEN same Present test
Later type-1 00CB8220: 00A44880 resume, 00893610 still 0, yield. Parked-skip DISPROVEN. No Oakvale activate PROVEN Type1_resume_00CB8220_is_00A44880_then_00893610_yield
No-save does not activate Q_NewOakValeIntro. 00CD6E27 bind-only; WLD/+90584/004B5080/AddTestQuest/00896A30 are not the activator PROVEN No_save_does_not_activate_Q_NewOakValeIntro
First 004189C2 after dummy record: 0040D2A0/0040BC80/00B239A0(12,20)/009F2660. Not a region PROVEN First_pump_004189C2_is_0040D2A0_then_00B239A0_not_a_region
009A8150 names-only (RegisterRetailBankTable does not open graphics.big/textures.big). LevelLibrary caches LEV/STB/TNG parses PROVEN 253126e / Install_banks_and_startup_videos_exist / LevelLibrary_reuses_lev_and_height_parses
PresentWorld opens instances + LEV/STB headers only (expandGeometry false). 00B3EFA0 PeekMapHeader 48-byte LEV + STB size. 009AD410 handles; C3D parse is later at submit/draw. CurrentCompiledLev/CurrentHeightField null at open PROVEN 17908c3 / Install_banks_and_startup_videos_exist PresentWorld asserts / Open_records_instances_without_c3d_or_tiles / PeekMapHeader_is_00b3efa0_not_full_parse
Game pump / first region is 00DBDE40 / StartOakVale setup DISPROVEN tests above
No-save writes [record+36] DISPROVEN recover-record36 text in Camera_004164E0_runs_on_install_after_WorldFrame; null still loads
Correction vs a “first region is Oakvale” reading: WorldMap+156 is the index field. No-save New Game’s first real write is 1 = LookoutPoint. No-save first rendered scene is that map’s RegionThings plus 006B3FF0 hero camera. First-scene intro view is still StartOakValeWest / HerosOldHouse / CAM_OVIF_SHOT2 / kid (FIRST_SCENE_* — do not collapse into Lookout). Persist name StartOakVale is index 4. The retail New Game click/message is now PROVEN (0059A238 / [retail+41]). Who writes persist PlayerRegionName is still UNREAD. [esi+42] load/save is UNREAD. 00521AE0 is per-map TNG, not global-things apply.

What’s left

Dependency order. Reorder only if a ledger or test disagrees.

1. Finish boot / clock (now)

Keep locking today’s exe facts. Do not invent an Oakvale write on the no-save path.

LeftStatusNotes
First non-null [NewRegion record+36] writer UNREAD Null is the native no-save state
[0x13B8630] catchup-tick writers UNREAD 3 immediate sites; default 0
0041714D when world+164 != 0 UNREAD Default New Game is world+164==0
Slot fields beyond +6296/+6312/+6328 (weights / +6340/+6352) UNREAD Lerp into ScriptedCamera is PROVEN; first-seen Weight0 ctor 0.2 is locked (52e26bc). Leftover slot bodies are not
00435530 overlay 00435000 / interface 00435070 bodies PARTIAL Present + 009DA9F0 layer bits PROVEN; overlay/interface still Note
Frontend 00595222 widget DIP body DISPROVEN as DIP 00595222 calls [node+20].vtbl+8. Types 5/10/11/12/16/18/38 are 00530260 DrawsChildList (7adf621 / later e3208eb type 11/38). Tick/draw walk every resident [ui+84] slot (b4a2c89 / Frontend_tick_and_draw_walk_resident_ui84_slots). Resident slots 0 / 0x14 / 0x17 still MATCH 00595222 (405b1e8 / Frontend_dumps_press_start_new_profile_main_menu_after_avi_skip). Exclusive-walk leftover is STALE (tracker already done): DrawContainerWalk foreach ChildrenOf, IsPresented parent-chain Visible/Clip, ApplyFirstSeenState Visible=true on every widget (131e34d / Factory_builds_press_start_then_main_menu_from_the_same_walk locks ContainerDrawWalksEveryChild, ExclusiveWalkSelectsChild == false, Leftover46ExclusiveWalkIsStale). Skip VAs 0052F180 / 0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. Do not invent DrawContainerWalk calls of those VAs. Do not file a new leftover for that unread gap. FrontendPresentBodyIsLive = true means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14 (Native_semantic_frontend_present_builds_device_batch). 009DA9F0 flush is still Note-only (DisplayFlushQueueIsNoteOnly). dest still invented 512,384,512,384; DIP (0,0) stand-in; DisplayFlushShouldDip(0, 0) always false. Point dest still skips DIPUP (00BADB36). Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. Clicks now exist (ClickNamed / host hit midpoint). New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host; leave #48 open). NativeDestTupleUnread stays true. 3D stays Compatibility host.Draw after Leave. leave #14 open.
00B324A0 type-0x22 handler vtbl+20 PARTIAL dest+4=0 only while dest is 0. Nonempty dest draw path is still 00BAE2D0 / 00BAD8A0. EnqueuesDisplayQueue still false. No E8 009DB700 (1a08cc0 / Nonempty_dest_draws_via_00BAE2D0_not_009DB700). Host Notes 009DA9F0(1) [+16020] empty stand-in (b1d6877); DisplayFlushShouldDip(0, 0) always false; host never stores [this+16020]. Type-6 host Notes 00543910 / 0x27 size 64, not 0041BEB0 / 0x22 (a141c27 / Type6_widget_packs_00543910_type_27_not_0041BEB0). Type-0 stays 0041BEB0 / 0x22. Type-6 Font 26051 is a names.bin offset that resolves to ENG_ARIAL_24, not the 0054F4B0 ENG_ARIAL_16 helper (db36334). Init Fonts ENG_ARIAL_18 at game+90444 is a different object (9901d3b). leave #36 open.
0041AC20 dest rect from +204/+248 PROVEN ctor 0,0,0,0; type-6 dest (512,384,512,384) leftover+204 GraphicIndex gate recovered (76edbbd / Leftover204_is_0041AC20_graphic_index_not_persist_size): index 0 → leftover 0. dest still invented 512,384,512,384; tests lock that dest (Frontend_0041AC20_dest_and_0xE5_new_profile_0x126_main_menu_15). Leftover +204 is widget +204, not dest width (b1d6877 / Type6_leftover204_is_widget_plus204_not_dest_width). Type-6 leftover 16×16 is gone (0 first-seen). Type-6 dest is a point at remapped origin (512,384,512,384), not ctor 0,0,0,0 (Press_Start_type6_dest_is_a_point / Frontend_PRESS_START_is_type_10_with_text_child). UI_TITLE_01 dest still from texture FrameWidth 256 (Press_Start_first_seen_dest_table_matches_0041AFA0). Leftover +204/+208 only when GraphicIndex != 0 (1a08cc0). New Profile type-2 leftover (180,0) and PlaceTableCell n==3 fill are host heuristics, not dest lock; persist-size skip / TryChromeHit / GRAPHIC-name AABB are #48 family (leave #48 open). NativeDestTupleUnread stays true (Press_Start_first_seen_dest_table_matches_0041AFA0 still 512,384,512,384). DisplayFlushShouldDip(0, 0) stand-in. leave #36 open.
New Game keyboard N/Enter (host stand-in) PARTIAL WM_CHAR is type 15; Press Start / New Profile / New Game are LMB type 4/6. Type-10 packet is widget +352, not MessageId. Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. dest still invented 512,384,512,384 (leave #48 open). FrontendPresentBodyIsLive means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14. Leftover14OpenForDestPresentNotes stays true. Client still has no Key.N / ActivateNewGame. Alt+Enter does not queue Enter as AVI skip (70709c1). Host current _frontendWidgets is still the switched screen (input leftover) (84a8350). New Game still not dest-locked. a02ab21 does not lock #14 dest/Present. e004fe3 SetFrontendBatch can record world verts under frontend — leftover already #14, do not file a new issue. Frontend 0042DF9E / 00595222 still Note-only. leave #14 open.
006B8640 / 008889C0 leftover (do not write V0 first-seen) UNREAD 006B2CA0 pose is PROVEN (204a214). Host SeedAt(1.6m) is DISPROVEN as live New Game. Lookout helper FOV 70 from 00A0C130 (be3339e). 00A0C130 is a packer (a6f939a); ctor look +Z, up (1,1,1). SHOT2 FOV 72 is intro-view leftover — do not collapse into Lookout. Do not reopen #6 / #13
Consumed first-Present helper UNREAD a6f939a locks ctor packer / 00988A50 WVP / bank lerp 008857E0 / vtbl+244 colour-filter. Does not change the consumed first-Present helper. Do not reopen #6 / #13
004978A0 LCG seed for 006B3030 UNREAD Spring ran; Weight0/V0 first-seen locked (52e26bc). Seed unread
0055CB10 frontend player-move listener UNREAD Actions 0–5 / 20–21 recorded; no recovered listener. Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. leave #14 open.
Game input poll 00446462 / 004963E6 UNREAD e7b3c76 recover note (separate from 00446A30)
Who writes persist PlayerRegionName on New Game UNREAD Click/message path is PROVEN; persist HEADER writer is not
[esi+42] load/save UNREAD recover-00595582; [esi+41] Leave is PROVEN
Global-things use after 004FDBC0 / .gtg parse UNREAD Load switch is PROVEN; 00521AE0 is per-map TNG, not this apply
GTNG file body N/A on TLC Missing skip is PROVEN
MiniMap 0082BA00 / villages 005064C0 bodies UNREAD Named from SetRegionAsLoaded; not claimed as runtime. Loading world vtbl+32 00416953 is PROVEN (fc8b261); leftover is MiniMap/villages bodies only
Wire persist-Oakvale (or a proven New Game region write) to FirstSceneWorld UNREAD Host first-scene lists are a separate reconstructed path
PALSKIN type1/Flag1 routing (slot 14 0x80 / Flag1 slot 9 0x200) UNREAD leftover research (f4a1efc); geometry still submits on 0x100. Not a new issue
PALSKIN c38 dest upload later 27cb7ee — later GPU path; do not file
Init Definition Manager dest [01232C24+8] dest UNREAD Host Notes 0044C6B0 / 0044C72B [vtbl+8] / 009ACB10 / 009E5250 + DefinitionManagerPrepared are locked (587baae / Init_Definition_Manager_00416005_resets_plus88_via_vtbl8). dest 0044C72B as [01232C24+8] is not rdata-locked (sibling proofs/00416005-def-manager dest UNREAD). Leave #42 open. Do not call dest PROVEN. Different object from later Subtitled [0x13B8A54]. Do not invent a game.bin parser.
Init Thing Components further Add Def Class leftover Note-only Thing Components now Notes Add Def Class for CHeroMorphDef then CHighlightItemDef / CSmokeGeneratorDef / CTimeAppearanceFadeDef / CCreatureNavigationDef / CInventoryItemDef / CLookDef / CReadableDef / CVillageDef / CVillageMemberDef / CBuyableHouseDef / CBuyHouseDef / CWifeDef / CDoorDef / CLightDef / CSpotLightDef / CClockDef / CHeroDef (b7f4c34 / acfe46f / 100e5cf / 1a4c51d / ee08490 / 3a7b594 / b1d6877 / 113a514 / a141c27 / 76edbbd / 91564bd / f30c099 / 71ae66e / 405b1e8 / 46663e3 / db3899a / 065eb28 / 6577614). MATCH is Note-only + *DefClassRegistered flag, not live constructed. LoadDef field walk stays PARTIAL. Do not invent a live object.
Lookout/GuildArrival vs Oakvale intro view (#4) leftover #4 No-save first region / first rendered scene is LookoutPoint (RegionThings + 006B3FF0 / GuildArrivalHSP). First-scene intro view is still StartOakValeWest / HerosOldHouse / CAM_OVIF_SHOT2 (FIRST_SCENE_*). Do not collapse those ledgers. Do not fold first-proximity TNG (#50) into this leftover. Leave #4 open.
New Profile dest/hit (#48) leftover #48 New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host). dest still not dest-locked (b075dd312118bd). HEAD FrontendLayoutTests still TryChromeHitIsNativeHit == false, PlaceTableCellCount3IsNative == false. NativeDestTupleUnread stays true. Persist parse of type-12 +326=30 / Sprites / SpriteKeys == [0,1,4] is real file recover. PlaceTableCell n==3 leftover fill still host. Persist-size skip is extra host heuristic on the same helper — #48 family, not a new leftover. leave #48 open.
First-proximity TNG pump (#50) leftover #50 LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. Keep Lookout (no-save first region) vs Oakvale intro view separate. Do not fold #50 into #4. leave #50 open.
Exclusive-walk leftover STALE Exclusive-walk leftover is STALE (tracker already done). DrawContainerWalk foreach ChildrenOf, IsPresented parent-chain Visible/Clip, ApplyFirstSeenState Visible=true on every widget. Test FrontendUiDefTests.Factory_builds_press_start_then_main_menu_from_the_same_walk locks ContainerDrawWalksEveryChild, ExclusiveWalkSelectsChild == false, Leftover46ExclusiveWalkIsStale, type-18 FORREST_1 and FORREST_2 Visible, type-16 ARROWS/WASD and NORMAL/INVERTED Visible. Skip VAs 0052F180/0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. Do not invent DrawContainerWalk calls of those VAs. Do not file a new leftover for that unread gap.
Init Player Interface leftover Register(ActionInputListener) / 00488D20 notes leftover Not a function; factory is Create Players. Host ctor note of 0044A3B0 under Init Player Interface is DISPROVEN (moved to Init Player Manager, 4a03969). Do not file a new issue.

No-save WorldFrame now ticks after Create Players (+9826=1). The Oakvale intro fiber still needs a proven region write (persist PlayerRegionName writer stays UNREAD) — do not invent one on the no-save Lookout path.

2. First-scene intro fiber (apply / runtime)

Script-layer walk of CS_OAKVALE_INTRO_FATHER is already Finished def+60. Leftover is apply/runtime, not “map the next unread opcode.” Last persist-vector-0 command: Hero.SneakTo MK_OVIF_HERO5,0.0,TRUE (RegionTravel.IntroCutsceneLastCommand).

Leftover on this fiberStatusWhere
PlayAnimation runtime / clip sample (vtbl+72 004C7470 walk; +68 00686920 accept; 00662A00 table; 0070C050+0070D580 inner). Apply is PROVEN; first-key XSEQ sample is in PaletteForPose. Leftover is time interp 00AA0090. FirstSeenPlayAnimationAppliesPose=false PARTIAL COMMAND_MAP, PARITY 0b; XSeqFormatTests
WaitPlayAnimation leftover vtbl+104 poll (apply 00CC18E0 is PROVEN; not unread apply) PARTIAL 1eec3bc / COMMAND_MAP
Create 008A9100 / Remove 004C9B80 mesh UNREAD PARITY 0b “next unread”
Skip-key bodies / vector 1 UNREAD first-seen skip does not fire
Who writes [quest+80] / AttackOver after vtbl+2584(12) + HerosOldHouse UNREAD not a mov in 00DBDE00–00DBF000
LookToThing / LookInDirection heading bodies PARTIAL record + yield / no yaw write
MuteSounds apply; DoCameraPreloading vtbl+1560/1568 PARTIAL
Dialogue UI (Speak / InteractiveSpeak / DialogSpeak) PARTIAL one yield; no invented UI
SneakTo / WalkTo mesh move (004C72B0 stub) PARTIAL FirstSeenSneakToAppliesMove=false. Dest via 006A9960 / World.Positions is PROVEN (666df8f); Thing XYZ writable so WalkTo writes back (27cb7ee); mesh body is not.
PlayCombatAnimation pose PARTIAL vtbl+76 does not read the name
call [vtbl+8] resume site; vtbl+28 yield body; Main 00CDD440 UNREAD PARITY 0b
Startup AVI client Present is blit-only 006286F0 MATCH PARTIAL leftover #20. Unload 00A3B380/00A3BC20 before next slot is recovered (0ace433 / PlayAvi_rewrites_xmv_to_installed_wmv_and_blocks). Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open.
WmvPlayer never QIs IBasicAudio (native 00A3B9D0 does) PARTIAL leftover #9. Host NAudio FrontendAudioPlayer (Intro.ogg / Frontend.lug CS_GUI_1/2) does not lock leftover #9 or leftover #15 (Init Sound 00417A58)

DoScriptFrame / PlayAVI / cameras / fades are PROVEN at the script layer. PlayAVI dest vs 1600×900 (#8) is done. Native 00628B79 dest + recreate-on-height (#11) is done (98c4acc). Unload 00A3B380/00A3BC20 before the next slot is now recovered (0ace433). Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open. IBasicAudio (#9) stays a PARTIAL leftover. Host frontend audio (Intro.ogg / Frontend.lug) does not lock leftover #9 or leftover #15. Do not invent fade/AVI/wake playback beyond those bodies.

3. First-scene render leftovers

Only items already listed. No visual guesses. From FIRST_SCENE_AUDIT.md “UNREAD leftover (do not invent)” and the contract STATE table:

TEMPORARY stand-ins (LINEAR/REPEAT, MaxLod=1, Z test+write on) stay classified. PlayAVI script apply is PROVEN; dest vs Silk.WindowOptions.DefaultVulkan 1600×900 (#8) is done. Native 00628B79 dest + recreate-on-height (#11) is done (98c4acc). Unload-before-next-slot is recovered. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open. IBasicAudio (#9) stays a PARTIAL leftover. Host frontend audio (Intro.ogg / Frontend.lug) does not lock leftover #9 or leftover #15. Steam timing is PARITY Open item 0, not a first-scene 3D invent.

4. Animation (after boot)

README item 1, after a ticking world. First-seen wake lines (CS_WAKING_UP_*) need the clock; create still has FirstSeenPlaysAnim=false.

LeftStatus
Animation resource lookup UNREAD / PARTIAL
Clip first-key sample in PaletteForPose (00A999B0 / 00AA4680 / 00A4C5E0); leftover is time interp 00AA0090
Skeletal pose UNREAD (FirstSeenPlayAnimationAppliesPose=false)
PALSKIN dest beyond file triangles first-seen dest is MeshFile.Triangles (00A9E1E0 × IBM, cb22533); no CPU re-skin. Play-anim product is not. Type1/Flag1 routing stays UNREAD (f4a1efc). c38 dest upload is later GPU path (27cb7ee; do not file)

5. Later (README order, after first-scene boot)

#AreaStatus
2Movement / navigation / entity task completionPARTIAL (dest+gait recovered; vtbl+20 stub)
3Dialogue / voice / audio lifecyclePARTIAL (session recorded; UI/voice unread)
4Generic quest lifecycle beyond S_QNOVIPARTIAL
5Create / remove ownershipPARTIAL (script record; mesh unread)
6Runtime effects / lights / state → VulkanPARTIAL
7Remaining world / shader / statesee phase 3

Out of scope for this page

Phase check vs 2026-08-18 hypothesis

The boot-first sequence holds. Corrections from the repo:

  1. No-save first real region and first rendered scene are LookoutPoint (index 1, RegionThings + 006B3FF0 hero camera). Oakvale is persist-name index 4 or the first-scene intro view contract (StartOakValeWest / HerosOldHouse / CAM_OVIF_SHOT2 / kid). Do not collapse that into Lookout. New Game click is PROVEN; persist PlayerRegionName writer is not. 006B2CA0 first-seen pose is now PROVEN (204a214); invented SeedAt(1.6m) is not the New Game path. Lookout helper FOV is 70 from 00A0C130 (be3339e); 00A0C130 is a packer (a6f939a). Consumed first-Present helper stays UNREAD — do not reopen #6 / #13. SHOT2 FOV 72 stays intro-view leftover. 006B8640/008889C0 leftover UNREAD. Frontend 00595222 is the resident-slot vtbl+8 DrawsChildList walk (7adf621 / b4a2c89). FrontendPresentBodyIsLive means Clear/Begin/recovered DIPUP/Present when Device is set — it does not dest-lock #14. WM_CHAR is type 15; Press Start / New Profile / New Game are LMB type 4/6. Type-10 packet is widget +352, not MessageId. Type4 apply is still host dest AABB hover, not recovered current-inner 0055CB10. leave #14 open. Host current _frontendWidgets is still the switched screen (input leftover) (84a8350). 3D stays Compatibility host.Draw after Leave. F2 fly is Game-only. Press Start 0xE5 is slot 0x14 0059B5D7 (59fde69). [ui+84] keeps 0x14/0x17 across switch (84a8350). +332 via SelectState(6) is not a +302 hide (b8a2b21). Init World 004A67D0 / 004A6E30 run inside 0041735A before 00417418. Recent commits 951b7f212118bd lock ExeIndex evidence exporters + persist Layer recover, scene-capture tool / retain-first-parsed-map, authored intro dialogue/audio + kid spawn on StartOakVale, UpdateAtClock + live actor MeshDraw refresh, intro-father parent continuation + sortDraws:false + present semaphore, in-game PlayAVI skip, and QuestLifecycleRuntime / S_QNOVI post-cutscene map. MATCH for named-stage Add Def Class is still Note-only + *DefClassRegistered flag, not a live constructed object. dest 0044C72B as [01232C24+8] is not rdata-locked. leave #42 open. Different object from later Subtitled [0x13B8A54]. Init Player Interface still leftover Register(ActionInputListener) / 00488D20 notes. Host ctor note of 0044A3B0 under Init Player Interface is DISPROVEN (moved). dest still invented 512,384,512,384; DIP (0,0) stand-in; DisplayFlushShouldDip(0, 0) always false; 009DA9F0 flush is still Note-only (DisplayFlushQueueIsNoteOnly). Point dest still skips DIPUP (00BADB36). Exclusive-walk leftover is STALE (tracker already done). Skip VAs 0052F180 / 0052F1D0 stay named constants (SkipVtblsAreMethodCalls == false); that is not exclusive-walk. New Profile dest/hit is host stand-in (TryChromeHit invents type-16/37 hit; GRAPHIC-name AABB is also host). NativeDestTupleUnread stays true. Host frontend audio does not lock leftover #15 or leftover #9. leave #48 open. LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. leave #50 open. Do not collapse no-save first region LookoutPoint vs first-scene Oakvale intro view (leave #4 open). dest invented 512,384,512,384. leave #36 open. #5 grok-goal dump still written. Do not re-file. Startup AVI client Present is blit-only 006286F0 MATCH (Draw(default) / playAviOnly). Remaining leftover #20 is Game-stage: PumpGame still walks 00435530 because 006286F0 does not own that pump. 41e97c9 is in-game skip (Game_PlayAVI_006286F0_polls_the_retail_skip_scan). Startup still Draw(default). Does not lock #20. Do not treat FABLE_SKIP_STARTUP_AVI as a 3D Draw fix. leave #20 open. a02ab21 does not lock #14 dest/Present. e004fe3 SetFrontendBatch can record world verts under frontend — leftover already #14, do not file a new issue. Frontend 0042DF9E / 00595222 still Note-only. FrontendDisplayCursorRan stays false. leave #14 and #20 open (also leave #36 #42 #48 #50 open). Also leave leftover #4 #5 #9 #12 #15 #17 #19 open. Do not reopen #8. Do not reopen #46. New Game submit now walks 0x4/0x40/0x20/0x100/0x2000 (676bf63); cell DIP is 0x40 only (40037b1). #11 done (98c4acc recreate-on-height + 00628B79 dest). #18 done (ff808b1 RHSet +X). Lookout EnvironmentTheme is ENVIRONMENT_THEME1 #2346, not ENVIRONMENT_OAKVALE. Do not collapse Oakvale intro view into Lookout.
  2. GTNG is not an unread file on TLC — missing skip is PROVEN. 00521AE0 loads the current map .tng. LoadGlobalThingsHostBreaksAfterFirstProx=false / retain-first-parsed-map. 151-slot census is not locked 004FDBC0 NewMap 1. leftover #50 stays open and is not folded into #4. Remaining UNREAD is global-things use after 004FDBC0 / .gtg parse, plus [record+36] and catchup-tick writers.
  3. Intro opcodes are already walked. Phase 2 is apply/runtime leftovers on that fiber, not “finish UNREAD tokens.”
  4. README animation-first is the long-term engine list, not today’s master. Animation stays after the clock.

When this page and a ledger disagree, the ledger wins.