
    UHj.-                    |   d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZmZ  ee      j+                         j,                  d	   Zed
z  ZddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZ	 d	 	 	 	 	 	 	 	 	 ddZd dZ d!dZ!d!dZ"efd"dZ#d#dZ$e%dk(  r e$        yy)$z;Summarize Korean text refs inside event/object VM handlers.    )annotationsN)Counterdefaultdict)Path)direct_text_calls)read_sectionsva_to_offset)classify_caller
text_index   outc                    d| dS )N0x08x )values    >/home/exedev/hwanse/tools/summarize_event_handler_text_refs.pyhex32r      s    c{    c                L    t        j                  | j                  d            S )Nutf-8encoding)jsonloads	read_text)paths    r   	load_jsonr      s    ::dnngn677r   c           	     .   i }| j                  d      xs g D ]  }|j                  d      dk7  s|j                  d      s)t        |d   d      }|j                  |||d   g g d      }|d   j                  |d          |d	   j                  |d
           t	        |j                         d       }t        |      D ]Q  \  }}|dz   t        |      k  r||dz      d   n|d   dz   }||d<   t        |      |d<   t        d||d   z
        |d<   S |S )NtableEntrieshandlerSectionz.texthandlerVaHex   )	handlerVar"   opcodesentryVaHexesr%   	opcodeHexr&   
entryVaHexc                    | d   S )Nr$   r   )rows    r   <lambda>z handler_ranges.<locals>.<lambda>+   s    C4D r   )keyr   r$   i   endVaendVaHexr   	byteCount)
getint
setdefaultappendsortedvalues	enumeratelenr   max)dispatch_summarygroupedentry
handler_var*   rowsindexend_vas           r   handler_rangesr@      sD   !G!%%n5; 899%&'1>9R~.3
  #!.1	.
  	IeK01N""5#678 '.."(DEDo =
s16SY1Feai-CP[L\_dLdG-Jq&3{+;";<K	=
 Kr   c                   t        ||      }t        ||      }||||k  rg g dfS | || }g }	g }
t               }t               }t        dt        dt	        |      dz
              D ]  }t        j                  d||      d   }||z   }||v rD||f|vr>|j                  ||f       |	j                  t        |      t        |      d||          |D ]t  }|d   |cxk  r	|d   k  sn ||d   f|vs"|j                  ||d   f       |
j                  t        |      t        |      |d	   |d
   |d   |d   |d   d d d       v  |	|
