대화창 템플릿 / 텍스트 / 초상화 추적

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

판정

idstatusdecisionevidence
dialogue-window-regionsgroundedscreen 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-consumergroundedevent-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-availabilitygroundedface_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-indexblockeddo 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 후보

regionxywhresourcetemplatetwthrole
900352960x00090006622622-wide variable-height prompt/dialog window candidate
10003521120x00090007722722-wide variable-height prompt/dialog window candidate
11003521280x00090008822822-wide variable-height prompt/dialog window candidate
12003521440x00090009922922-wide variable-height prompt/dialog window candidate
13003521600x0009000a10221022-wide variable-height prompt/dialog window candidate

텍스트 출력 opcode

opcodehandlerrolelenoperandeffect
0x030x0041b7bbdisplay-state-opcode-grounded0x4stream byte at +2 selects context+0xde display/font rowcontext+0xde = stream u8+2; advance stream +4
0x080x0041b9a0display-style-opcode-groundedmode0=0x4/mode1=0x8stream byte +2 mode; mode0 uses table index byte +3 at 0x59daf0, mode1 uses immediate bytes +5/+6/+7write context+0xe0/+0xe2/+0xe4 from palette/style table or immediate RGB-like triplet
0x0b0x0041bb4ctext-source-opcode-grounded0x4inherited context+0x28push context+0x28; call 0x0041b579; copy context+0xce/0xd2 to cursor 0xd6/0xda; advance +4
0x0d0x0041bca4text-source-opcode-grounded0x8stream dword at +4context+0x28=stream dword+4; use low 16 bits as index into 0x55b134 to seed context+0xce/0xd2/0xd6/0xda; advance +8
0x0e0x0041bd4fcursor-relative-opcode-grounded0x8stream words at +2/+4 optionally offset current text origin unless 0xffff sentinelcontext+0xd6 = context+0xce + u16+2 when not 0xffff; context+0xda = context+0xd2 + u16+4 when not 0xffff; advance +8
0x150x0041d476cursor-origin-relative-opcode-grounded0x8stream words at +2/+4 optionally offset and update text origin unless 0xffff sentinelcontext+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'}

groupcontextrootpromptschoicesface recordsfield mapsresource sample
scene-text-group-001map1_01a21021map1_01amap_a1.cns, map_a2.cns, cara_at2.cns, face_01.cns, cara_etc.cns
scene-text-group-002map5_07h1001map5_07hmap_h1.cns, map_h2.cns, map_h3.cns, face_01.cns, cara_08.cns
scene-text-group-003map2_04l2631map2_04lmap_l1.cns, map_l2.cns, face_01.cns, cara_01.cns
scene-text-group-005selector 13:10x00444a444013310map5_14i, map5_13i, map5_11i, map5_12i, map5_15i, map5_16i, map5_17i, map5_18imap_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-006selector 4:10x0044aad0218159map3_09a, map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17hmap_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-008selector 22:00x00459dc4360114map7_09k, map7_10k, map7_11k, map7_12kmap_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-009selector 9:00x0045d7a0170156map2_01c, map2_13c, map2_03l, map4_01l, map4_09l, map4_08nmap_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-010selector 16:00x00468b18491712map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07hmap_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-011selector 19:10x004741c4252366map3_02f, map3_03h, map3_04h, map3_05h, map3_06h, map3_07hmap_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-012selector 1:00x004783644261710map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14jmap_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-013selector 12:00x0048458c160452map5_14i, map5_37imap_i1.cns, map_i2.cns, face_01.cns, cara_15.cns, map5_14i.cns, map5_37i.cns
scene-text-group-015selector 8:00x00494c343081912map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07hmap_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-016selector 15:00x004a4e9c5236map4_02f, map4_03h, map4_04h, map4_05h, map4_06h, map4_07hmap_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-017selector 18:00x004ac10c4124411map2_04l, map2_05e, map2_06e, map2_07e, map2_08e, map6_01e, map6_02e, map6_03emap_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-018selector 11:00x004c3e08140313map5_01f, map5_40f, map5_02h, map5_04h, map5_03h, map5_05h, map5_06h, map5_07hmap_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-019selector 3:10x004c9ab4173136map3_02f, map3_03h, map3_04h, map3_05h, map3_06h, map3_07hmap_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-022selector 21:00x004e23748223map6_10e, map7_01f, map7_05hmap_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-023selector 7:00x004e43884411map4_08nmap_n1.cns, map_n2.cns, face_01.cns, cara_07.cns, cara_etc.cns, map4_08n.cns
scene-text-group-024selector 14:00x004e62548733map4_01l, map4_09l, map4_08nmap_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-025selector 17:00x004f28a41941310map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14jmap_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-026selector 6:00x004f5ae834276map4_02f, map4_03h, map4_04h, map4_05h, map4_06h, map4_07hmap_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-028selector 48:90x005000002732map2_04l, map2_05emap_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-029selector 0:00x00501808161102map1_01a, map1_02bmap_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-036selector 5:00x0053294011714map7_05h, map4_01l, map4_09l, map4_08nmap_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-037selector 10:00x0053c4a4166410map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17h, map2_14jmap_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-038selector 2:00x005407142011111map1_01a, map2_02d, map2_18d, map2_09g, map2_10g, map2_11g, map2_12h, map2_17hmap_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-040selector 20:00x00557e681201013map6_12j, map6_13j, map6_14j, map6_15j, map6_16j, map6_17j, map6_18j, map6_19jmap_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 호출 지점

callsectionhintbytes
0x00406514.textmenu/window VM opcode area85 c9 0f 84 0a 00 00 00 6a 00 e8 60 50 01 00 83 c4 04 8b 45
0x0040653a.textmenu/window VM opcode area08 8b 40 40 66 0f b6 40 01 50 e8 3a 50 01 00 83 c4 04 8b 45
0x00414fc9.textunclassified text callsite4d fc 88 81 f2 00 00 00 6a 27 e8 ab 65 00 00 83 c4 04 8b 45
0x004150d2.textunclassified text callsite4d fc 88 81 f2 00 00 00 6a 28 e8 a2 64 00 00 83 c4 04 8b 45
0x0041bb59.textevent text render opcode 0x0b handler53 56 57 8b 45 08 8b 40 28 50 e8 1b fa ff ff 83 c4 04 8b 45

다음 타깃