
    UHj+b                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  Zh dZd	hZd
dddddddddddddddddddddddddddd d!d"dd#d$dd%ddd&d'd(d)d*d+d,ddd-d.d/dd0d1dd2d3d4d5dd6d7ddd8d9d:dd;d<ddd=d>d?dd@dAdddBdCdDddEdFdddGdHdIddJZg dKZdXdLZdYdMZdZdNZd[dOZ	 	 	 	 	 	 	 	 	 	 	 	 d\dPZ	 	 	 	 	 	 	 	 d]dQZd^dRZd_dSZd^dTZefd`dUZdadVZedWk(  r e        yy)bz9Summarize grounded event/object VM text opcode semantics.    )annotationsN)Path)Any   out>   0x0b0x0c0x0d0x02
0x0041b7bbzdisplay-state-opcode-grounded   0x4z7stream byte at +2 selects context+0xde display/font rowz-context+0xde = stream u8+2; advance stream +4zQdisplay state evidence only; browser replay does not execute full VM control flow)handlerVaHexsemanticStatusdecodedLengthdecodedLengthHexoperandLayouteffectpromotionImpact
0x0041b7edzdisplay-timer-opcode-groundedz$stream word at +2 seeds context+0xcaz@context+0xca = stream u16+2; context+0xcc = 0; advance stream +4zQdisplay/timer state evidence only; browser replay does not execute full VM timing
0x0041b8eezinput-wait-opcode-groundedzLno promoted text operand; waits on global 0x47f1d4 and input mask 0x0059e312zbtoggle press/release latch; set 0x55b280 stop flag; advance stream +4 only after release conditionzRdialogue wait evidence only; full browser event VM wait loop remains unimplemented
0x0041b956zobject-position-opcode-grounded   0x8z,stream words at +2/+4 become fixed-point x/yzWcontext+0x1c = stream u16+2 << 16; context+0x20 = stream u16+4 << 16; advance stream +8zQobject placement evidence only; route-linked event object execution still missing
0x0041b9a0zdisplay-style-opcode-groundedzmode0=0x4/mode1=0x8)mode0mode1zdstream byte +2 mode; mode0 uses table index byte +3 at 0x59daf0, mode1 uses immediate bytes +5/+6/+7zUwrite context+0xe0/+0xe2/+0xe4 from palette/style table or immediate RGB-like tripletzIdisplay style evidence only; variable-length VM execution remains partial)r   r   r   r   decodedLengthVariantsr   r   r   
0x0041bac6z!control-flow-call-opcode-groundedzGstream dword at +4 is branch target; stream+8 is pushed as continuationzcpush continuation pointer to context+0xb4 stack; increment context+0xc8; set stream to target dwordzUVM control-flow evidence only; browser replay does not follow original event branches
0x0041bb15z#control-flow-return-opcode-groundedz	stack-popzOno stream operand; pops continuation from context+0xb4 stack using context+0xc8zTdecrement context+0xc8; set stream to saved continuation pointer context+0xb4[index]z\VM control-flow evidence only; browser replay does not execute original call/return branches
0x0041bd4fzcursor-relative-opcode-groundedzRstream words at +2/+4 optionally offset current text origin unless 0xffff sentinelztcontext+0xd6 = context+0xce + u16+2 when not 0xffff; context+0xda = context+0xd2 + u16+4 when not 0xffff; advance +8zPcursor positioning evidence only; browser replay does not execute full layout VM
0x0041d476z&cursor-origin-relative-opcode-groundedzUstream words at +2/+4 optionally offset and update text origin unless 0xffff sentinelz_context+0xce/context+0xd6 and context+0xd2/context+0xda are moved by stream offsets; advance +8zKcursor origin evidence only; browser replay does not execute full layout VM
0x0041d89dz data-bank-select-opcode-groundedzUstream byte at +2 selects context+0xa8 backing table; mode 2 also uses stream byte +3zacontext+0xa8 becomes 0x59e310, 0x4576d8, 0x457750 + shaped index, or table 0x59db30[context+0xf2]zOstate-table selection evidence only; full object/script data VM remains partial
0x00420028zglobal-timer-opcode-groundedz-no stream operand; reads global byte 0x457745zBcontext+0xca = byte[0x457745]; context+0xcc = 0; advance stream +4zIglobal display/timer state evidence only; not event route execution proof)0x030x040x060x070x080x090x0a0x0e0x150x1b0x37)r   r   r
   0x35c                p    	 t        j                  | j                  d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError)pathdefaults     @/home/exedev/hwanse/tools/summarize_event_vm_opcode_semantics.py	load_jsonr<   y   s5    zz$..'.:;; s   $' 55c                t    t        | t        t        f      rt        j                  | dd      S t        |       S )NFT)ensure_ascii	sort_keys)
