
    Jjm0                    ,   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ZddlZddl	m
Z
 ej                  j                  d e e
e      j                         j                                ddlmZmZmZ ddlmZ  e
e      j                         j0                  d   Zedz  Zd	Zd
ZdddddZ ej<                  d      Zd!dZ d"dZ!d#dZ"d$dZ#d%dZ$d&dZ%d&dZ&d'dZ'd(dZ(deef	 	 	 	 	 	 	 	 	 d)dZd*dZ)d*dZ*edfd+dZ+d,dZ,d-dZ-e.d k(  r e-        yy).zHSummarize nearby block context for event/object branch-state candidates.    )annotationsN)Path)find_cns_stringsread_sectionsva_to_offset)build_summary   out   i@  zobject/stat comparison groupzparty/object condition groupzsix-slot object condition groupz#list selection initialization group)%   &   '   1   uY   [\u3131-\u318e\uac00-\ud7a3A-Za-z0-9][\u3131-\u318e\uac00-\ud7a3A-Za-z0-9 　!?.:_+-]{1,}c                    d| dS )N0x08x values    N/home/exedev/hwanse/tools/summarize_event_object_branch_state_block_context.pyhex32r       s    c{    c                >    t        | t              rt        | d      S d S )N   )
isinstancestrintr   s    r   	parse_hexr   $   s    's33ub>==r   c                f    | D ],  }|d   |cxk  r|d   |d   z   k  sn |d   |z   |d   z
  c S  y )Nrawraw_sizevar   )sectionsoffsetsections      r   va_for_offsetr&   (   sM     ;5>VJgenwz7J&JJ4=6)GEN::; r   c                L    | D ]  }|d   |cxk  r|d   |d   z   k  s|c S  ! y )Nr"   r!   r   )r#   r"   r%   s      r   section_for_var(   /   s@     4=BD1D!DDN E r   c                d    |dk  s|dz   t        |       kD  ry t        j                  d| |      d   S )Nr      z<I)lenstructunpack_from)exer$   s     r   dword_atr/   6   s5    zVaZ#c(*dC033r   c                   g }t               }d}t        | dz         D ]  \  }}|dv rt        |      dk\  r|j                  dd      j	                  d      }t
        j                  |      D ]h  }|j                  d      j	                         }	t        d |	D              }
t        |	      d	k\  sC|
d	k\  sI|j                  t        ||z         |	d
       j |j                          |dz   }|s|}|j                  |        g }t               }|D ].  }|d   }||v r|j                  |       |j                  |       0 |d d S )Nr       >   r   @   r*   cp949ignorez  c              3  X   K   | ]"  }d |cxk  rdk  sn d|cxk  rdk  sn nd $ yw)u   ㄱu   ㆎu   가u   힣r	   Nr   ).0chars     r   	<genexpr>z text_snippets.<locals>.<genexpr>F   s,     &zTX=YQY=Y]eim]yqy]yq&zs   *
*   )vaHextextr	   r;      )	bytearray	enumerater+   decodestripTEXT_REfinditergroupsumappendr   clearsetadd)database_vasnippetscurrentcurrent_startindexbytedecodedmatchr;   hangul_countdedupedseenitemkeys                  r   text_snippetsrW   <   sN   HkGM . !t<7|q !..(;AA%H$--g6 E ;;q>//1D#&&zT&z#zL4yA~,!*; %*7]+B%C$() 	 MMO!AIM %NN4 #!$ G5D 6l$;t 3B<r   c           	         g }t        dt        dt        |       dz
              D ]Q  }| |   dk7  r| |dz      }|dk(  r|j                  t	        ||z         d|dt
        j                  |      d       S |d d S )Nr   r	   r2   r   02x)r:   	opcodeHexlabel(   )rangemaxr+   rE   r   EVENT_OPCODE_LABELSget)rI   rJ   rowsrN   opcodes        r   command_pairsrc   ]   s    Dq#aTQ/0 
;$eaiT>7U?+fS\*(,,V4
 	
 9r   c           	         g }||dz  z
  }t        |t        |t        |       dz
        dz   d      D ]A  }t        | |      }||vr|j	                  t        t        ||      xs d      ||   d       C |S )Nr*   r	   r   )refVaHexfilename)r]   minr+   r/   rE   r   r&   )	r.   r#   strings	start_offend_offra   alignedoffr   s	            r   cns_refsrm   m   s    D9q=)GWc'3s8a<81<a@ c"mHc:?a@
 		 Kr   c                   dj                  d |D              dj                  d |D              }t        d |j                         D              ryt        fddD              ry| j                  d	d
      j	                  d      ry|ryy)N c              3  &   K   | ]	  }|d      ywr;   Nr   r6   rU   s     r   r8   z#classify_context.<locals>.<genexpr>|   s     7dT&\7   c              3  &   K   | ]	  }|d      ywrf   Nr   rr   s     r   r8   z#classify_context.<locals>.<genexpr>}   s     :dj):rs   c              3  n   K   | ]-  }|j                  d       xr t        j                  d|       / yw)mapzmap\d+_\d+[a-z]\.cnsN)
