
    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  ee      j                         j                  d   Zedz  ZddZddZdd	Zdd
Zd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)zDSummarize likely story-progress jumps from save scene selector rows.    )annotationsN)Path   outc                :    t        | d         t        | d         fS )Ngroupslot)introws    >/home/exedev/hwanse/tools/summarize_scene_selector_progress.pyrow_keyr      s    s7|c#f+...    c                    | d    d| d    S )Nr   :r	    r   s    r   selector_labelr      s    'l^1S[M**r   c                z    t               }g }| D ])  }||v r|j                  |       |j                  |       + |S )N)setaddappend)valuesseenresultvalues       r   uniquer      sE    5DF D=e	
 Mr   c                   t        | t              D cg c]  }|j                  d      s| }}g }t        |      D ]Y  \  }}t	        |j                  d      xs g       }t        |      }g }|d | D ]  }t	        |j                  d      xs g       }	t        |	      }
|	D cg c]	  }||v s| }}|sC|D cg c]	  }||
vs| }}|	D cg c]	  }||vs| }}|j                  |d   |d   t        |      |||t        |      t        |      t        |      |	|j                  d      d        |j                  d        |r|d   nd }|j                  |d   |d   t        |      |j                  d      |t        |      ||d d	 d
       \ t        |       t        |      |dS c c}w c c}w c c}w c c}w )N)key	fieldMapsr   r	   selectedPointerHex)	fromGroupfromSlot	fromLabel
sharedMapsintroducedMapsdroppedMapssharedCountintroducedCountdroppedCountfromFieldMapsfromSelectedPointerHexc                0    | d    | d   | d   | d   | d   fS )Nr'   r(   r)   r!   r"   r   )items    r   <lambda>zbuild_summary.<locals>.<lambda>A   s5    m$$&'^$[!Z  r   r      )r   r	   labelr    r   fieldMapCountbestPreviouspreviousCandidates)selectorCountfieldSelectorCountprogressRows)
sortedr   get	enumerater   r   r   r   lensort)rowsr   
field_rowstransitionsindexcurrent_mapscurrent_setprevious_candidatespreviousprevious_mapsprevious_setnameshared
introduceddroppedbests                   r   build_summaryrK   "   s   !''!:S#cggk>R#SJSK
+ 0

scggk28b9,' "6E* 	H"8<<#<#BCM}-L'4Lt8KdLFL+7T44|;S$TJT(5Q[9PtQGQ&&!)'!2 ( 0!/!9"(&0#*#&v;'*:$'L%2.6ll;O.P	. 	   	! 	
 *="1%$WF',&)gg.B&C)!$\!2 $&9"1&=		
K0
d T!*o# g T M UQs.   F3F3%	F8/F8<	F=F=	GGc                "    | d| d    d| d    S )Nz/game.html?saveGroup=r   z
&saveSlot=r	   r   )r   
web_prefixs     r   open_selector_linkrN   ]   s"    \.s7|nJs6{mTTr   c                >    | sydj                  fd| D              S )N-, c              3  6   K   | ]  }d | d d| d  yw)[z](z/game.html?map=)Nr   ).0rF   rM   s     r   	<genexpr>zmap_links.<locals>.<genexpr>d   s&     VqbOD6CVs   )join)namesrM   s    `r   	map_linksrY   a   s    99VPUVVVr   c                "   ddddddd| d    dd| d	    ddd
dg}| d   D ]I  }|j                  d      rj                  d      s)t        fd|j                  dg       D        d       }d}|rRd|d    ddj                  |j                  d      xs g        ddj                  |j                  d      xs g        }|j                  dj	                  d|d    ddd    d|dj                  j                  d      xs g       xs dt        j                  d      xs g       dj                  j                  d      xs g       xs dt        |                   L |j                  d       dj                  |      S )Nz# Scene Selector Progress z/Generated from `out/save_scene_selectors.json`.a+  This is not a confirmed map-transition graph. It compares save selector rows that load field maps and highlights rows that share at least one map with an earlier selector while introducing new field maps. That is useful when strict event-transition extraction misses story or script-driven progress.zSelector rows: r4   .zField selector rows: r5   zp| selector | best previous | alternate previous | shared maps | introduced maps | dropped maps | open selector |z+| --- | --- | --- | --- | --- | --- | --- |r6   r2   r%   c              3     K   | ]:  }|j                  d       j                  d       k7  r|j                  d      r| < ywr#   r%   Nr8   rU   r-   rJ   s     r   rV   zmarkdown.<locals>.<genexpr>z   ?      88K(DHH[,AAdhhO_F`    A Ar3   rP   `r#   z` via rQ   r$   : z`| {selector} | {previous} | {alternate} | {shared} | {introduced} | {dropped} | [open]({open}) |r0   r&   )selectorrC   	alternaterG   rH   rI   open
)r8   nextrW   r   formatrY   rN   )summarylinesr   rf   alternate_labelrJ   s        @r   markdownrn   g   s   #
9
 	v

