{"kind":"hwanse-field-encounter-tick-route-boundary-review","status":"field-tick-route-not-promoted","source":["Hwanse2.exe","out/field_step_encounter_boundary_review.json","out/field_encounter_formation_stream_review.json","out/field_rng_selector_opcode1c_review.json","out/field_encounter_static_review.json","tools/build_field_encounter_tick_route_boundary_review.py"],"summary":{"knownFieldWindowCount":7,"keyDirectCallsInsideKnownFieldWindows":1,"promotableKeyDirectCallsInsideKnownFieldWindows":0,"sharedRngCallsInsideKnownFieldWindows":1,"sharedRngEncounterClassInsideKnownFieldWindows":0,"keyDwordRefsInsideKnownFieldWindows":0,"battleOrMonsterCnsRefsInsideKnownFieldWindows":0,"keyTargetDirectCallRows":2,"formationCandidateCount":6,"formationCandidateExactPointerRefCount":0,"opcode1cWellFormedBlockCount":0,"rngDirectFieldEncounterEvidenceCount":0,"fieldTickRouteProducerPromoted":false,"decision":"known field update/tick/movement windows include only one shared-RNG direct call, and that call is the already separated scene-event random gate. They do not directly call/resource-reference the resource runner or actor formation consumers as an encounter producer. Formation stream candidates also remain unreferenced by exact pointers. Keep field encounter producer unpromoted."},"knownFieldWindows":[{"key":"main-update-loop","role":"per-frame wrapper; calls input, active-object callback, script/timer updates","startVaHex":"0x00411476","endVaHex":"0x0041157e","directCallCount":18,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"input-polling","role":"packs keyboard/pad state into continuous and pressed-edge masks","startVaHex":"0x00422d74","endVaHex":"0x00422f30","directCallCount":8,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"active-object-callback","role":"iterates active object callbacks","startVaHex":"0x00435c04","endVaHex":"0x00435d80","directCallCount":1,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"script-timer","role":"runs object frame scripts; contains known scene random-gate surface","startVaHex":"0x00432ff0","endVaHex":"0x00433380","directCallCount":8,"keyDirectCallCount":1,"keyDirectCallClasses":{"shared-rng":1},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"actor-controller","role":"reads input mask, collision helper result, mutates actor tile fields +0xe8/+0xea and trail ring","startVaHex":"0x0043022d","endVaHex":"0x004319f4","directCallCount":54,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"collision-helper","role":"tests layer1 collision flag grid 0x0058d7d0/0x0058d7ce against actor footprint","startVaHex":"0x004319f8","endVaHex":"0x00432020","directCallCount":20,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]},{"key":"action-packer","role":"translates key table state to action bitmasks","startVaHex":"0x0042f6d2","endVaHex":"0x0042f800","directCallCount":0,"keyDirectCallCount":0,"keyDirectCallClasses":{},"keyDwordRefCount":0,"keyDwordRefs":[],"cnsRefCount":0,"battleOrMonsterCnsRefs":[]}],"keyCallsInsideKnownFieldWindows":[{"window":"script-timer","label":"shared-rng","callVa":4403435,"callVaHex":"0x004330eb","targetVa":4355888,"targetVaHex":"0x00427730","rngClass":"scene-event-random-gate"}],"keyDwordRefsInsideKnownFieldWindows":[],"keyTargetDirectCalls":[{"label":"shared-rng","targetVaHex":"0x00427730","directCallCount":51,"insideKnownFieldWindowCount":1,"callSites":[{"callVaHex":"0x004056ef","knownFieldWindow":null},{"callVaHex":"0x0040bdcc","knownFieldWindow":null},{"callVaHex":"0x0040cdcf","knownFieldWindow":null},{"callVaHex":"0x004217da","knownFieldWindow":null},{"callVaHex":"0x00421836","knownFieldWindow":null},{"callVaHex":"0x00421892","knownFieldWindow":null},{"callVaHex":"0x004218da","knownFieldWindow":null},{"callVaHex":"0x00421922","knownFieldWindow":null},{"callVaHex":"0x0042196a","knownFieldWindow":null},{"callVaHex":"0x004219a8","knownFieldWindow":null},{"callVaHex":"0x004330eb","knownFieldWindow":"script-timer"},{"callVaHex":"0x00433448","knownFieldWindow":null},{"callVaHex":"0x00433463","knownFieldWindow":null},{"callVaHex":"0x004334e7","knownFieldWindow":null},{"callVaHex":"0x00433b3c","knownFieldWindow":null},{"callVaHex":"0x00433bde","knownFieldWindow":null},{"callVaHex":"0x00434190","knownFieldWindow":null},{"callVaHex":"0x0043432e","knownFieldWindow":null},{"callVaHex":"0x00434343","knownFieldWindow":null},{"callVaHex":"0x00434421","knownFieldWindow":null},{"callVaHex":"0x00434446","knownFieldWindow":null},{"callVaHex":"0x0043445b","knownFieldWindow":null},{"callVaHex":"0x00434468","knownFieldWindow":null},{"callVaHex":"0x0043456e","knownFieldWindow":null},{"callVaHex":"0x00434588","knownFieldWindow":null},{"callVaHex":"0x004345b3","knownFieldWindow":null},{"callVaHex":"0x004345c0","knownFieldWindow":null},{"callVaHex":"0x004345cf","knownFieldWindow":null},{"callVaHex":"0x004346d3","knownFieldWindow":null},{"callVaHex":"0x004346e4","knownFieldWindow":null},{"callVaHex":"0x0043471f","knownFieldWindow":null},{"callVaHex":"0x004347e9","knownFieldWindow":null},{"callVaHex":"0x004347fa","knownFieldWindow":null},{"callVaHex":"0x00434835","knownFieldWindow":null},{"callVaHex":"0x004348ba","knownFieldWindow":null},{"callVaHex":"0x004349ea","knownFieldWindow":null},{"callVaHex":"0x00434a07","knownFieldWindow":null},{"callVaHex":"0x00434b67","knownFieldWindow":null},{"callVaHex":"0x00434cf9","knownFieldWindow":null},{"callVaHex":"0x00434d23","knownFieldWindow":null},{"callVaHex":"0x00434dbb","knownFieldWindow":null},{"callVaHex":"0x00434df8","knownFieldWindow":null},{"callVaHex":"0x00434f90","knownFieldWindow":null},{"callVaHex":"0x00434fca","knownFieldWindow":null},{"callVaHex":"0x004350d3","knownFieldWindow":null},{"callVaHex":"0x0043517d","knownFieldWindow":null},{"callVaHex":"0x0043518c","knownFieldWindow":null},{"callVaHex":"0x004351ed","knownFieldWindow":null},{"callVaHex":"0x00435209","knownFieldWindow":null},{"callVaHex":"0x0043523d","knownFieldWindow":null},{"callVaHex":"0x00435795","knownFieldWindow":null}]},{"label":"resource-runner","targetVaHex":"0x00423a2f","directCallCount":5,"insideKnownFieldWindowCount":0,"callSites":[{"callVaHex":"0x00405f1a","knownFieldWindow":null},{"callVaHex":"0x00405f2d","knownFieldWindow":null},{"callVaHex":"0x004063e8","knownFieldWindow":null},{"callVaHex":"0x00407a37","knownFieldWindow":null},{"callVaHex":"0x00407ae2","knownFieldWindow":null}]}],"formationCandidatePointerRefs":[{"streamVaHex":"0x00450bd2","classification":"well-formed-unbound","entryNames":["맹호권사범","숙련창룡권사"],"hasEnemyActor":true,"exactPointerRefCount":0,"exactPointerRefs":[]},{"streamVaHex":"0x0045adbf","classification":"well-formed-party-or-reserved-only","entryNames":["actor-row-0"],"hasEnemyActor":false,"exactPointerRefCount":0,"exactPointerRefs":[]},{"streamVaHex":"0x00479e12","classification":"well-formed-unbound","entryNames":["돌기멧돼지"],"hasEnemyActor":true,"exactPointerRefCount":0,"exactPointerRefs":[]},{"streamVaHex":"0x00479f62","classification":"well-formed-party-or-reserved-only","entryNames":["actor-row-0"],"hasEnemyActor":false,"exactPointerRefCount":0,"exactPointerRefs":[]},{"streamVaHex":"0x0052015a","classification":"well-formed-unbound","entryNames":["마왕박쥐"],"hasEnemyActor":true,"exactPointerRefCount":0,"exactPointerRefs":[]},{"streamVaHex":"0x0052018e","classification":"well-formed-unbound","entryNames":["권법가"],"hasEnemyActor":true,"exactPointerRefCount":0,"exactPointerRefs":[]}],"nextFrontier":["known field windows 밖의 higher-level mode/state dispatcher에서 field step success 이후 battle setup을 호출하는지 확인한다.","dynamic/materialized command stream 가능성 때문에 opcode 0x1c/0x1e는 runtime watchpoint 없이는 producer로 승격하지 않는다.","필드 인카운트 확정에는 field tick root, encounter threshold/RNG, formation stream 선택, btl background 선택이 한 route 안에서 이어지는 증거가 필요하다."]}