isinstancedictlistr5   dumpsstr)values    r;   
json_valuerF      s-    %$&zz%etDDu:    c                .    t        fd| D        i       S )Nc              3  L   K   | ]  }|j                  d       k(  s|  yw)	opcodeHexNget).0row
opcode_hexs     r;   	<genexpr>ztable_entry.<locals>.<genexpr>   s!     N377;+?:+MNs   $$)next)entriesrO   s    `r;   table_entryrS      s    NNPRSSrG   c                    | j                  d      xs g D ci c]%  }|j                  d      r|j                  d      |' c}S c c}w )NhandlerEffectsrJ   rK   )event_text_source_flowrN   s     r;   handler_effects_by_opcoderW      sO     *--.>?E277; 	c!  s   *Ac                   t        ||       }|j                  |       xs i }| dk(  r=| |j                  d      |j                  d      dd d ddd|j                  | d      d	d
dS | dk(  rE| |j                  d      xs d|j                  d      xs ddddddd|j                  | d      d	ddS | t        v rt        t        |          }| |j                  d      xs |d   |j                  d      xs d|d   |j                  d      |j                  d      |j                  d      |d   |d   d|d    d|j                  | d      d|d   d S |j                  d!      }| |j                  d      xs |j                  d      |j                  d      d"|t	        |t
              rd#|d$nd |j                  d%      |j                  d      d&|j                  | d      | d'v | d(k(  rd)dS d*dS )+Nr0   r   handlerSectionzliteral-storage-markerztCP949 text bytes are preserved as literalTextEvents from dialogue block storage; handler semantics are not promoted.zNstorage-indexed literal payload marker used by partial browser replay evidenceout/event_dialogue_blocks.jsonr   Tz4storage evidence only; not route-linked VM execution)rJ   r   rY   r   r   r   r   r   sourcecommandCountbrowserReplayEnabledr   r   
0x0041b771z.textzdisplay-cursor-opcode-groundedr   r   zZno promoted text id operand; updates cursor fields from current context and font-row tablezQcontext+0xd6=context+0xce; context+0xda += table[context+0xde]; advance stream +4zOHwanse2.exe handler 0x0041b771 plus out/event_dialogue_blocks.json storage scanz[supports partial dialogue cursor/separator trace only; route-linked execution still missingr   r   r   r   r   r   zHwanse2.exe handler z1 plus out/event_dialogue_blocks.json storage scanFr   )rJ   r   rY   r   r   r   r   r   r   r[   r\   r]   r   lengthztext-source-opcode-grounded0xxr[   out/event_text_source_flow.json>   r   r
   r	   zN0x0c route-linked hits are pointer overlap, so this opcode stays non-promotingzKsupports partial dialogue replay only; route-linked execution still missing)rS   rL   CONTROL_OPCODESrA   r@   int)	rO   event_entrieseffectscommand_countsdialogue_countsentryr   rN   decoded_lengths	            r;   opcode_semantic_rowrk      sQ    z2E[[$*FV#!IIn5#ii(896! $ Tf6+//
A>$(U
 	
 V#!IIn5E#ii(89DW> %yig+//
A>$(|
 	
 _$?:./#!IIn5L^9L#ii(89DW!"23 WW_5 #(: ;%(WW-D%E 1(m,S-@,AArs+//
A>$)"#45
 	
 ZZ)N

>2Oeii6O))$457'7A.RU7Vb 23\`H-**X&3&**:q9 *.> > V# ]  _ rG   c                f   | j                  d      xs i }| j                  d      xs g t        |      }|j                  d      xs i }|j                  d      xs i dD cg c]  }t        |||       }}|D cg c].  }|d   t        v r!t	        |j                  d      t
              r|0 }	}|j                  d      xs g }
|j                  d	      d
u xr t        |
      xr t        d |
D              }t        |j                  d      xs g D ch c]1  }|j                  d      xs i j                  d      xs g D ]  }| 3 c}}      }t        d |j                  d      xs g D              }t        |j                  d      xs g D ch c]1  }|j                  d      xs i j                  d      xs g D ]  }| 3 c}}      }t        d |j                  d      xs g D              }t        fdt        D              }|j                  d      d
u }i d	|d|j                  d      d|j                  d      d|j                  d      dt        t              dt        |	      d|	D ci c]  }|d   |d    c}dt        |	      t        t              k(  dt        d |	D              dt        t              dt        d  |D              d!|D ci c]5  }|d   t        v r(t	        |j                  d      t
              r	|d   |d   7 c}d"t        d#      j                  d$      d%k(  d&j                  d#d'      d(t        t              d)t        fd*t        j                         D              d+t        fd,t        j                         D              i d-|D ci c]5  }|d   t        v r(t	        |j                  d      t
              r	|d   |d   7 c}d.|D ci c]3  }|d   t        v r&|j                  d/      r|d   |j                  d/      5 c}d0t        D ci c]  }|j                  |d'       c}d1|d2|d3|d4|d5j                  d6d'      d'kD  d7t        d8 |j                  d      xs g D              d9|d:|j                  d:d'      d;|d<|d=|t        k(  d>||k(  xr |t        t              k(  xr |d'k(  d?d@dAd@d@d@dB}dCg dDdE|j                  d      |j                  dF      |j                  d      |j                  d      |t        |
      dG||||d   |d   |d"   |d+   |d>   |d5   |d9   |d=   d@d@d@d@dHg dIdJdK	S c c}w c c}w c c}}w c c}}w c c}w c c}w c c}w c c}w c c}w )LNeventHandlerTabletableEntriescommandCountsByOpcodecommandOpcodeCounts)r   r%   r&   r'   r(   r)   r*   r+   r   r	   r
   r,   r-   r.   r0   r/   rJ   r   dispatcherByteChecksdispatcherVerifiedTc              3  B   K   | ]  }|j                  d       du   yw)matchesTNrK   rM   rN   s     r;   rP   z build_summary.<locals>.<genexpr>  s     Hs	"d*Hs   blocksvmTraceimplementedOpcodesc              3  ~   K   | ]5  }t        |j                  d       xs i j                  d      xs d       7 yw)rw   groundedControlEventCountr   Nrd   rL   rM   blocks     r;   rP   z build_summary.<locals>.<genexpr>  s<      ' 	UYYy!'R,,-HINQO'   ;=groundedControlOpcodeSetc              3     K   | ]F  }|j                  d       xs i j                  d      xs g D ]  }|j                  d      du rd  H yw)rw   groundedControlEventsbrowserExecutesEffectTr   NrK   )rM   r}   events      r;   rP   z build_summary.<locals>.<genexpr>  s_      /yy+1r667NOUSU/ 99,-5 	
/	/s   AAc              3  T   K   | ]  }t        j                  |d              ! yw)r   Nr{   )rM   opcoderh   s     r;   rP   z build_summary.<locals>.<genexpr>  s+      ' 	O*+'s   %(opcode0cAllPointerOverlapdispatcherTableVaHex
tableVaHexdispatcherVaHexdispatchCallVaHextextSourceOpcodeCountdecodedTextSourceOpcodeCountdecodedTextSourceOpcodeLengthstextSourceOpcodeLengthsDecoded"textSourceOperandSemanticsGroundedc              3  d   K   | ](  }|j                  d       xr |j                  d       * yw)r   r   NrK   ru   s     r;   rP   z build_summary.<locals>.<genexpr>.  s,     1~eh#''(2C2`P_H`2`1~s   .0displayCursorOpcodeCountdecodedDisplayCursorOpcodeCountc              3  t   K   | ]0  }|d    t         v r#t        |j                  d      t              rd 2 yw)rJ   r   r   N)DISPLAY_CURSOR_OPCODESr@   rL   rd   ru   s     r;   rP   z build_summary.<locals>.<genexpr>0  s:      /
;#99jQ`Iacf>g /
s   68!decodedDisplayCursorOpcodeLengthsdisplayCursorOpcodeGroundedr   r   r^   displayCursorCommandCountr   controlOpcodeCountgroundedControlOpcodeCountc              3  j   K   | ]*  \  }}t        |      j                  d       |d    k(  rd , yw)r   r   NrS   rL   rM   r   rN   re   s      r;   rP   z build_summary.<locals>.<genexpr>=  s<      *
=&155nE^I\\ *
s   03controlOpcodeSemanticsGroundedc              3  f   K   | ](  \  }}t        |      j                  d       |d    k(   * yw)r   Nr   r   s      r;   rP   z build_summary.<locals>.<genexpr>B  s9      .
 v.22>Bc.FYY.