|d d j                  d      fS )N r      z<I)refVaHexvalueHexmatchStartVa
matchEndVastartVa
startVaHexr.   
entryCountclassificationCountssampleTexts   )rD   rE   clusterStartVaHexclusterEndVaHexrJ   rK   rL       )r	   setranger8   r7   structunpack_fromaddr3   r   hex)exesectionsstart_var?   textsclusters	start_offend_offdata	text_refs
table_refs	seen_text
seen_tabler>   r   ref_vaclusters                    r   scan_range_refsrf   4   s    Xx0I8V,GGOw)/C2rzy!DIJIJq#aTQ/0 ""4u5a8E!E>vuoY>MM65/*!&M!%L , 
   	G~&%H7<3HHfV]^gVhMiq{M{	(:;<!! %f %e)0)>'.z':"),"7,34J,K#*=#9"1#=# 	, j$t*.."555r   c                0    t        | |      }|dk7  r|S |ryy)Nunclassifiedztext-routine-runtime-source)r
   )r`   ra   text_routine_callsclassifications       r   classify_handlerrk   ^   s%    $Y
;N',r   c                    g }| D ]#  }|j                  |j                  dd             % |D ]&  }|j                  |j                  d      xs g        ( dj                  |d d       xs dS )NtextrB   rL   , rM   -)r3   r0   extendjoin)r`   ra   samplesrefs       r   sample_textrt   g   sp    G ,swwvr*+, 5sww}-34599WRa[!(S(r   c                   t        |       }t        |      \  }}|j                  d      xs g D ch c]"  }|j                  d      rt        |d   d      $ }}t	        | ||      \  }	}
g }t        |      D ]  }|d   }|d   }|	D cg c]  }||d   cxk  r|k  sn n| }}|D cg c]  }|d   |v s| }}t        | |||||      \  }}}|s|s|s`t        d |D              }|j                  i |t        |||      t        |      |d d	 t        |      |d d	 t        |      |d d	 t        t        |j                                     |t        ||      d

        t        d |D              }t        d |D              }dt        t        |            t        |      ||
t        t        |j                                     d|dS c c}w c c}w c c}w )NtextRoutineCandidatestargetVaHexr#   r$   r-   callVatargetVac              3  &   K   | ]	  }|d      yw)rw   Nr   .0calls     r   	<genexpr>z build_summary.<locals>.<genexpr>   s     $RTT-%8$R      )
rj   textRoutineCallCounttextRoutineCallsdirectTextRefCountdirectTextRefstextTableRefCounttextTableRefsdirectCallTargetCounts	codeBytesrr   c              3  &   K   | ]	  }|d      yw)rj   Nr   r|   r*   s     r   r~   z build_summary.<locals>.<genexpr>   s     AS3/0Ar   c              3  ,   K   | ]  }|d    s	d  yw)r   r   Nr   r   s     r   r~   z build_summary.<locals>.<genexpr>   s     &XSC@V<Wq&Xs   
zaevent/object VM handlers cross-checked against executable Korean text refs and text routine callsaJ  The event/object VM table has one handler with a direct call to a known Korean text routine candidate (opcode 0x0b -> 0x0041b579), but that handler has no local static Korean text/table reference. Other matched handlers reference item/action text tables. No story-dialogue handler has been proven from these static handler bodies.)scopehandlerCountmatchedHandlerCountdirectTextRoutineHandlerCountdirectTextCallScanMethodrK   
conclusionr=   )r   r   r0   r1   r   r@   rf   r   r3   rk   r7   dictr4   itemsrt   sum)rX   korean_summaryr9   exe_pathrY   r[   r\   r*   routine_targets
text_callscall_scan_methodr=   handlerstartendr}   direct_callsri   r`   ra   
code_bytescall_target_countsclass_countsdirect_text_routine_handlerss                           r   build_summaryr   p   s!    S!H 0OE8 "%%&=>D"77=! 	C#O 
 $5S(H#M J D!"23 $g)3UuX7TQT7TUU/;cttJ?OSb?bdcc,;C5RUW\^f,g)	:z!)J$$R\$RR 

.y*FXY$'(:$; 23B 7"%i.'n!$Z'_&*62D2J2J2L+M&N#"9j9
 	, ADAAL#&&XD&X#X tN+;<="4y)E$4 $VL,>,>,@%A B+
  ? Vcs   'GGG)G6Gc                d    | j                  d      xs g }dj                  d |D              xs dS )Nr   rn   c              3  6   K   | ]  }|d     d|d      yw)	callVaHexz->rw   Nr   r{   s     r   r~   zcall_summary.<locals>.<genexpr>   s'     Ut[)*"T--@,ABUs   ro   )r0   rq   )r*   callss     r   call_summaryr      s1    GG&'-2E99UuUU\Y\\r   c                   dd| d   dd| d    d| d    d| d	    d
| j                  dd       dt        j                  | j                  d      xs i d       dddg}| j                  d      xs g D ]  }dj                  d t	        |j                  d      xs i j                               d d D              xs d}|d   j                  dd      }|j                  ddj                  d |d   D               d|d    d |d!    d"|d#    d$t        |       d$|d%    d$|d&    d$| d$| d'        | j                  d      s|j                  d(       d)j                  |      d)z   S )*Nz# Event Handler Text ReferencesrB   r   z- scanned handlers: r   z- matched handlers: r   z - direct text-routine handlers: r   z- direct call scan: r   ro   z- classes: rK   F)ensure_asciizl| opcodes | handler range | class | text routine calls | direct text | table refs | samples | call targets |z3| --- | --- | --- | --- | ---: | ---: | --- | --- |r=   rn   c              3  0   K   | ]  \  }}| d |   yw:Nr   r|   targetcounts      r   r~   zmarkdown.<locals>.<genexpr>   '      
 haw
   r   rM   rr   |z\|z| c              3  (   K   | ]
  }d | d   yw)`Nr   )r|   opcodes     r   r~   zmarkdown.<locals>.<genexpr>   s     FVQvha=Fs   r%   z | `r"   ..r.   z` | rj   z | r   r   z |z!| - | - | - | - | - | - | - | - |
)	r0   r   dumpsrq   r4   r   replacer3   r   )summarylinesr*   targetsrr   s        r   markdownr      s   )