'/2315
(< =>a@
z5E ~& 
ww~&488$45GG$8"=
 
	 Ik*+6$))IMM,<W<][]2^1__a99Y]]+;<BCDF  	nuuS\N!,T+./q1)yy,!7!=2>E#$TXX.>%?%E2F		$((="9"?R@GC', v 
	
%
: 
LL99Ur   c                b   g }| d   D ]  }|j                  d      rj                  d      s)t        fd|j                  dg       D        d       }d}|rQ|d    dd	j                  |j                  d
      xs g        dd	j                  |j                  d      xs g        }dj                  d j                  d      xs g D              }|j                  dj                  ddt	        j
                  |d          ddt	        j
                  d          ddt	        j
                  |       ddt	        j
                  d	j                  j                  d
      xs g       xs d       dd|xs d ddt	        j
                  d	j                  j                  d      xs g       xs d       ddt	        j
                  t        |             ddg	              dj                  ddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-| d.    d/| d0    d1d2d3d4g|d5d6d7d8d9      S ):Nr6   r2   r%   c              3     K   | ]:  }|j                  d       j                  d       k7  r|j                  d      r| < ywr^   r_   r`   s     r   rV   zhtml_page.<locals>.<genexpr>   ra   rb   r3   rP   r#   z via rQ   r$   rd    c              3  z   K   | ]3  }d t        j                  |       dt        j                  |       d 5 yw)z<a href="../web/game.html?map=z">z</a>N)htmlescape)rU   rF   s     r   rV   zhtml_page.<locals>.<genexpr>   s<      $
 -T[[->,?r$++dBSATTXY$
s   9;rh   z<tr>z  <td><code>r0   z</code></td>z  <td>z</td>z  <td class="links">r&   z  <td><a href="z">open selector</a></td>z</tr>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>Scene Selector Progress</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    code { color: #ffd447; }z=    .links { display: flex; flex-wrap: wrap; gap: 6px 10px; }z
  </style>z</head>z<body>z"  <h1>Scene Selector Progress</h1>z  <p>Compares save selector rows by shared and newly introduced field maps. These are progress hints, not confirmed transitions.</p>z  <p>Selector rows: r4   z. Field selector rows: r5   z.</p>z	  <table>z    <thead><tr><th>selector</th><th>best previous</th><th>alternate previous</th><th>shared maps</th><th>introduced maps</th><th>dropped maps</th><th>open</th></tr></thead>z    <tbody>z    </tbody>z
  </table>z</body>z</html>r[   )r8   ri   rW   r   rs   rt   rN   )rk   r<   r   rf   alternate_textintroduced_linksrJ   s         @r   	html_pagerw      s   D~& $
ww~&488$45GG$8"=
 
	 [)*%		)--:U:[Y[0\/]]_99Y]]+;<BCDF  88 $
!128b$
 
 	II"4;;s7|#<"=\J"4;;tK/@#A"B,OT[[89?T[[488L3I3OR)P)WTWXYY^_*+;+Bs*C5IT[[488M3J3Pb)Q)XUXYZZ_`%dkk2DS2I&J%KKcd
	
-$
J 99&T6lC[G'*K0 S"7?#;"<<ST[\pTqSrrwx {/	
0 1	
2 3	
4 5	
6 7	
8 9	
: ;	
   r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okscene_selector_progress.jsonF   )ensure_asciiindentrh   utf-8encoding)mkdir
write_textjsondumps)rk   out_dirs     r   write_outputsr      sC    MM$M.--99

7q9D@ : r   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        t        j                  |j                  j                  d                  }t        ||j                         t        d|j                  d	z          y )
N)descriptionz--selectorszsave_scene_selectors.json)typedefaultz	--out-dirr   r   z!wrote scene selector progress -> r{   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsrK   r   loads	selectors	read_textr   r   print)parserargsrk   s      r   mainr      s    $$9F
D#@[:[\
$<DDJJt~~'?'?'?'QRSG'4<<(	-dll=[.[-\
]^r   __main__)r   dictreturnztuple[int, int])r   r   r   str)r   	list[str]r   r   )r<   z
list[dict]r   r   )z../web)r   r   rM   r   r   r   )rX   r   rM   r   r   r   )rk   r   r   r   )rk   r   r   r   r   None)r   r   )r   
__future__r   r   rs   r   pathlibr   __file__resolvery   ROOTr   r   r   r   rK   rN   rY   rn   rw   r   r   __name__r   r   r   <module>r      s    J "     H~''*
Ul/+8vUW,^GT 25 _ zF r   