s   .1decodedControlOpcodeLengthsvariableLengthControlOpcodesr   controlOpcodeCommandCountsgroundedControlCommandCountrz   groundedControlEventOpcodeSet)groundedControlSampleEffectExecutionCountliteralStorageOpcodeObservedr0   literalStorageEventCountc              3  ~   K   | ]5  }t        |j                  d       xs i j                  d      xs d       7 yw)rw   literalTextEventCountr   Nr{   r|   s     r;   rP   z build_summary.<locals>.<genexpr>Y  s<      (
 9%+001HINQO(
r~   !opcode0cPointerOverlapNotPromotedrouteLinkedCommandCount$routeLinkedCommandsArePointerOverlapbrowserPartialReplayOpcodeSet(browserPartialReplayMatchesTextSemantics%browserGroundedControlEventsPreservedbrowserFullEventVmImplementedFrouteLinkedEventVmExecution)!fullInstructionLengthFullyDecodedfullOperandLayoutFullyDecodedzYGrounded text-related event/object VM opcode semantics from Hwanse2.exe handler evidence.)z,out/save_selector_branch_state_dispatch.jsonrb   rZ   z6text-opcode-semantics-grounded-route-execution-missing
entryCount)r   r   r   r   rr   byteCheckCount)eventObjectDispatcherVerifiedr   r   r   r   r   r   r   r   r   r   r   r   )zDDecode non-text event/object opcodes that appear in dialogue blocks.zMCapture route-linked event/object VM execution from a normal map interaction.zNBind scene event records to a dialogue block through executed VM control flow.an  Event/object VM dispatch is byte-table grounded, and text-source opcodes 0x0b, 0x0c, and 0x0d now have explicit length/operand/effect rows; opcode 0x02 also has a grounded cursor/separator length/effect row, and opcodes 0x03/0x04/0x06/0x07/0x08/0x09/0x0a/0x0e/0x15/0x1b/0x37 have handler-grounded display, wait, position, style, data-bank, and control-flow rows. This narrows the VM semantics gap without promoting route-linked event execution: the route-linked 0x0c hits remain pointer overlaps, 0x35 is literal storage evidence, browser replay remains partial, and full event VM instruction decoding is still incomplete.)	scoper[   promotionStatuseventObjectDispatcheropcodeSemanticscoveragechecksnextEvidenceNeeded
conclusion)rL   rW   rk   TEXT_SOURCE_OPCODESr@   rd   boolallsortedsumrc   lenr   rS   itemsPARTIAL_BROWSER_OPCODES)branch_state_dispatchrV   event_dialogue_blocksevent_tablerf   rg   r   opcode_rowsrN   decoded_text_rowsdispatcher_checksdispatcher_verifiedr}   browser_opcode_setgrounded_control_event_count!grounded_control_event_opcode_set$grounded_control_sample_effect_countcontrol_opcode_command_countopcode0c_pointer_overlapr   rh   re   s                       @@r;   build_summaryr      s   
 (++,?@FBK)--n=CM'(>?G+//0GHNBN+//0EFL"O
 	FM7NO\K . {22z#''/BZ\_7` 	 
 $(>?E2,-5 	I"#	IH6GHH 
  *..x8>B!		),2778LMSQS!  	!! 
 $' '*..x8>B' $  )/*..x8>B0		),2778RSYWY0  	00 )%
 ,/ /*..x8>B/ ,( $' '%' $   699:UVZ^^I1I =I 	;??+<=I 	[__-@A	I
 	 %8!9I 	',=(>I 	)(+
 c/22+
I 	)#.?*@CH[D\*\I 	-c1~l}1~.~I 	#C(>$?I 	*3 /
"/
 ,
I& 	,".
;#99jQ`Iacf>g c/22.
'I0 	&M6(J(N(N~(^bn(n1I2 	$_%8%8%C3I4 	c/25I6 	%c *
.446*
 '
7I@ 	)# .
.446.
 +
AIH 	&"(
;?2z#''/BZ\_7` c/22(
IIR 	'")
;?2sww?V7W cgg&=>>)
SI\ 	%)'
 O''22'
]Id 	&'CeIf 	$%AgIh 	()JiIj 	45YkIl 	'(;(;FA(F(JmIn 	#C (
.228<B(
 %
oIv 	,-EwIx 	"#9#=#=>WYZ#[yIz 	/0H{I| 	();}I~ 	34FJa4aI@ 	0(,HH :1VO5LL:49GIJ 	(KIL 	&uMIN .3).QIHV m

 T%//,7%//,7*/@A!,1D!E"5!"34"
 '-@.67W.X2:;_2`+34Q+R.67W.X5=>e5f,45S,T19:]1^8@Ak8l+0-216-2

O0 0G*!0.+
.
"(

)

