
    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 ddl	m
Z
mZmZ ddlmZ  ee      j!                         j"                  d   Zedz  Zdd	Zdd
Z	 d	 	 	 	 	 	 	 	 	 ddZddZddZefddZddZedk(  r e        yy)zBSummarize branch path contents for save-selector frontier streams.    )annotationsN)Path)find_cns_stringsread_sectionsva_to_offset)branch_target_kind   outc                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       A/home/exedev/hwanse/tools/summarize_save_selector_branch_paths.pydword_atr      s?    (B'F~!c#h.dC033    c           	     @   |sd g g g dS t        |d      }g }g }g }||v r|j                  ||          t        |      D ]  }	||	dz  z   }
t        | ||
      }| n|	d|
dd|d|dz  |dz	  d}|j	                  |      }|rq||d<   ||vr|j                  |       |j                  d	      rW|j                  d
      sFt        | ||
dz         }|j                  |d   ||d d |d|dnd d       nt        ||      d|d<   |j                  |        ||||dS )N)
startVaHexwords	linkedCnsfieldRecords   r   0x08xi  )indexvaHexvalueHexu16Lou16Hicnsmapmap_r    04x)recordVaHexfilenamer%   
sceneIdHexTpointer)intappendranger   get
startswithr   )r   r   stringsstart_va_hexcountstart_var   linkedfieldsr   r   valueitemr$   scene_ids                  r   	scan_pathr;      s|   "RbRTUU<$HEFF7gh'(u 	!h+="S]U3K(V^b[
 kk% DK& c"~~e$S^^F-C#C26:#'= #s89A9MBxn"5SW	  (E*6"DOT7: #	 r   c                   t        |       }t        | |      }|D ci c]  }|j                  d      | }}g }|D ]  }	|	j                  d      xs g D ]  }
|j                  |
j                  d            xs i }t        | |||
j                  d      |      }t        | |||
j                  d      d      }|	j                  d      h}|	j                  d      h}|d   D ch c]  }|d	   	 }}|j	                  i d|	j                  d      d|	j                  d      d|
j                  d      d
|
j                  d
      d|
j                  d      ddddd|
j                  d      d|
j                  d      dt        ||
j                  d            d|d   d|d   d|d   d|d   dt        ||z        dt        ||z        d|	j                  d      xs g |	j                  d      xs g |	j                  d      xs i |	j                  d      xs i dd         |S c c}w c c}w )NleafPointerHexbranchStepsfallthroughVaHexbranchTargetHexr   sourcetargetr   r%   streamVaHex	conditiontruePathfallthrough	falsePathbranchTargetbranchTargetKindfallthroughLinkedCnsr   fallthroughFieldRecordsbranchTargetLinkedCnsbranchTargetFieldRecordsfallthroughContainsSourcefallthroughContainsTargetsourceRecordTilesetstargetRecordTilesetssourceAcceptedRendertargetAcceptedRenderzThe fallthrough path contains scene records, but this is still not a tile transition. The missing piece is the runtime branch-state value and a source hotspot/spawn.)rQ   rR   rS   note)r   r   r0   r;   r.   r   bool)r   frontier_branchesleaf_streams
scan_wordsr   r2   leafleaves_by_pointerrowsedgesteprF   branch_targetsource_mapstarget_mapsrecordfallthrough_mapss                    r   
build_rowsrc   G   s    S!HsH-GFRSd"23T9SSD! !HH]+1r  	D$((2B)CDJD#C7DHHEW<XZdeK%c8WdhhGX>Y[]^M88H-.K88H-.K<G<WX&uXXKK $((8,$((8, !$((+;"< txx6	
 TXXk2 M ^ #DHH-?$@ "488,=#> #$6tTXXFW=X$Y 'K(@ *;~+F ({)C +M.,I ,T+@P2P-Q  ,T+@P2P-Q!" '1G(H(NB#$ )-1G(H(NB(,1G(H(NB(,1G(H(NBf-  	!D KI T  Ys   H6#H;c                6   g d}| D ][  }dj                  d |j                  d      xs g D              xs d}dj                  |j                  d      xs g       xs |j                  d      xs d}dd	j                  |j                  d
      xs g       xs d dd	j                  |j                  d      xs i j                  d      xs g       xs d }|j                  d|j                  d       d|j                  d       d|j                  d       d|j                  d       d| d|j                  d       d| d| d|j                  d       d       ^ | s|j                  d       |j                  d       dj                  |      S )N)z# Save Selector Branch Paths zBranch-path scan for save-selector frontier streams. A path containing map records is a script-resource path, not a confirmed tile hotspot.re   zY| source | target | condition | true path records | false path | render mismatch | note |z+| --- | --- | --- | --- | --- | --- | --- |, c              3  N   K   | ]  }|d     d|j                  d         yw)r%    r+   N)r0   .0r9   s     r   	<genexpr>zmarkdown.<locals>.<genexpr>   s1      !
 E{m1TXXl345!
s   #%rK   -rL   rI   zrecord ,rP   z; accepted rR   tilesetsz| rA   z | rB   z | `rD   z` | r?   z -> r@   rT   z |z| - | - | - | - | - | - | - |re   
)joinr0   r.   )r[   linesrowtrue_recordsfalse_recordsmismatchs         r   markdownrv   v   s   E  
yy !
 9:@b!
 
   	 		#''*A"B"HbIoSWWUgMholochhsww'=>D"ELM N#''*@"A"GR!L!LZ!X!^\^_fcfgi 	 	"#3swwx'8&9cggk>R=SSWww)*+4~Sww()*$}oS
#cggV\oM^^`b	

 45	LL99Ur   c                   g }| D ]  }dj                  d |j                  d      xs g D              xs d}t        j                  dj                  |j                  d      xs g       xs |j                  d      xs d      }dt        j                  d	j                  |j                  d
      xs g       xs d       dt        j                  d	j                  |j                  d      xs i j                  d      xs g       xs d       d}|j	                  dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       d| dt        j                  |j                  d      xs d       d| d| dt        j                  |j                  d      xs d       d       " dj                  dddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/dj                  |      xs d0 d1d2d3dg      S )4Nz<br>c           
   3     K   | ]6  }t        j                  |d     d|d    d|j                  d              8 yw)r)   rh   r%   r+   N)htmlescaper0   ri   s     r   rk   zhtml_page.<locals>.<genexpr>   sF      #
 KK4./qeQtxx?U>VWX#
