{"kind":"hwanse-map-animation-tick-route-review","status":"tick-route-grounded-producer-still-indirect","source":["Hwanse2.exe","tools/build_map_animation_tick_route_review.py","out/map_animation_redraw_consumer_review.json","out/map_animation_live_buffer_writer_review.json","out/map_animation_object_relative_tile_write_review.json"],"globals":{"liveLayer0Grid":"0x00595af0","liveLayer1FlagGrid":"0x0058d7d0","dirtyWorkGrid":"0x005957d0","mapWidth":"0x00595ada","mapHeight":"0x00595adc"},"summary":{"mainTimingLoopCallVaHex":"0x004019f2","fieldTickRouteVaHex":"0x00411476","updateLoopMax":3,"perFrameUpdateCalls":["0x00422d74","0x00435c04","0x00432ff0"],"directLiveBufferRefsInTickRoute":0,"directLiveBufferRefsInPerFrameUpdates":0,"genericObjectScriptRunnerGrounded":true,"genericObjectScriptRunnerVaHex":"0x00402321","genericObjectScriptHandlerTableVaHex":"0x00440538","activeObjectDelayedScriptRouteGrounded":true,"activeObjectDelayedScriptRunnerVaHex":"0x00432ff0","visibleMotionProducerFound":false,"remainingCandidate":"active-object delayed script -> generic object script runner -> tile-write opcodes 0x58/0x6b/0x76","decision":"The field tick/update route is grounded, but it does not directly mutate live map buffers. The remaining static producer candidate is an active-object delayed script executed through 0x00402321."},"landmarks":[{"key":"mainTimingLoopCaller","name":"main timing loop caller","va":4200946,"endVa":4200960,"role":"Calls the field tick/update route once per timing pass.","vaHex":"0x004019f2","endVaHex":"0x00401a00","section":".text","directCallXrefs":[],"pointerXrefs":[],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"e8 7f fa 00 00 83 c4 04 33 c0 a0 47 77 45 00 85 c0 0f 85 0f 00 00 00 c7 05 80 e3 59 00 01 00 00 00 e9 32 00 00 00 ff 15 64 04 5a 00 2b 05 8c e3 59 00 2b d2 f7 35 7c e3 59 00 40 a3 80 e3 59 00 a1 80 e3 59 00 83 f8 03"},{"key":"fieldTickRoute","name":"field tick/update route","va":4265078,"endVa":4265341,"role":"Clamps the catch-up update count, runs per-frame update calls, then calls redraw passes.","vaHex":"0x00411476","endVaHex":"0x0041157d","section":".text","directCallXrefs":[{"callVa":4200946,"callVaHex":"0x004019f2"}],"pointerXrefs":[],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"55 8b ec 83 ec 04 53 56 57 a1 1c e3 59 00 50 a1 18 e3 59 00 50 e8 6e 68 00 00 83 c4 08 e8 68 fb fe ff 33 c0 a0 47 77 45 00 85 c0 0f 84 19 00 00 00 8b 45 08 83 f8 03 0f 82 05 00 00 00 b8 03 00 00 00 89 45 08 e9 07 00"},{"key":"inputStateUpdate","name":"input/state update","va":4337012,"endVa":4337280,"role":"One per-frame update call from the field tick route; input/state side, no direct live map-buffer refs in the inspected window.","vaHex":"0x00422d74","endVaHex":"0x00422e80","section":".text","directCallXrefs":[{"callVa":4211365,"callVaHex":"0x004042a5"},{"callVa":4265186,"callVaHex":"0x004114e2"}],"pointerXrefs":[],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"55 8b ec 53 56 57 e8 6f c7 00 00 33 c0 66 a1 ac b2 55 00 f7 d0 66 a3 12 e3 59 00 6a 00 e8 3c c9 00 00 83 c4 04 66 a3 10 e3 59 00 66 a1 10 e3 59 00 66 a3 ac b2 55 00 33 c0 66 a1 12 e3 59 00 33 c9 66 8b 0d ac b2 55 00"},{"key":"unknownPerFrameUpdate","name":"secondary per-frame update","va":4414468,"endVa":4414752,"role":"One per-frame update call from the field tick route; no direct live map-buffer refs in the inspected window.","vaHex":"0x00435c04","endVaHex":"0x00435d20","section":".text","directCallXrefs":[{"callVa":4265011,"callVaHex":"0x00411433"},{"callVa":4265191,"callVaHex":"0x004114e7"}],"pointerXrefs":[],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"55 8b ec 83 ec 08 53 56 57 c7 45 f8 00 00 00 00 e9 03 00 00 00 ff 45 f8 83 7d f8 05 0f 83 72 00 00 00 8b 45 f8 8b c8 8d 04 80 8d 04 40 8d 04 81 8b 04 c5 48 3b 57 00 89 45 fc e9 09 00 00 00 8b 45 fc 8b 40 08 89 45 fc"},{"key":"activeObjectDelayedScriptRoute","name":"active object delayed script route","va":4403184,"endVa":4403504,"role":"Walks active object lists; when a timer expires it runs the object's script through the generic script runner.","vaHex":"0x00432ff0","endVaHex":"0x00433130","section":".text","directCallXrefs":[{"callVa":4265196,"callVaHex":"0x004114ec"}],"pointerXrefs":[],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"55 8b ec 83 ec 0c 53 56 57 c7 45 f4 00 00 00 00 e9 03 00 00 00 ff 45 f4 83 7d f4 05 0f 83 be 00 00 00 8b 45 f4 8b c8 8d 04 80 8d 04 40 8d 04 81 8b 04 c5 48 3b 57 00 89 45 f8 e9 09 00 00 00 8b 45 f8 8b 40 08 89 45 f8"},{"key":"genericObjectScriptRunner","name":"generic object script runner","va":4203297,"endVa":4203376,"role":"Reads opcode byte from object+0x40 script pointer and dispatches through table 0x00440538.","vaHex":"0x00402321","endVaHex":"0x00402370","section":".text","directCallXrefs":[{"callVa":4203391,"callVaHex":"0x0040237f"},{"callVa":4217007,"callVaHex":"0x004058af"},{"callVa":4217048,"callVaHex":"0x004058d8"},{"callVa":4403369,"callVaHex":"0x004330a9"}],"pointerXrefs":[{"refVa":4203260,"refVaHex":"0x004022fc","section":".text"},{"refVa":4203869,"refVaHex":"0x0040255d","section":".text"},{"refVa":4221713,"refVaHex":"0x00406b11","section":".text"},{"refVa":4225391,"refVaHex":"0x0040796f","section":".text"},{"refVa":4225679,"refVaHex":"0x00407a8f","section":".text"},{"refVa":4253993,"refVaHex":"0x0040e929","section":".text"},{"refVa":4254028,"refVaHex":"0x0040e94c","section":".text"},{"refVa":4254129,"refVaHex":"0x0040e9b1","section":".text"},{"refVa":4255592,"refVaHex":"0x0040ef68","section":".text"},{"refVa":4265893,"refVaHex":"0x004117a5","section":".text"},{"refVa":4266001,"refVaHex":"0x00411811","section":".text"},{"refVa":4266045,"refVaHex":"0x0041183d","section":".text"},{"refVa":4266249,"refVaHex":"0x00411909","section":".text"},{"refVa":4266314,"refVaHex":"0x0041194a","section":".text"},{"refVa":4266579,"refVaHex":"0x00411a53","section":".text"},{"refVa":4266633,"refVaHex":"0x00411a89","section":".text"},{"refVa":4266835,"refVaHex":"0x00411b53","section":".text"},{"refVa":4267104,"refVaHex":"0x00411c60","section":".text"},{"refVa":4267371,"refVaHex":"0x00411d6b","section":".text"},{"refVa":4267644,"refVaHex":"0x00411e7c","section":".text"},{"refVa":4267917,"refVaHex":"0x00411f8d","section":".text"},{"refVa":4268185,"refVaHex":"0x00412099","section":".text"},{"refVa":4268458,"refVaHex":"0x004121aa","section":".text"},{"refVa":4268728,"refVaHex":"0x004122b8","section":".text"},{"refVa":4269001,"refVaHex":"0x004123c9","section":".text"},{"refVa":4269191,"refVaHex":"0x00412487","section":".text"},{"refVa":4269419,"refVaHex":"0x0041256b","section":".text"},{"refVa":4269555,"refVaHex":"0x004125f3","section":".text"},{"refVa":4269764,"refVaHex":"0x004126c4","section":".text"},{"refVa":4269971,"refVaHex":"0x00412793","section":".text"},{"refVa":4270216,"refVaHex":"0x00412888","section":".text"},{"refVa":4270329,"refVaHex":"0x004128f9","section":".text"},{"refVa":4270543,"refVaHex":"0x004129cf","section":".text"},{"refVa":4270716,"refVaHex":"0x00412a7c","section":".text"},{"refVa":4270931,"refVaHex":"0x00412b53","section":".text"},{"refVa":4271092,"refVaHex":"0x00412bf4","section":".text"},{"refVa":4271262,"refVaHex":"0x00412c9e","section":".text"},{"refVa":4271515,"refVaHex":"0x00412d9b","section":".text"},{"refVa":4271869,"refVaHex":"0x00412efd","section":".text"},{"refVa":4272380,"refVaHex":"0x004130fc","section":".text"},{"refVa":4272552,"refVaHex":"0x004131a8","section":".text"},{"refVa":4272799,"refVaHex":"0x0041329f","section":".text"},{"refVa":4273094,"refVaHex":"0x004133c6","section":".text"},{"refVa":4273478,"refVaHex":"0x00413546","section":".text"},{"refVa":4273783,"refVaHex":"0x00413677","section":".text"},{"refVa":4274197,"refVaHex":"0x00413815","section":".text"},{"refVa":4274585,"refVaHex":"0x00413999","section":".text"},{"refVa":4274906,"refVaHex":"0x00413ada","section":".text"},{"refVa":4275067,"refVaHex":"0x00413b7b","section":".text"},{"refVa":4275262,"refVaHex":"0x00413c3e","section":".text"},{"refVa":4275520,"refVaHex":"0x00413d40","section":".text"},{"refVa":4275815,"refVaHex":"0x00413e67","section":".text"},{"refVa":4275949,"refVaHex":"0x00413eed","section":".text"},{"refVa":4276141,"refVaHex":"0x00413fad","section":".text"},{"refVa":4276360,"refVaHex":"0x00414088","section":".text"},{"refVa":4276552,"refVaHex":"0x00414148","section":".text"},{"refVa":4276856,"refVaHex":"0x00414278","section":".text"},{"refVa":4277210,"refVaHex":"0x004143da","section":".text"},{"refVa":4277401,"refVaHex":"0x00414499","section":".text"},{"refVa":4277513,"refVaHex":"0x00414509","section":".text"},{"refVa":4277649,"refVaHex":"0x00414591","section":".text"},{"refVa":4277923,"refVaHex":"0x004146a3","section":".text"},{"refVa":4278222,"refVaHex":"0x004147ce","section":".text"},{"refVa":4278490,"refVaHex":"0x004148da","section":".text"},{"refVa":4278757,"refVaHex":"0x004149e5","section":".text"},{"refVa":4278964,"refVaHex":"0x00414ab4","section":".text"},{"refVa":4279571,"refVaHex":"0x00414d13","section":".text"},{"refVa":4279834,"refVaHex":"0x00414e1a","section":".text"},{"refVa":4280021,"refVaHex":"0x00414ed5","section":".text"},{"refVa":4280191,"refVaHex":"0x00414f7f","section":".text"},{"refVa":4280456,"refVaHex":"0x00415088","section":".text"},{"refVa":4306730,"refVaHex":"0x0041b72a","section":".text"},{"refVa":4308508,"refVaHex":"0x0041be1c","section":".text"},{"refVa":4314457,"refVaHex":"0x0041d559","section":".text"},{"refVa":4325051,"refVaHex":"0x0041febb","section":".text"},{"refVa":4359410,"refVaHex":"0x004284f2","section":".text"},{"refVa":4399575,"refVaHex":"0x004321d7","section":".text"},{"refVa":4399820,"refVaHex":"0x004322cc","section":".text"},{"refVa":4400103,"refVaHex":"0x004323e7","section":".text"},{"refVa":4400362,"refVaHex":"0x004324ea","section":".text"},{"refVa":4400937,"refVaHex":"0x00432729","section":".text"},{"refVa":4401182,"refVaHex":"0x0043281e","section":".text"},{"refVa":4403505,"refVaHex":"0x00433131","section":".text"}],"directLiveMapBufferRefs":{"liveLayer0Grid":[],"liveLayer1FlagGrid":[],"dirtyWorkGrid":[],"mapWidth":[],"mapHeight":[]},"directLiveMapBufferRefCount":0,"byteSnippet":"55 8b ec 53 56 57 c7 05 b8 a1 55 00 00 00 00 00 83 3d b8 a1 55 00 00 0f 85 1d 00 00 00 8b 45 08 50 8b 45 08 8b 40 40 33 c9 8a 08 ff 14 8d 38 05 44 00 83 c4 04 e9 d6 ff ff ff 5f 5e 5b c9 c3 55 8b ec 83 ec 04 53 56 57"}],"steps":[{"step":"main loop enters field tick route","vaHex":"0x004019f2","evidence":"A direct E8 call targets 0x00411476.","meaning":"0x00411476 is a per-frame/timing route worth checking before redraw."},{"step":"tick route clamps update count","vaHex":"0x00411476","evidence":"The route derives a catch-up update count from timing globals and clamps it to 1..3 before the update loop.","meaning":"This is the stable tick side, not a one-off map loader."},{"step":"per update calls","vaHex":"0x004114e2","evidence":"The route calls 0x00422d74, 0x00435c04, and 0x00432ff0 inside the update loop.","meaning":"Any frame/tick tile mutation should be in one of these calls or deeper."},{"step":"direct live map-buffer refs are absent in tick windows","vaHex":"0x00411476","evidence":"Exact immediate refs to 0x00595af0/0x0058d7d0/0x005957d0/width/height were scanned in the tick route and the three per-frame update windows.","meaning":"The visible animation producer is not a direct write in these top-level windows."},{"step":"active object delayed script path remains","vaHex":"0x00432ff0","evidence":"The active-object update path walks object lists, decrements object +0x62 timers, swaps object +0x40 with +0x64 on expiry, and calls 0x00402321.","meaning":"Per-frame object scripts can execute VM commands indirectly from the tick route."},{"step":"generic script runner dispatches by opcode","vaHex":"0x00402321","evidence":"The runner reads the script pointer at object +0x40, reads the opcode byte, and dispatches via handler table 0x00440538.","meaning":"Known tile-write handlers 0x58/0x6b/0x76 can be reached if an animated-map object script contains those opcodes."},{"step":"redraw follows updates","vaHex":"0x004114f6","evidence":"After the update loop, 0x00411476 calls the 0x00425403 dirty scan and redraw passes.","meaning":"A script-driven live layer0 mutation before this point would be visible in the same frame redraw path."}],"surfaces":[{"surface":"field tick route","promotion":"grounded-route","finding":"0x004019f2 calls 0x00411476; 0x00411476 runs up to three update iterations before redraw.","gap":"No direct live layer0/layer1 buffer write was found in the top-level route window."},{"surface":"per-frame update calls","promotion":"negative-direct-buffer-scan","finding":"0x00422d74, 0x00435c04, and 0x00432ff0 were checked for direct refs to the live map buffers.","gap":"Direct refs are absent, so visible motion is either indirect VM/script execution or another specialized callback."},{"surface":"active object delayed script route","promotion":"grounded-indirect-candidate","finding":"0x00432ff0 can run object +0x64 delayed scripts through generic runner 0x00402321.","gap":"The specific animated-map object/root that installs a tile-write stream is still unbound."},{"surface":"generic object script runner","promotion":"grounded-dispatcher","finding":"0x00402321 dispatches object scripts via handler table 0x00440538.","gap":"Need to bind animated maps to an object script stream containing tile-write opcodes 0x58/0x6b/0x76 or equivalent."}],"nextFrontier":["Inventory active-object script streams installed for animated maps and search them for 0x58/0x6b/0x76 tile-write commands.","Bind an object +0x64 delayed script payload to map1_01a/map1_02b/map_c animated resources if possible.","If no static root binds, continue from the higher-level animated-map load/update dispatcher instead of promoting this route."]}