'
s6   &V3V	6V
6V
V0:V:V$
8V)
	V.
c                   dd| d   dd| d    dddddd	g
}| d
   j                         D ]&  \  }}|j                  d| dt        |       d       ( |j                  g d       | d   D ]  }|j                  d|d    d|j	                  d      xs d d|d    d|j	                  d      xs d d|j	                  d      xs d d|j	                  d      xs d d|j	                  d       d|d    d        |j                  g d       | d   j                         D ]&  \  }}|j                  d| dt        |       d       ( |j                  g d       |j                  d  | d!   D               d"j                  |      d"z   S )#Nz# Event VM Opcode Semantics r   z- promotion status: `r   `z## Dispatcher| field | value || --- | --- |r   z| z | z |)r   z## Opcode Semanticsr   zk| opcode | handler | status | length | operand layout | command count | browser replay | promotion impact |z2| --- | --- | --- | --- | --- | ---: | --- | --- |r   z| `rJ   z` | `r   -z` | r   r   r   r\   r   r]   r   )r   z## Coverager   r   r   r   )r   z## Next Evidence Neededr   c              3  &   K   | ]	  }d |   yw)z- N rM   items     r;   rP   zmarkdown.<locals>.<genexpr>  s     G2dVGs   r   
)r   appendrF   extendrL   join)summarylineskeyrE   rN   s        r;   markdownr     s   %


