Scene/Event VM choice target 검토
0x004bfdb4 공통 표시 스트림을 분리하고, prompt trace 40 18 마커와 handler-table 0x16/0x18 cluster가 아직 연결되지 않았음을 명시한다.
요약
common-stream-grounded-handler-cluster-unlinkedcommon stream0x004bfdb4
common stream rolesystem/menu render stream
opcode 0x18 handler0x0040bab2
0x18 advance4 bytes
selected target global0x0059e2a0
prompt marker linkedFalse
map1 0x16 producer rows0
map1 0x18/common branches10 / 15
choice marker arg rows267
arg exact/low6 matches129 / 172
arg high-bit rows125
next prompt proofFalse
Decisions
오해 방지 기준| item | promotion | evidence | remaining gap |
|---|---|---|---|
| branch target 0x004bfdb4 | reclassified-grounded | event-dialogue-block-021 classifies the range as system-text-like and its text lines are menu/system labels | not a selected option -> next prompt target; treat it as a common render/menu stream |
| opcode 0x18 inline operand | rejected-as-prompt-target | prompt trace marker 40 18 3a NN is a 4-byte row, so the following 40 00 00 00 is the next command, not an inline target | script_handler_table 0x18 also exists, but it is not proven to be the same prompt-choice marker domain |
| prompt marker vs handler cluster domain | blocked-domain-link | map1_01a prompt trace shows 0x18 markers and common 0x09 branches, while handler-table 0x16 producer rows are absent from that selected prompt trace | do not use the 0x16 -> 0x59e2a0 -> 0x18 handler cluster as selected-option proof until the stream binding is shown |
| prompt choice marker argument | partial | global choice marker rows=267, exact count matches=129, low6 count matches=172, high-bit rows=125 | plain 0x02..0x05 markers often equal visible choice count, but high-bit/menu markers include flags or merged-menu context |
| script-handler target storage | grounded-handler-unlinked | opcode 0x16 handler writes stream+0x04 to global 0x0059e2a0 | which producer instance executes for each displayed choice branch is not proven; map1_01a selected prompt trace shows opcode 0x16 rows=0 |
| map1_01a selected trace producer instance | blocked-static-gap | trace rows: opcode 0x18=10, branch calls to 0x004bfdb4=15, opcode 0x16 producer rows=0 | selected option -> next prompt still needs a different producer path or runtime-selected branch sample |
| 0x0059db1f counter | reclassified-grounded | 0x00433107 increments 0x59db1f from an internal random-threshold check, so it is not the user selected option index | exact selected option -> next prompt edge still needs a different producer proof or runtime sample |
Handler Cluster
0x16 -> 0x59e2a0 -> 0x18| name | opcode | handler | promotion | evidence | source |
|---|---|---|---|---|---|
| selected target producer | 0x16 | 0x0040ba3f | grounded-handler | reads stream+0x04 and stores the dword into 0x0059e2a0, then advances stream by 8 | out/script_handler_table.json / disassembly bytes |
| selection state initializer candidate | unindexed-nearby-routine | 0x0040ba5f | partial-neighbor-routine | reads stream+0x04/+0x06/+0x07/+0x08 and writes 0x59db18/0x59db1c/0x59db1e/0x59db1f | local disassembly cluster; not promoted as an opcode entry |
| selected target gate | 0x18 | 0x0040bab2 | grounded-handler-partial-route | advances stream by 4; compares 0x59db1e and 0x59db1f; when active flag is nonzero it jumps context+0x40 to 0x0059e2a0 | out/script_handler_table.json / disassembly bytes |
| random gate success counter updater | external-random-gate | 0x00433107 | grounded-not-choice-index | calls internal rand16_mod(10000), compares against 0x59db1c, and increments 0x59db1f only on random-threshold success | global-ref scan + random gate review |
Choice Rows
next prompt still blocked| choice | start | text | calls to 0x004bfdb4 | remaining gap |
|---|---|---|---|---|
| 10 | 0x004c0790 | 한가한 게 좋지, 잠이나 잘까 / 한가한데 쇼핑이나 할까 | 2 | choice marker and branch-call rows are visible, but selected option -> next prompt target is not proven |
| 15 | 0x004c0876 | 기록 / 그만둔다 | 1 | choice marker and branch-call rows are visible, but selected option -> next prompt target is not proven |
| 19 | 0x004c09fc | 쇼핑은 그만두고 자자 / 아니 쇼핑하러 가볼까 | 1 | choice marker and branch-call rows are visible, but selected option -> next prompt target is not proven |
| 22 | 0x004c0ad4 | 후~쇼핑은 관두고 자자 / 아냐 억지로라도 쇼핑가야지 | 4 | choice marker and branch-call rows are visible, but selected option -> next prompt target is not proven |
Prompt Choice Marker Argument
global scanPlain marker bytes often match visible choice count. High-bit values such as 0x82, 0x83, 0x8c, and 0xc2 remain flag/menu-layout candidates, not next-target proof.
| marker byte | rows |
|---|---|
0x02 | 128 |
0x03 | 6 |
0x04 | 5 |
0x05 | 1 |
0x07 | 1 |
0x08 | 1 |
0x42 | 12 |
0x82 | 15 |
0x83 | 27 |
0x84 | 19 |
0x85 | 1 |
0x87 | 8 |
0x8b | 5 |
0x8c | 17 |
0xc2 | 16 |
0xc3 | 5 |
Prompt Choice Marker Samples
| prompt | start | raw | lines | arg | low6 | high | text |
|---|---|---|---|---|---|---|---|
| story-prompt-0009 | 0x004419b8 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 연다 그만둔다 |
| story-prompt-0040 | 0x004422f4 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0063 | 0x0044e30c | 40 18 3a 03 | 3 | 0x03 | 3 | 0x00 | 간단한 코스 적당한 코스 초난관 코스 |
| story-prompt-0068 | 0x0044e46e | 40 18 3a 03 | 3 | 0x03 | 3 | 0x00 | 간단한 코스 적당한 코스 초난관 코스 |
| story-prompt-0074 | 0x0044e5b4 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 내비둬 |
| story-prompt-0076 | 0x0044e610 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 싫어 |
| story-prompt-0082 | 0x0044e726 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 싫은데 |
| story-prompt-0088 | 0x0044e84c | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 말이라고 해 싫다니까 |
| story-prompt-0094 | 0x0044e99a | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 싫어 |
| story-prompt-0104 | 0x0044eb9a | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론이지 그냥둬 |
| story-prompt-0110 | 0x0044ed00 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론 노우! |
| story-prompt-0114 | 0x0044ee1c | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0117 | 0x0044eeac | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0136 | 0x0044f3dc | 40 18 3a 05 | 5 | 0x05 | 5 | 0x00 | 초급 중급 상급 최상급 그만둔다 |
| story-prompt-0139 | 0x0044f4d8 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0143 | 0x0044f5dc | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0153 | 0x0044f856 | 40 18 3a 04 | 4 | 0x04 | 4 | 0x00 | 회복의 두루마리 탈출의 두루마리 마수석 필요없어! |
| story-prompt-0155 | 0x0044f8f4 | 40 18 3a 04 | 3 | 0x04 | 4 | 0x00 | 회복의 두루마리 탈출의 두루마리 필요없다 |
| story-prompt-0155 | 0x0044f8f4 | 40 18 3a 04 | 3 | 0x04 | 4 | 0x00 | 회복의 두루마리 탈출의 두루마리 필요없다 |
| story-prompt-0176 | 0x0044feaa | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 움직인다 그만둔다 |
| story-prompt-0265 | 0x0045718c | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 오우케이 잠깐만! |
| story-prompt-0293 | 0x0045f028 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇게는 못해 알았어 |
| story-prompt-0301 | 0x0045f270 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 거럼 아, 아냐! |
| story-prompt-0310 | 0x0045f49e | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 좋아요 아니오 |
| story-prompt-0313 | 0x0045f546 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그러지요 싫습니다 |
| story-prompt-0325 | 0x0045f810 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0327 | 0x0045f872 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-0385 | 0x00460962 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇게는 못한다 알았다구요 |
| story-prompt-0393 | 0x00460bc8 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 거럼 아냐 틀리다구 |
| story-prompt-0402 | 0x00460de2 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 알았어 싫어 |
| story-prompt-0405 | 0x00460e92 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 거럼 아니라구 |
| story-prompt-0417 | 0x0046116e | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아, 아뇨 |
| story-prompt-0419 | 0x004611c8 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 거럼 아니야 |
| story-prompt-0479 | 0x0046230a | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇게는 못한다 아, 알았다구 |
| story-prompt-0487 | 0x00462538 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론이지 아니야 |
| story-prompt-0496 | 0x00462764 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론 싫어 |
| story-prompt-0499 | 0x0046281c | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론이지 아니요 |
| story-prompt-0506 | 0x004629e0 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 갖고 간다 그만둔다 |
| story-prompt-0514 | 0x00462c10 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇다 아니다 |
| story-prompt-0516 | 0x00462c80 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇다 아니다 |
| story-prompt-0580 | 0x00463ee0 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇게는 못한다 알았어 |
| story-prompt-0588 | 0x0046413c | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그래, 그렇다 아냐, 아니라구 |
| story-prompt-0697 | 0x00466e98 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0723 | 0x0046c8ac | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그러지 뭐 싫~어 |
| story-prompt-0735 | 0x0046cc68 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 알았어 싫다니까 |
| story-prompt-0742 | 0x0046ce30 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0771 | 0x0046d6d6 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 한사람씩 밟는다 그만둔다 |
| story-prompt-0779 | 0x0046d8f8 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 도전한다 그만둔다 |
| story-prompt-0781 | 0x0046d94a | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 조~오치 싫~어 |
| story-prompt-0798 | 0x0046dd9a | 40 18 3a 04 | 4 | 0x04 | 4 | 0x00 | 오른쪽으로 올려놓는다 왼쪽으로 올려놓는다 올려놓지 않는다 포기한다 |
| story-prompt-0806 | 0x0046df8c | 40 18 3a 07 | 1 | 0x07 | 7 | 0x00 | 모르겠어 |
| story-prompt-0852 | 0x0046ec52 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 누른다 그만둔다 |
| story-prompt-0860 | 0x0046ee56 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 그렇다네 아니라구 |
| story-prompt-0895 | 0x0046f740 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 문을 통과한다 그만둔다 |
| story-prompt-0907 | 0x0046fa6c | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0910 | 0x0046fb18 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0935 | 0x004701ec | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0938 | 0x00470292 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0964 | 0x0047098e | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-0967 | 0x00470a38 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-1234 | 0x00481dde | 40 18 3a 83 | 3 | 0x83 | 3 | 0x80 | 쉰다 기록 그만둔다 |
| story-prompt-1277 | 0x00482b3a | 40 18 3a 83 | 3 | 0x83 | 3 | 0x80 | 휴식 기록 그냥간다 |
| story-prompt-1346 | 0x00483f6a | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 수면비약을 준다 아까워서 안준다 |
| story-prompt-1379 | 0x00485092 | 40 18 3a 03 | 3 | 0x03 | 3 | 0x00 | 물론이죠 다시 설명을 듣는다 때려 치운다 |
| story-prompt-1389 | 0x0048541c | 40 18 3a 03 | 3 | 0x03 | 3 | 0x00 | 다시 도전한다 다시 설명을 듣는다 때려 치운다 |
| story-prompt-1390 | 0x004871cc | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 처음부터 이어서 |
| story-prompt-1406 | 0x00487576 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-1438 | 0x0048d450 | 40 18 3a 04 | 4 | 0x04 | 4 | 0x00 | 유적 안에 뭐가 있지? 전투 요령을 알려주게! 모드란게 뭐지?! 물어보고 싶은 게 없네 |
| story-prompt-1456 | 0x0048db2e | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 열어본다 그만둔다 |
| story-prompt-1479 | 0x0048e0cc | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 한 명씩 밟는다 그만둔다 |
| story-prompt-1505 | 0x0048e7be | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 넣는다 그만둔다 |
| story-prompt-1538 | 0x0048f1f6 | 40 18 3a 02 | 1 | 0x02 | 2 | 0x00 | 아니오 |
| story-prompt-1636 | 0x0049a204 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 물론 받는다 그만둔다 |
| story-prompt-1642 | 0x0049a3b4 | 40 18 3a 02 | 2 | 0x02 | 2 | 0x00 | 당연히 받는다 아니, 그만둔다 |
| story-prompt-1656 | 0x0049a84c | 40 18 3a 84 | 4 | 0x84 | 4 | 0x80 | 소모품을 산다 무기·방어구를 산다 진귀한 물품은? 그만둔다 |
| story-prompt-1674 | 0x0049acf2 | 40 18 3a 83 | 3 | 0x83 | 3 | 0x80 | 횃불세트 1000G 고급한방약 1000G 안산다 |
| story-prompt-1675 | 0x0049ad4e | 40 18 3a 83 | 2 | 0x83 | 3 | 0x80 | 횃불세트 1000G 안산다 |
| story-prompt-1675 | 0x0049ad4e | 40 18 3a 82 | 2 | 0x82 | 2 | 0x80 | 횃불세트 1000G 안산다 |
| story-prompt-1676 | 0x0049ad8a | 40 18 3a 83 | 2 | 0x83 | 3 | 0x80 | 고급한방약 1000G 안산다 |
| story-prompt-1676 | 0x0049ad8a | 40 18 3a 82 | 2 | 0x82 | 2 | 0x80 | 고급한방약 1000G 안산다 |
Common Stream Decode
system/menu display stream| VA | opcode | label | operand | raw |
|---|---|---|---|---|
0x004bfdb4 | 0x03 | set display/font row | - | 40 03 00 00 |
0x004bfdb8 | 0x08 | set display style triplet | - | 40 08 00 00 |
0x004bfdbc | 0x0d | set current context text id | 0x00030000 | 40 0d 00 00 00 00 03 00 |
0x004bfdc4 | 0x07 | set object fixed-point position | 0x000000f8 | 40 07 90 00 f8 00 00 00 |
0x004bfdcc | 0x15 | move text origin/cursor relative | 0x00000010 | 40 15 10 00 10 00 00 00 |
0x004bfdd4 | 0x37 | set global timer/state | - | 40 37 00 00 |
0x004bfdd8 | 0x1b | select script data bank | - | 40 1b 00 00 |
0x004bfddc | 0x0b | render current context text id | - | 40 0b 00 00 |
0x004bfde0 | 0x0a | return from event stream branch | - | 40 0a 00 00 |
0x004bfde4 | 0x03 | set display/font row | - | 40 03 00 00 |
0x004bfde8 | 0x08 | set display style triplet | - | 40 08 00 00 |
0x004bfdec | 0x0d | set current context text id | 0x0003002a | 40 0d 00 00 2a 00 03 00 |
0x004bfdf4 | 0x07 | set object fixed-point position | 0x00000118 | 40 07 f0 00 18 01 00 00 |
0x004bfdfc | 0x15 | move text origin/cursor relative | 0x00000010 | 40 15 10 00 10 00 00 00 |
0x004bfe04 | 0x04 | set display timer/state | - | 40 04 00 00 |
0x004bfe08 | 0x1b | select script data bank | - | 40 1b 00 00 |
0x004bfe0c | 0x0b | render current context text id | - | 40 0b 00 00 |
0x004bfe10 | 0x0a | return from event stream branch | - | 40 0a 00 00 |
Common Stream Text Lines
| VA | text |
|---|---|
0x004bfe4c | 처음부터 |
0x004bfe5e | 이어서하기 |
0x004bfe84 | 시나리오 선택 |
0x004bfea2 | 시나리오 |
0x004bfeb2 | 시나리오 |
0x004bfec2 | 시나리오 |
0x004bfed2 | 시나리오 |
0x004bfee2 | 시나리오 |
0x004bfef2 | 시나리오 |
0x004bff02 | 시나리오 |
0x004bff12 | 시나리오 |
0x004bff22 | 시나리오 체험판 |
0x004bff3c | 시나리오데모 |
0x004bff4e | 미니게임 |
0x004bff5e | 기타 |
0x004bff7a | 시나리오 |
0x004bff98 | 아타호의 집 |
0x004bffac | 되돌아감 |
0x004bffca | 시나리오 |
Global Reference Scan
| global | immediate VA | near bytes |
|---|---|---|
| choiceTargetGlobalRefs | 0x0040ba4f | 40 04 a3 a0 e2 59 00 8b 45 08 83 |
| choiceTargetGlobalRefs | 0x0040bb12 | 40 5c a1 a0 e2 59 00 8b 4d 08 89 |
| choiceTargetGlobalRefs | 0x0040bbc7 | 40 5c a1 a0 e2 59 00 8b 4d 08 89 |
| choiceLimitGlobalRefs | 0x0040ba9b | 40 06 a2 1e db 59 00 c6 05 1f db |
| choiceLimitGlobalRefs | 0x0040bac2 | 33 c0 a0 1e db 59 00 33 c9 8a 0d |
| randomGateSuccessCounterRefs | 0x0040baa1 | 00 c6 05 1f db 59 00 00 8b 45 08 |
| randomGateSuccessCounterRefs | 0x0040baca | c9 8a 0d 1f db 59 00 3b c1 0f 8e |
| randomGateSuccessCounterRefs | 0x0040bae2 | 00 c6 05 1f db 59 00 00 33 c0 a0 |
| randomGateSuccessCounterRefs | 0x0040bba3 | 00 c6 05 1f db 59 00 00 8b 45 08 |
| randomGateSuccessCounterRefs | 0x00433109 | 00 fe 05 1f db 59 00 5f 5e 5b c9 |
| choiceActiveFlagRefs | 0x0040b9bc | 33 c0 a0 49 77 45 00 85 c0 0f 84 |
| choiceActiveFlagRefs | 0x0040baea | 33 c0 a0 49 77 45 00 85 c0 0f 84 |
| choiceActiveFlagRefs | 0x0040bb79 | 33 c0 a0 49 77 45 00 85 c0 0f 84 |
| choiceActiveFlagRefs | 0x0041132b | 00 c6 05 49 77 45 00 01 c7 05 18 |
Remaining Proofs
다음 분석 대상- proof that the selected prompt trace dispatches through the script_handler_table 0x16/0x18 cluster, or proof that it does not
- exact producer instance that sets the selected option -> next prompt target for each displayed choice
- actual user choice cursor/confirm producer; 0x0059db1f is now excluded as a random-gate counter
- selected option -> next prompt edge for choice rows 10/15/19/22
- direct field scene execution proof for the selected prompt sequence
Source Artifacts
promptSequenceReview: out/scene_event_vm_prompt_sequence_review.jsondialogueBlocks: out/event_dialogue_blocks.jsonopcodeDictionary: out/scene_event_vm_opcode_dictionary.jsonscriptHandlerTable: out/script_handler_table.jsonsceneVmReference: docs/SCENE_EVENT_VM_REFERENCE.mdmap1Trace: out/map1_01a_scene_trace.jsonstoryFlowReview: out/story_flow_review.json