
    UHj&                       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ddZddd	Z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 save-selector frontier edges for transition research.    )annotationsN)Path	urlencode   outc                    dt        |        S )Nz../web/game.html?r   )paramss    =/home/exedev/hwanse/tools/summarize_save_selector_frontier.pyweb_hrefr      s    y0122    c                x    i }| D ]2  }|j                  |j                  |      g       j                  |       4 |S N)
setdefaultgetappend)rowskeyresultrows       r   rows_by_mapr      s>    $&F 8#''#,+22378Mr   c                    | d}| j                  |      r| |   S | j                  |      }t        |t              rd|dS d S )NHex0x08x)r   
isinstanceint)r   r   hex_keyvalues       r   	hex_valuer       sM    SkG
www7|GGCLE)%5Rc{?4?r   c                2   t        |      }t        |      }t        |      }g }| j                  d      xs g D ]  }	|	d   }
|	d   }|j                  |
      xs i j                  dg       D cg c].  }||j                  d      xs |j                  d      xs g v r|0 }}|j                  |
g       D cg c]  }||j                  d      xs g v r| }}g }|D ]A  }|j                  d      xs g D ci c]  }|j                  d      | }}|j                  |j                  d	      |j                  d
      |j                  |
      xs i j                  d      |j                  |
      xs i j                  d      |j                  |      xs i j                  d      |j                  |      xs i j                  d      |j                  |
      xs i j                  d      xs g |j                  |      xs i j                  d      xs g d       D |j                  |
||	j                  d      xs g |	j                  d      xs g |	j                  dt        |            t	        |      |D cg c]R  }|j                  d      |j                  d      |j                  d      t        |j                  d      xs g       dT c}t        |j                  |
g             t        |j                  |g             |j                  |
g       D cg c]H  }t        |d      |j                  d      |j                  d      xs g |j                  d      xs g dJ c}|j                  |g       D cg c]H  }t        |d      |j                  d      |j                  d      xs g |j                  d      xs g dJ c}|t        |
ddd      t        |ddd      d        |S c c}w c c}w c c}w c c}w c c}w c c}w )NsaveSelectorCandidateFrontiersourcetargetrecordstargets	fieldMapsscenesmapselectorleafPointerHexrecordVaHex
sceneIdHextilesets)r*   r+   sourceRecordVaHexsourceSceneIdHextargetRecordVaHextargetSceneIdHexsourceTilesetstargetTilesets	selectorsleafPointersrecordCount	eventKindpoints)r,   r-   r8   
pointCountrecordVasprites)r,   r-   r.   r<   1)r)   eventsoverview)r#   r$   r5   r6   r7   directEventTransitiondirectTransitionRecordssourceEventCounttargetEventCountsourceManifestRecordstargetManifestRecords
scenePairs
sourceOpen
targetOpen)r   r   r   lenboolr    r   )playable_progressselector_linksscene_manifestscene_eventsevent_transitionsmanifest_by_mapevents_by_maptransitions_by_mapr   edger#   r$   recordlink_recordsr   direct_transitionsscene_pairssceneby_scene_maps                      r   
build_rowsrZ   #   s    ".1O-M$%67F!%%&EFL" Ahh *--f5;@@BO
&**Y/P6::k3JPbQ 
 
 *--fb9
#''),23 
 

 " 	FAGHAUA[Y[\EIIe,e3\L\"JJz2"(**-=">&2&6&6v&>&D"%I%I-%X%1%5%5f%=%C$H$H$V&2&6&6v&>&D"%I%I-%X%1%5%5f%=%C$H$H$V#/#3#3F#;#Ar"F"Fz"R"XVX#/#3#3F#;#Ar"F"Fz"R"XVX	  		 	+.4" HH^4:88M3|3DE%)*<%= .(  $'77=#9"%'',"7!$!5"%cggh&7&=2">	( !$M$5$5fb$A B #M$5$5fb$A B +..vr:&  $-S*#="%'',"7 #
 3 9r"wwy17R	&  +..vr:&  $-S*#="%'',"7 #
 3 9r"wwy17R	& &"6Sc#RS"6Sc#RSM'
 '	5AD M


 ]$(&&s'   .3O;7 P 8P?AP
 APAPc                   dddddt        |        ddddg}| D ]  }dj                  d	 |d
   D              }dj                  d t        |d   |d         D              xs dj                  |d         }|j                  d|d    d|d    d|d   rdnd d|d    d|xs d d|xs d d|d    d|d    d        | s|j                  d       |j                  d       dj                  |      S )Nz# Save Selector Frontier zFrontier edges are save-selector scene-link candidates that leave the currently confirmed playable route. They are not confirmed tile transitions.zFrontier edges: .zZ| source | target | direct event? | source events | selector leaves | scene pairs | open |z,| --- | --- | --- | ---: | --- | --- | --- |, c              3  f   K   | ])  }|j                  d        d|j                  d        + yw)r/   z->r1   N)r   .0pairs     r   	<genexpr>zmarkdown.<locals>.<genexpr>   s9      
 xx+,-R9L0M/NO