(9 :;1=

E 56<<> 9
Ur#c*U"3!4B789	LL   () 
#k"#5)@)GC(HSQaMbLccfww)*1c2#cggo6N6URU5VVYww~&+!,C8N0O/PPSTWXiTjSkkmo	

 
LL   j)//1 9
Ur#c*U"3!4B789	LL  
 
LLG1E)FGG99Ud""rG   c                N    dj                  d | j                         D              S )Nr   c           	   3     K   | ]?  \  }}d t        j                  |       dt        j                  t        |             d A yw)z<tr><td>	</td><td>
</td></tr>N)htmlescaperF   )rM   r   rE   s      r;   rP   zhtml_table.<locals>.<genexpr>  sD      C 4;;s#$Idkk*U:K.L-MZXs   AA)r   r   )rowss    r;   
html_tabler     s&    99 **,  rG   c                v   dj                  d | d   D              }dj                  d | d   D              }dj                  dddd	d
dddddt        j                  | d          ddt        j                  | d          dddt        | d          dddd| dddt        | d          ddd| d d!d"d#g      S )$Nr   c              3    K   | ]7  }d t        j                  |d          dt        j                  |j                  d      xs d       dt        j                  |d          dt        j                  |j                  d      xs d       dt        j                  t        |j                  d	      xs d             dt        j                  t        |j                  d
      xs d             dt        j                  t        |j                  d                   dt        j                  |d          d : yw)z<tr><td><code>rJ   z</code></td><td><code>r   r   z</code></td><td>r   r   r   r   r\   r   r]   r   r   N)r   r   rL   rD   ru   s     r;   rP   zhtml_page.<locals>.<genexpr>  s&      	[[[!123 4[[!8!?C@A B{{3/012 3{{377#56=#>? @{{3sww7>3?@A B{{3sww~6;!<=> ?{{3sww'=>?@A B{{30123 4		s   D>E r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)r   r   r   s     r;   rP   zhtml_page.<locals>.<genexpr>  s#     etT$++d"3!4E:es   #%r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">z*  <title>Event VM Opcode Semantics</title>a    <style>body{font-family:system-ui,sans-serif;margin:24px;line-height:1.45;max-width:1200px}table{border-collapse:collapse;width:100%;margin:16px 0}td,th{border:1px solid #ddd;padding:6px 8px;text-align:left;vertical-align:top}th{background:#f5f5f5}code{white-space:nowrap}</style>z</head>z<body>z$  <h1>Event VM Opcode Semantics</h1>z  <p>r   z</p>z$  <p><b>Promotion status:</b> <code>r   z</code></p>z  <h2>Dispatcher</h2>zD  <table><thead><tr><th>field</th><th>value</th></tr></thead><tbody>r   z</tbody></table>z  <h2>Opcode Semantics</h2>z  <table><thead><tr><th>opcode</th><th>handler</th><th>status</th><th>length</th><th>operand layout</th><th>commands</th><th>browser replay</th><th>promotion impact</th></tr></thead>z	  <tbody>z  <h2>Coverage</h2>r   z  <h2>Next Evidence Needed</h2>z  <ul>z</ul>z</body>z</html>r   )r   r   r   r   )r   r   
next_itemss      r;   	html_pager     s   ))  ,- K ewOcGdeeJ99"4 	e.
GL12348
.t{{7CT;U/V.WWbc
NzZabyZzO{N|  }M  	N% 	A
K= 01
NzZablZmOnNoo  	A)
E"
/  rG   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okzevent_vm_opcode_semantics.jsonF   )r>   indentr   r2   r3   event_vm_opcode_semantics.html)mkdir
write_textr5   rC   r   )r   out_dirs     r;   write_outputsr     sd    MM$M.//;;

7q9D@ <  //;;Ig<NY`;arG   c                    t        j                  t              } | j                  dt        t
               | j                         }t        t        |j                  dz  i       t        |j                  dz  i       t        |j                  dz  i             }t        ||j                         t        d|j                  dz          y )	N)descriptionz	--out-dir)typer:   z(save_selector_branch_state_dispatch.jsonzevent_text_source_flow.jsonzevent_dialogue_blocks.jsonz#wrote event VM opcode semantics -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r<   r   r   print)parserargsr   s      r;   mainr	    s    $$9F
$<D$,,!KKRP$,,!>>C$,,!==rBG
 '4<<(	/?_0_/`
abrG   __main__)r9   r   r:   r   returnr   )rE   r   r  rD   )rR   
list[dict]rO   rD   r  rA   )rV   rA   r  dict[str, dict])rO   rD   re   r  rf   r  rg   rA   rh   rA   r  rA   )r   rA   rV   rA   r   rA   r  rA   )r   rA   r  rD   )r   rA   r  rD   )r   rA   r   r   r  None)r  r  )r  
__future__r   r   r   r5   pathlibr   typingr   __file__resolver   ROOTr  r   r   rc   r   r<   rF   rS   rW   rk   r   r   r   r   r   r	  __name__r   rG   r;   <module>r     s`   ? "      H~''*
Ul.    %9!RAn %9!?Tn %6!gvo %;!Gkn %91+,q!9if	 %=!bwr %?'jhy %;!m Im %B!psh %<!pul %8!HVfyeL ; TJJJ J 	J
 J 
JZ}} }  } 
	}@+#\'T 25 b
c zF rG   