startswithre	fullmatch)r6   names     r   r8   z#classify_context.<locals>.<genexpr>~   s.     
pVZ4??5!Qbll3JD&QQ
p   35zLhas nearby field-map resource references; route relevance needs deeper tracec              3  &   K   | ]  }|v  
 y w)Nr   )r6   wordtextss     r   r8   z#classify_context.<locals>.<genexpr>   s     
hT45=
hs   )u	   기본기u	   공격기u   도구u   무기u   던전u   레벨z6menu/list context, not a direct field transition blockcandidateVaHex 0x00544zDpointer-heavy selector-like data block, no nearby field-map resourcez@event/object command-like byte stream, but no current route linkz*raw data context, route relevance unproven)joinanysplitr`   rx   )rowrK   cnscommands	filenamesr   s        @r   classify_contextr   {   s~    HH7h77E:c::I

p^g^m^m^o
pp]

h%g
hhG
ww$//	:UQ7r   c                n   t        |       }t        | |      }|xs t        |       }g }|j                  d      xs g D ]  }t	        |j                  d            }|!t        ||      }	|	0t        |	d   ||z
        }
t        |	d   |	d   z   ||z         }t        ||
      }t        ||dz
        }||z|dz  }| || }t        ||
      }t        | ||||      }t        ||
      }t        ||||      }|j                  |d   |d   |d   |j                  d      |j                  d	      t        |
      t        |      ||||d
        |D cg c]
  }|d   s	| }}|D cg c]  }|d   j                  d      s| }}dt!        |      t!        |      t!        |      d|dS c c}w c c}w )N
candidatesr   r"   r!   r	   indexHexhandlerLabelparentBlockStartHexrouteRelevance)r   r   r   r   r   windowStartHexwindowEndHextextSnippetsnearbyCnsRefscommandPairscontextClassificationr   r   z	menu/listzTnearby text/resource/command context for medium event/object branch-state candidatesaz  The medium branch-state candidates are command-like, but the inspected windows do not expose field-map CNS resource references. Most 0x004e82xx candidates sit in CP949 menu/list text context, and the 0x00544axx/0x00544exx candidates are pointer-heavy selector-like blocks. They remain useful for VM decoding, but are not promotion evidence for the current map progression route.)scopecandidateCountnearbyCnsCandidateCountmenuLikeCandidateCount
conclusionr   )r   r   build_link_summaryr`   r   r(   r^   rg   r   rW   rm   rc   r   rE   r   rx   r+   )r.   link_summarywindow_beforewindow_afterr#   rh   ra   r   candidate_var%   start_vaend_vari   rj   rI   rK   r   r   context_classroute_relevant	menu_likes                        r   r   r      s    S!HsH-G:#5c#:LD-3  )9!:; <8?wt}l]&BCWT]WZ%88,:UV 84	x!419W% x0sHgy'B x0(hXF!"23J/#&77+@#A!gg&67#Ho!&M$ $%2
 	'@ &*BcS-AcBNB $],C(D(O(OP[(\]I]gd)#&~#6"%i.L
   C]s   
F-F-)F2F2c                   ddddd| d    d| d    d| d	    d| d
   dddg}| d   D ]  }dj                  d |d   D              xs d}dj                  d |d   D              xs d}dj                  d |d   d d D              xs d}|j                  d|d    d|d    d|d    d|j                  d      xs d d|d     d!| d!| d!| d"        |j                  d       d#j                  |      S )$Nz)# Event/Object Branch State Block Contextr   zJNearby context for medium-confidence event/object branch-state candidates.z- candidates: r   z- with nearby CNS refs: r   z- menu-like candidates: r   r   zU| candidate | index | parent | context | text snippets | nearby CNS | command pairs |z+| --- | --- | --- | --- | --- | --- | --- |r   z, c              3  &   K   | ]	  }|d      ywrq   r   rr   s     r   r8   zmarkdown.<locals>.<genexpr>   s     G4$v,Grs   r   -c              3  &   K   | ]	  }|d      ywru   r   rr   s     r   r8   zmarkdown.<locals>.<genexpr>   s     JTZ(Jrs   r   c              3  n   K   | ]-  }|d     d|d    |j                  d      rd|d    ndz    / yw)r:   :rZ   r[   ro   r   N)r`   rr   s     r   r8   zmarkdown.<locals>.<genexpr>   sL      
 G}oQtK012TXXV]M^$w-6Idfg