w~678
w'<=>?
*73R+S*TU
w{{+EsKLM
djj-C!D!JY^_`a
v=E {{6"(b 
)) 
!'1I)J)Pb(W(W(Y!Z[]\]!^
 
   	 i.((e4Fs9~FFG HN#$Bs:&7tC@P<Q;RRUC !S)=%>$?s3GZC[B\\_is7)2'	

 ;;v8999Ud""r   c                   g }| j                  d      xs g D ]+  }dj                  d t        |j                  d      xs i j                               d d D              xs d}|j	                  dt        j                  dj                  |d                d	t        j                  |d
          dt        j                  |d          dt        j                  |d          dt        j                  t        |             d|d    d|d    dt        j                  |d          dt        j                  |       d       . dj                  |      xs d}dj                  dddddddddd d!t        j                  | d"          d#d$| d%    d&| d'    d(| d)    d*t        j                  | j                  d+d             d,	d-d.| d/d0d1dg      S )2Nr=   rn   c              3  0   K   | ]  \  }}| d |   ywr   r   r   s      r   r~   zhtml_page.<locals>.<genexpr>   r   r   r   rM   ro   z<tr><td>r%   z</td><td><code>r"   r   r.   z</code></td><td>rj   z	</td><td>r   r   rr   z
</td></tr>rB   z2<tr><td colspan="8">No matched handlers.</td></tr>r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z.  <title>Event Handler Text References</title>z  <style>body{font-family:system-ui,sans-serif;background:#101010;color:#eee;margin:24px}table{border-collapse:collapse;width:100%}td,th{border:1px solid #333;padding:6px 8px;vertical-align:top}th{background:#1d1d1d}code{color:#f5d76e}</style>z</head>z<body>z(  <h1>Event Handler Text References</h1>z  <p>r   z</p>z  <p>Scanned handlers: r   z; matched: r   z ; direct text-routine handlers: r   z; direct call scan: r   z.</p>z  <table><thead><tr><th>opcodes</th><th>handler range</th><th>class</th><th>text routine calls</th><th>direct text</th><th>table refs</th><th>samples</th><th>call targets</th></tr></thead>z	  <tbody>z</tbody></table>z</body>z</html>)r0   rq   r4   r   r3   htmlescaper   )r   r=   r*   r   	body_rowss        r   	html_pager      s4   D{{6"(b 
)) 
!'1I)J)Pb(W(W(Y!Z[]\]!^
 
   	 	;;tyyY89: ;S%89:"T[[Z=Y<Z [;;s#3456 7;;|C012 3+,- .*+, -;;s9~./ 0;;w'( )		

" U!UI99"P8 	~2
GL12348
!'."9!:+gNcFdEe f))01P)Q(R S![[5OQT)UVWW\	^ 	G
I;./
'  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okevent_handler_text_refs.jsonF   )r   indentr   r   r   )mkdir
write_textr   r   )r   out_dirs     r   write_outputsr      sC    MM$M.--99

7q9D@ : r   c                 Z   t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        |j                  j                         t        |j                        t        |j                        |j                        }t        ||j                         t        d	|j                  d
z   d|d    d       y )Nz--exezHwanse2.exe)typedefaultz--korean-textzkorean_text_candidates.jsonz
--dispatchz(save_selector_branch_state_dispatch.jsonz	--out-dirz!wrote event handler text refs -> r   z (r   z
 handlers))argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   rX   
read_bytesr   korean_textdispatchr   r   print)parserargsr   s      r   mainr      s   $$&F
dD=4HI
dCB_<_`
4?i9ij
$<D$""#$-- 	G '4<<(	+<<88
9 :)*+:	7r   __main__)r   r1   returnstr)r   r   )r9   r   r   
list[dict])rX   bytesrY   r   rZ   r1   r?   r1   r[   zdict[int, dict]r\   r   r   z"tuple[list[dict], list[dict], str])r`   r   ra   r   ri   r   r   r   )r`   r   ra   r   r   r   )N)
rX   r   r   r   r9   r   r   zPath | Noner   r   )r*   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )&__doc__
__future__r   r   r   r   rT   collectionsr   r   pathlibr   exe_call_scannerr   probe_exe_scene_tablesr   r	   summarize_text_routine_callersr
   r   __file__resolver   r   r   r   r   r@   rf   rk   rt   r   r   r   r   r   r   __name__r   r   r   <module>r      s   A "     ,  . > F H~''*
Ul8.'6	'6'6 '6 	'6
 '6 '6 ('6T) !	5	55 5 	5
 
5p]
#@(V 25 * zF r   