s   <>rK   rl   rf   rL   rI   zrecord <code>rm   rP   z</code><br>accepted <code>rR   rn   z</code>z<tr><td>rA   z	</td><td>rB   z</td><td><code>rD   z</code></td><td><code>r?   z</code><br>r@   rT   re   z
</td></tr>ro   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>Save Selector Branch Paths</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }z5    table { border-collapse: collapse; width: 100%; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z9    th { background: #1d1d1d; position: sticky; top: 0; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z%  <h1>Save Selector Branch Paths</h1>z  <p>Branch-path scan for save-selector frontier streams. A path containing map records is a script-resource path, not a confirmed tile hotspot.</p>z  <table><thead><tr><th>source</th><th>target</th><th>condition</th><th>true/fallthrough path</th><th>false/branch path</th><th>render mismatch</th><th>note</th></tr></thead>z	  <tbody>z&<tr><td colspan="7">No rows.</td></tr>z</tbody></table>z</body>z</html>)rp   r0   ry   rz   r.   )r[   bodyrr   rs   rt   ru   s         r   	html_pager|      s   D 
{{ #
 9:@b#
 
   	 DIIcgg6M.N.TRT$U${Y\Y`Y`asYt${x{|DKK9O1P1VTV(W(^[^_` a"kk#((CGG<R4S4YWY3^3^_i3j3pnp*q*xuxyz  {BC 	 	;;swwx07C89 :;;swwx07C89 :SWW[%9%@SAB CSWW-?%@%GCHIUaTb cSWW->%?%F3GHTaSb c* ;;swwv4"56 7
	

* 99"P5h?WC&/ 	_ 	y
BGGDMO%OPP`a
-  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_oksave_selector_branch_paths.jsonF   )ensure_asciiindentro   utf-8encoding)mkdir
write_textjsondumps)r[   out_dirs     r   write_outputsr      sC    MM$M.00<<

4eA6= = r   c            	        t        j                  t              } | 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                  |j                  j                  d
            t        j                  |j                  j                  d
                  }t!        ||j"                         t%        dt'        |       d|j"                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--frontier-branchesz$save_selector_frontier_branches.jsonz--leaf-streamszsave_selector_leaf_streams.jsonz	--out-dirr   r   zwrote z# save selector branch path rows -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsrc   r   
read_bytesr   loadsrV   	read_textrW   r   r   printr   )parserargsr[   s      r   mainr      s   $$9F
dD=4HI
-D#HnBno
(tSCd=de
$<D

4))33W3EF

4$$...@AD
 $%	F3t9+@PqAq@r
str   __main__)r   bytesr   
list[dict]r   r-   returnz
int | None)r   r   r   r   r2   zdict[int, str]r3   z
str | Noner4   r-   r   dict)0   )
r   r   rV   r   rW   r   rX   r-   r   r   )r[   r   r   str)r[   r   r   r   r   None)r   r   )r   
__future__r   r   ry   r   r   pathlibr   probe_exe_scene_tablesr   r   r   )summarize_save_selector_frontier_branchesr   __file__resolver~   r   r   r   r;   rc   rv   r|   r   r   __name__ r   r   <module>r      s    H "      P P H H~''*
Ul4*b 	,	,!, , 	,
 ,^<.b 58 u  zF r   