r|   r      z| `r   z` | `r   z` r   z | `r   z` | r   z | z |
)r   rE   r`   )summarylinesr   r   r   r   s         r   markdownr      su   3
T

!1234
"7+D#E"FG
"7+C#D"EF

_5E |$ 
		G3~3FGGN3iiJS5IJJQc99 
N+BQ/
 
   	 	#&'(c*o->b^AT@U V-.5#6d3?V;W:XX[gSS
".	

 
LL99Ur   c                   g }| d   D ]  }dj                  d |d   D              xs d}dj                  d |d   D              xs d}dj                  d |d	   d d
 D              xs d}|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |j	                  d      xs d       dt        j                  |d          d| d| d| d        dj                  ddddddddd d!d"d#d$d%d&d'd(| d)    d*| d+    d,| d-    d.d/t        j                  | d0          d1d2d3d4j                  |       d5d6d7d4g      S )8Nr   z<br>c              3  L   K   | ]  }t        j                  |d            ywrq   htmlescaperr   s     r   r8   zhtml_page.<locals>.<genexpr>   s     V$DKKV5V   "$r   r   c              3  L   K   | ]  }t        j                  |d            ywru   r   rr   s     r   r8   zhtml_page.<locals>.<genexpr>   s     YD$++d:&67Yr   r   c              3     K   | ]h  }d t        j                  |d          dt        j                  |d          d|j                  d      rdt        j                  |d          ndz    j yw)	z<code>r:   r   rZ   z</code>r[   ro   r   N)r   r   r`   rr   s     r   r8   zhtml_page.<locals>.<genexpr>   sr      
  T[[g/0$++d;>O2P1QQXY3788G3D4;;tG}-./"N
s   A.A0r   r   z<tr><td><code>r   z</code></td><td><code>r   z</code><br>r   z</td><td><code>r   z</code></td><td>r   z	</td><td>z
</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">z8  <title>Event/Object Branch State Block Context</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin-bottom: 24px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z    th { background: #1d1d1d; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z2  <h1>Event/Object Branch State Block Context</h1>z  <p>Candidates: r   z; nearby CNS refs: r   z; menu-like: r   z.</p>z  <p>r   z</p>z  <table><thead><tr><th>candidate</th><th>index</th><th>parent</th><th>context</th><th>text snippets</th><th>nearby CNS</th><th>command pairs</th></tr></thead>z	  <tbody>r   z</tbody></table>z</body>z</html>)r   rE   r   r   r`   )r   ra   r   r   r   r   s         r   	html_pager      s   D|$ 
V#nBUVV]Z]kkYCDXYY`]`;; 
 N+CR0
 
  	 	
 	S)9%:;< =S_56k$++cR`NaBbAc dSWW-B%C%JsKL M;;s#:;<= >' % * 
	

& 99"PBhTW)&<
G$4566I'RkJlIm n678	?
GL12348 	j
BGGDM?"23
1  r   c                   |j                  dd       |dz  }|j                  t        j                  | dd      dz   d	       |9|j                  j                  dd       |j                  t        |       d	       |S )
NT)parentsexist_okz,event_object_branch_state_block_context.jsonFr9   )ensure_asciiindentr   utf-8encoding)mkdir
write_textjsondumpsparentr   )r   out_dirhtml_outjson_outs       r   write_outputsr     s    MM$M.GGH

7q9D@   dT:Ig.AOr   c                n    | j                         sy t        j                  | j                  d            S )Nr   r   )existsr   loads	read_text)paths    r   	load_jsonr   !  s(    ;;=::dnngn677r   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                  dt               | j                         }t        |j                  j                         t        |j                  dz              }t        ||j                  |j                        }t        d	|        y )
N)descriptionz--exezHwanse2.exe)typedefaultz	--out-dirz
--html-out)r   z.event_object_branch_state_candidate_links.jsonz1wrote event/object branch-state block context -> )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r.   
read_bytesr   r   r   r   print)parserargsr   r   s       r   mainr   '  s    $$9F
dD=4HI
$<
40D$,,!QQRG WdllDMMBH	=hZ
HIr   __main__)r   r   returnr   )r   z
str | Noner   
int | None)r#   
list[dict]r$   r   r   r   )r#   r   r"   r   r   dict | None)r.   bytesr$   r   r   r   )rI   r   rJ   r   r   r   )r.   r   r#   r   rh   zdict[int, str]ri   r   rj   r   r   r   )
r   dictrK   r   r   r   r   r   r   r   )
r.   r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   zPath | Noner   r   )r   r   r   r   )r   None)/r   
__future__r   r   r   r   ry   r,   syspathlibr   r   insertr   __file__resolver   probe_exe_scene_tablesr   r   r   3summarize_event_object_branch_state_candidate_linksr   r   r   r   r   WINDOW_BEFOREWINDOW_AFTERr_   compilerA   r   r   r&   r(   r/   rW   rc   rm   r   r   r   r   r   r   __name__r   r   r   <module>r      sO   N "    	  
  3tH~--/667 8 P P c H~''*
Ul
(
(
+
/	  "**q
r>4B 8  !%&$	8	88 8 	8
 
8v>.b 25d 
8J zF r   