대화창 템플릿 / 텍스트 / 초상화 추적
Dialogue window templates and text rendering opcodes are grounded, and face_01.cns is available in most scene resource packages. A direct consumer that chooses a portrait frame for a speaker is still not proven.
5dialogue regions
27/40face scene groups
5face data refs
5region draw calls
판정
| id | status | decision | evidence |
|---|---|---|---|
| dialogue-window-regions | grounded | screen regions #9..#13 bind to window.cns templates #6..#10, all 22 tiles wide and 6..10 tiles tall. | 0x004548b0 region RECT table + 0x00454b60 resource/template table. |
| text-render-consumer | grounded | event-object opcode 0x0d sets context+0x28 text source; opcode 0x0b passes context+0x28 to 0x0041b579. | scene_event_vm_opcode_dictionary and event_handler_text_refs. |
| face-resource-availability | grounded | face_01.cns is repeatedly present in scene resource packages, so portrait assets are available during dialogue-heavy scenes. | 27/40 scene text groups include face_01.cns. |
| speaker-to-portrait-index | blocked | do not infer portrait frame from speaker text alone. The frame selector/draw consumer is still missing. | No direct .text reference to the face_01.cns string pointer; current refs are data/package refs. |
대화창 region 후보
| region | x | y | w | h | resource | template | tw | th | role |
|---|---|---|---|---|---|---|---|---|---|
| 9 | 0 | 0 | 352 | 96 | 0x00090006 | 6 | 22 | 6 | 22-wide variable-height prompt/dialog window candidate |
| 10 | 0 | 0 | 352 | 112 | 0x00090007 | 7 | 22 | 7 | 22-wide variable-height prompt/dialog window candidate |
| 11 | 0 | 0 | 352 | 128 | 0x00090008 | 8 | 22 | 8 | 22-wide variable-height prompt/dialog window candidate |
| 12 | 0 | 0 | 352 | 144 | 0x00090009 | 9 | 22 | 9 | 22-wide variable-height prompt/dialog window candidate |
| 13 | 0 | 0 | 352 | 160 | 0x0009000a | 10 | 22 | 10 | 22-wide variable-height prompt/dialog window candidate |
텍스트 출력 opcode
| opcode | handler | role | len | operand | effect |
|---|---|---|---|---|---|
| 0x03 | 0x0041b7bb | display-state-opcode-grounded | 0x4 | stream byte at +2 selects context+0xde display/font row | context+0xde = stream u8+2; advance stream +4 |
| 0x08 | 0x0041b9a0 | display-style-opcode-grounded | mode0=0x4/mode1=0x8 | stream byte +2 mode; mode0 uses table index byte +3 at 0x59daf0, mode1 uses immediate bytes +5/+6/+7 | write context+0xe0/+0xe2/+0xe4 from palette/style table or immediate RGB-like triplet |
| 0x0b | 0x0041bb4c | text-source-opcode-grounded | 0x4 | inherited context+0x28 | push context+0x28; call 0x0041b579; copy context+0xce/0xd2 to cursor 0xd6/0xda; advance +4 |
| 0x0d | 0x0041bca4 | text-source-opcode-grounded | 0x8 | stream dword at +4 | context+0x28=stream dword+4; use low 16 bits as index into 0x55b134 to seed context+0xce/0xd2/0xd6/0xda; advance +8 |
| 0x0e | 0x0041bd4f | cursor-relative-opcode-grounded | 0x8 | stream words at +2/+4 optionally offset current text origin unless 0xffff sentinel | context+0xd6 = context+0xce + u16+2 when not 0xffff; context+0xda = context+0xd2 + u16+4 when not 0xffff; advance +8 |
| 0x15 | 0x0041d476 | cursor-origin-relative-opcode-grounded | 0x8 | stream words at +2/+4 optionally offset and update text origin unless 0xffff sentinel | context+0xce/context+0xd6 and context+0xd2/context+0xda are moved by stream offsets; advance +8 |
face_01.cns
0x0043c125 · refs 5 · {'.data': 5}
frame hint: {'sourceX': 0, 'sourceY': 0, 'sourceWidth': 80, 'sourceHeight': 80, 'columns': 8, 'rows': 2, 'frameCount': 16, 'inference': 'review-initial-grid-face-80', 'confidence': 'medium'}
| group | context | root | prompts | choices | face records | field maps | resource sample |
|---|---|---|---|---|---|---|---|
| scene-text-group-001 | map1_01a | 210 | 2 | 1 | map1_01a | map_a1.cns, map_a2.cns, cara_at2.cns, face_01.cns, cara_etc.cns | |
| scene-text-group-002 | map5_07h | 10 | 0 | 1 | map5_07h | map_h1.cns, map_h2.cns, map_h3.cns, face_01.cns, cara_08.cns | |
| scene-text-group-003 | map2_04l | 26 | 3 | 1 | map2_04l | map_l1.cns, map_l2.cns, face_01.cns, cara_01.cns | |
| scene-text-group-005 | selector 13:1 | 0x00444a44 | 401 | 33 | 10 | map5_14i, map5_13i, map5_11i, map5_12i, map5_15i, map5_16i, map5_17i, map5_18i | map_i1.cns, map_i2.cns, face_01.cns, cara_15.cns, cara_08.cns, map5_14i.cns, map_i3.cns, cara_sm1.cns, cara_09.cns, map5_13i.cns, map5_11i.cns, cara_03.cns |
| scene-text-group-006 | selector 4:1 | 0x0044aad0 | 218 | 15 | 9 | map3_09a, map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h | map_a1.cns, map_a2.cns, face_01.cns, cara_etc.cns, map3_09a.cns, map_d1.cns, map_d2.cns, map_d3.cns, cara_01.cns, cara_03.cns, map2_02d.cns, map2_18d.cns |
| scene-text-group-008 | selector 22:0 | 0x00459dc4 | 360 | 11 | 4 | map7_09k, map7_10k, map7_11k, map7_12k | map_k1.cns, map_k2.cns, cara_at2.cns, cara_sm2.cns, face_01.cns, cara_03.cns, cara_05.cns, cara_etc.cns, map7_09k.cns, cara_12.cns, map7_10k.cns, cara_17.cns |
| scene-text-group-009 | selector 9:0 | 0x0045d7a0 | 170 | 15 | 6 | map2_01c, map2_13c, map2_03l, map4_01l, map4_09l, map4_08n | map_c1.cns, map_c2.cns, cara_sm2.cns, face_01.cns, map2_01c.cns, map2_13c.cns, map_l1.cns, map_l2.cns, map2_03l.cns, cara_12.cns, spot.cns, map4_01l.cns |
| scene-text-group-010 | selector 16:0 | 0x00468b18 | 491 | 7 | 12 | map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_03.cns, cara_08.cns, cara_07.cns, cara_etc.cns, map5_01f.cns, map5_40f.cns, map_h1.cns, map_h2.cns |
| scene-text-group-011 | selector 19:1 | 0x004741c4 | 252 | 36 | 6 | map3_02f, map3_03h, map3_04h, map3_05h, map3_06h, map3_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_04.cns, map3_02f.cns, map_h1.cns, map_h2.cns, map3_03h.cns, cara_17.cns, map3_04h.cns, cara_etc.cns |
| scene-text-group-012 | selector 1:0 | 0x00478364 | 426 | 17 | 10 | map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14j | map_d1.cns, map_d2.cns, map_d3.cns, face_01.cns, cara_01.cns, cara_03.cns, cara_10.cns, map2_02d.cns, map2_18d.cns, cara_at2.cns, cara_05.cns, cara_etc.cns |
| scene-text-group-013 | selector 12:0 | 0x0048458c | 160 | 45 | 2 | map5_14i, map5_37i | map_i1.cns, map_i2.cns, face_01.cns, cara_15.cns, map5_14i.cns, map5_37i.cns |
| scene-text-group-015 | selector 8:0 | 0x00494c34 | 308 | 19 | 12 | map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_03.cns, cara_08.cns, cara_07.cns, cara_etc.cns, map5_01f.cns, map5_40f.cns, map_h1.cns, map_h2.cns |
| scene-text-group-016 | selector 15:0 | 0x004a4e9c | 52 | 3 | 6 | map4_02f, map4_03h, map4_04h, map4_05h, map4_06h, map4_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_03.cns, cara_01.cns, map4_02f.cns, map_h1.cns, map_h2.cns, map4_03h.cns, map4_04h.cns, map_h3.cns |
| scene-text-group-017 | selector 18:0 | 0x004ac10c | 412 | 44 | 11 | map2_04l, map2_05e, map2_06e, map2_07e, map2_08e, map6_01e, map6_02e, map6_03e | map_l1.cns, map_l2.cns, face_01.cns, cara_01.cns, cara_lst.cns, map2_04l.cns, map_e1.cns, map_e2.cns, map2_05e.cns, map_e3.cns, map2_06e.cns, cara_sm2.cns |
| scene-text-group-018 | selector 11:0 | 0x004c3e08 | 140 | 3 | 13 | map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_03.cns, cara_08.cns, cara_07.cns, cara_etc.cns, map5_01f.cns, map5_40f.cns, map_h1.cns, map_h2.cns |
| scene-text-group-019 | selector 3:1 | 0x004c9ab4 | 173 | 13 | 6 | map3_02f, map3_03h, map3_04h, map3_05h, map3_06h, map3_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_04.cns, map3_02f.cns, map_h1.cns, map_h2.cns, map3_03h.cns, map3_04h.cns, map3_05h.cns, map_h3.cns |
| scene-text-group-022 | selector 21:0 | 0x004e2374 | 82 | 2 | 3 | map6_10e, map7_01f, map7_05h | map_e1.cns, map_e2.cns, face_01.cns, cara_17.cns, cara_25.cns, cara_etc.cns, p_wb.cns, map6_10e.cns, map_f1.cns, map_f2.cns, cara_03.cns, map7_01f.cns |
| scene-text-group-023 | selector 7:0 | 0x004e4388 | 44 | 1 | 1 | map4_08n | map_n1.cns, map_n2.cns, face_01.cns, cara_07.cns, cara_etc.cns, map4_08n.cns |
| scene-text-group-024 | selector 14:0 | 0x004e6254 | 87 | 3 | 3 | map4_01l, map4_09l, map4_08n | map_l1.cns, map_l2.cns, btl_rs.cns, face_01.cns, cara_12.cns, btl_efc.cns, map4_01l.cns, map4_09l.cns, map_n1.cns, map_n2.cns, cara_07.cns, cara_etc.cns |
| scene-text-group-025 | selector 17:0 | 0x004f28a4 | 194 | 13 | 10 | map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14j | map_d1.cns, map_d2.cns, map_d3.cns, cara_sm1.cns, face_01.cns, cara_01.cns, cara_03.cns, map2_02d.cns, map2_18d.cns, map_g1.cns, map_g2.cns, map_g3.cns |
| scene-text-group-026 | selector 6:0 | 0x004f5ae8 | 342 | 7 | 6 | map4_02f, map4_03h, map4_04h, map4_05h, map4_06h, map4_07h | map_f1.cns, map_f2.cns, map_f3.cns, face_01.cns, cara_03.cns, cara_01.cns, map4_02f.cns, map_h1.cns, map_h2.cns, map4_03h.cns, cara_at2.cns, cara_rs2.cns |
| scene-text-group-028 | selector 48:9 | 0x00500000 | 27 | 3 | 2 | map2_04l, map2_05e | map_l1.cns, map_l2.cns, face_01.cns, cara_01.cns, map2_04l.cns, map_e1.cns, map_e2.cns, map2_05e.cns |
| scene-text-group-029 | selector 0:0 | 0x00501808 | 161 | 10 | 2 | map1_01a, map1_02b | map_a1.cns, map_a2.cns, cara_at2.cns, face_01.cns, cara_01.cns, cara_etc.cns, map1_01a.cns, map_b1.cns, map_b2.cns, map_b3.cns, cara_02.cns, cara_efc.cns |
| scene-text-group-036 | selector 5:0 | 0x00532940 | 117 | 1 | 4 | map7_05h, map4_01l, map4_09l, map4_08n | map_h1.cns, map_h2.cns, face_01.cns, cara_17.cns, cara_05.cns, map7_05h.cns, map_l1.cns, map_l2.cns, map4_01l.cns, map4_09l.cns, map_n1.cns, map_n2.cns |
| scene-text-group-037 | selector 10:0 | 0x0053c4a4 | 166 | 4 | 10 | map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14j | map_d1.cns, map_d2.cns, map_d3.cns, face_01.cns, cara_01.cns, cara_03.cns, map2_02d.cns, map2_18d.cns, map_g1.cns, map_g2.cns, map_g3.cns, cara_10.cns |
| scene-text-group-038 | selector 2:0 | 0x00540714 | 201 | 11 | 11 | map1_01a, map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h | map_a1.cns, map_a2.cns, face_01.cns, cara_01.cns, cara_05.cns, cara_etc.cns, map1_01a.cns, map_d1.cns, map_d2.cns, map_d3.cns, cara_03.cns, map2_02d.cns |
| scene-text-group-040 | selector 20:0 | 0x00557e68 | 120 | 10 | 13 | map6_12j, map6_13j, map6_14j, map6_15j, map6_16j, map6_17j, map6_18j, map6_19j | map_j1.cns, map_j2.cns, face_01.cns, cara_etc.cns, map6_12j.cns, map6_13j.cns, map_j3.cns, map6_14j.cns, map6_15j.cns, map6_16j.cns, map6_17j.cns, map6_18j.cns |
화자 이름 분포
텍스트 첫 줄이 초상화 선택을 직접 증명하지는 않는다. 다만 face selector 후보를 찾을 때 대조 표본으로 쓴다.
{
"source": "out/story_prompts.html",
"speakerCounts": {
"아타호": 810,
"스마슈": 565,
"린샹": 473,
"백호권 사범": 71,
"권법가": 64,
"노인": 52,
"간호사": 47,
"사범": 46,
"알리바바": 46,
"상점주인": 43,
"술집 주인": 39,
"목소리": 35,
"대회주최자": 34,
"관광객": 34,
"사내": 31,
"암각권 총통": 29,
"고양이귀 여권사": 29,
"해골": 28,
"행상인": 26,
"페톰": 25
},
"mainHeroSpeakerCounts": {
"아타호": 810,
"린샹": 473,
"스마슈": 565
},
"speakerCount": 126
}
0x0041b579 호출 지점
| call | section | hint | bytes |
|---|---|---|---|
| 0x00406514 | .text | menu/window VM opcode area | 85 c9 0f 84 0a 00 00 00 6a 00 e8 60 50 01 00 83 c4 04 8b 45 |
| 0x0040653a | .text | menu/window VM opcode area | 08 8b 40 40 66 0f b6 40 01 50 e8 3a 50 01 00 83 c4 04 8b 45 |
| 0x00414fc9 | .text | unclassified text callsite | 4d fc 88 81 f2 00 00 00 6a 27 e8 ab 65 00 00 83 c4 04 8b 45 |
| 0x004150d2 | .text | unclassified text callsite | 4d fc 88 81 f2 00 00 00 6a 28 e8 a2 64 00 00 83 c4 04 8b 45 |
| 0x0041bb59 | .text | event text render opcode 0x0b handler | 53 56 57 8b 45 08 8b 40 28 50 e8 1b fa ff ff 83 c4 04 8b 45 |
다음 타깃
- Search for a draw path that uses face_01 resource id/frame index, not just the string/package record.
- Inspect script bytes near opcode 0x0d/0x0b clusters for preceding style/window/portrait opcodes.
- Compare prompts whose first line is 아타호/린샹/스마슈 against nearby command bytes to find a portrait selector pattern.