s   /1rF   c              3  0   K   | ]  \  }}| d |   yw) N )ra   r*   leafs      r   rc   zmarkdown.<locals>.<genexpr>   s'      
$ j$ 
s   r5   r6   z| r#   z | r$   r@   yesnorB   -z | [source](rG   z) / [target](rH   z) |z| - | - | - | - | - | - | - |
)rI   joinzipr   )r   linesr   pairsleavess        r   markdownrq   s   sU   "
 	]

3t9+Q'
d6	E  
		 
L)
 
  
"%c+&6N8K"L
 
 , YYs>*+ 	 	Xs3x=/cBY>ZU`d4eeh%&'s6=S/U\cN KL)*-L8I7J#O	

 45	LL99Ur   c                   g }| D ]  }dj                  d |d   D              }dj                  d |d   D              }|j                  dt        j                  |d          dt        j                  |d	          d|d
   rdnd d|d    d|d    dt        j                  dj                  |d         xs d       d|xs d d|xs d dt        j                  |d          dt        j                  |d          d        dj                  ddddddddd d!d"d#d$d%d&d'd(d)t	        |        d*d+d,d-dj                  |      xs d.d/d0d1d2d3g      S )4Nz<br>c              3    K   | ]  }t        j                  |j                  d        d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d	       d
        yw)r*   re   r+   z: r/   z (r0   z) -> r1   r2   )N)htmlescaper   r`   s     r   rc   zhtml_page.<locals>.<genexpr>   s      
  KK88J'($((3C*D)ER88/01DHH=O4P3QQV88/01DHH=O4P3QQRT
s   BBrF   c              3  F   K   | ]  }t        j                  |        y wr   )ru   rv   )ra   rg   s     r   rc   zhtml_page.<locals>.<genexpr>   s     O4T[[.Os   !r6   z<tr><td>r#   z	</td><td>r$   r@   rh   ri   rB   rC   r^   r5   rj   z</td><td><a href="rG   z">source</a> <a href="rH   z">target</a></td></tr>rk   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 Frontier</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    a { color: #9bd4ff; }z
  </style>z</head>z<body>z!  <h1>Save Selector Frontier</h1>z  <p>Frontier edges are save-selector scene-link candidates that leave the currently confirmed playable route. They are not confirmed tile transitions.</p>z  <p>Frontier edges: z.</p>z	  <table>z    <thead><tr><th>source</th><th>target</th><th>direct event?</th><th>source events</th><th>target events</th><th>selector leaves</th><th>scene pairs</th><th>open</th></tr></thead>z    <tbody>z0<tr><td colspan="8">No frontier edges.</td></tr>z    </tbody>z
  </table>z</body>z</html>r\   )rl   r   ru   rv   rI   )r   	body_rowsr   ro   rp   s        r   	html_pagery      s   I 
 
 L)
 
 O3~;NOO;;s8}-. /;;s8}-. / 785dC D)*+ ,)*+ ,;;tyy[)9:AcBC4RU W<C. ! KKL(9:; <C$567 8
	

. 99"P1h?WC#+ 	f
D	{%0 	@		)R R
7  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_oksave_selector_frontier.jsonF   )ensure_asciiindentrk   utf-8encoding)mkdir
write_textjsondumps)r   out_dirs     r   write_outputsr      sC    MM$M.,,88

4eA6= 9 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
        d
z         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d                  }t!        ||j"                         t%        dt'        |       d|j"                  dz          y )N)descriptionz--playable-progresszplayable_progress.json)typedefaultz--selector-linkszsave_selector_scene_links.jsonz--scene-manifestzscene_manifest.jsonz--scene-eventszscene_events.jsonz--event-transitionszevent_transitions.jsonz	--out-dirr   r   zwrote z  save selector frontier rows -> r}   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsrZ   r   loadsrK   	read_textrL   rM   rN   rO   r   r   printrI   )parserargsr   s      r   mainr      s   $$9F
-D#H`B`a
*sEe?ef
*sEZ?Z[
(tSCV=VW
-D#H`B`a
$<D

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

4&&00'0BC

4&&00'0BC

4$$...@A

4))33W3EFD $%	F3t9+=dllMj>j=k
lmr   __main__)r
   zdict[str, str]returnstr)r)   )r   
list[dict]r   r   r   zdict[str, list[dict]])r   dictr   r   r   z
str | None)rK   r   rL   zdict[str, dict]rM   r   rN   r   rO   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )r   
__future__r   r   ru   r   pathlibr   urllib.parser   __file__resolver{   ROOTr   r   r   r    rZ   rq   ry   r   r   __name__rf   r   r   <module>r      s    E "     " H~''*
Ul3@MM#M M 	M
 "M M`>5p 58 n( zF r   