
    UHj+                    F   d Z ddlm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  e	e      j!                         j"                  d   Zed	z  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d"dZd#dZd$dZd%dZ e!dk(  r e         yy)&zESummarize unclassified layer0 tile IDs by map for passability review.    )annotationsN)Counterdefaultdict)Path)	load_maps)load   outdatac                    | r|ry| ryy)Nmixedpassblock )
pass_countblock_counts     :/home/exedev/hwanse/tools/summarize_map_tile_class_gaps.pyfallback_kindr      s    k    c                   | D ci c]  }|d   |d   f| }}t        |      }g }|rt        |d       }|j                  |       |g}||   g}|rp|j                         \  }}	|dz
  |	f|dz   |	f||	dz
  f||	dz   ffD ]=  }
|
|vr|j                  |
       |j	                  |
       |j	                  ||
          ? |rp|j	                  t        |d              |rt        |d       S c c}w )Nxyc                    | d   | d   fS )Nr	   r   r   points    r   <lambda>z&connected_components.<locals>.<lambda>    s    %(E!H1E r   keyr	   c                    | d   | d   fS )Nr   r   r   r   s    r   r   z&connected_components.<locals>.<lambda>,   s    uSz5QT:>V r   c                8    t        |        | d   d   | d   d   fS )Nr   r   r   )len)	components    r   r   z&connected_components.<locals>.<lambda>-   s+    c)n_iPQlSVFWYbcdYefiYj4k r   )setminremovepopappendsorted)pointsr   by_key	remaining
componentsstartstackr"   r   r   neighbors              r   connected_componentsr0      s   ;AB%uSz5:&-BFBFIJ
I#EFE]O	99;DAq!eQZ!a%aQZ!QUL 39,  *X&  !123  	&0VWX  *"kll# Cs   C0c                    | D cg c]  }|d   	 }}| D cg c]  }|d   	 }}t        |      t        |      t        |      t        |      dS c c}w c c}w )Nr   r   )minXminYmaxXmaxY)r$   max)r)   r   xsyss       r   component_boundsr9   0   sW    "(	)%*	)B	)"(	)%*	)B	)GSWc"gs2wOO 
*	)s
   AAc                z    | d   | d   k(  r| d   | d   k(  r| d    d| d    S | d    d| d    d| d    d| d    S )Nr2   r4   r3   r5   ,-r   )boundss    r   bounds_textr>   6   sm    f~'F6NfVn,L.!6&>"233VnQvf~.av/?q@PQQr   c                6   g }| j                         D ]t  \  \  }}}||k7  rt        |      D ]X  }|j                  |t        |      t	        |      |d   t        |dkD  rt        |      nd|dk  rt        |      nd      d       Z v t        |d       d | S )Nr   )layer1countr=   samplefallbackKindc                4    | d    | d   d   | d   d   | d   fS )NrA   r=   r3   r2   r@   r   )items    r   r   z%component_summaries.<locals>.<lambda>N   s/    4=.$x.*@$x.QWBXZ^_gZhi r   r   )itemsr0   r'   r!   r9   r   r(   )points_by_pairtilelimitr,   _tiler@   r)   r"   s           r   component_summariesrK   <   s    J#1#7#7#9 D=-f5 
	I Y*95#A, -&*QhC	NA&*aiC	NQ!	 	
	 i u r   c                   g }t        | j                               D ]  \  }}|j                  d      xs |j                  d      gd   }|j                  |i       }t        |j                  dg             t        |j                  dg             z  }	|j                  dg       D 
ch c]  }
t	        |
       c}
|j                  dg       D 
ch c]  }
t	        |
       c}
z  }t               }t               }t               }t        t
              }i }t        t              }t        t              }t        t        |d   d   |d   d	               D ]  \  }\  }}||	v s||f|v r||xx   d	z  cc<   ||   |xx   d	z  cc<   |j                  ||f||d
   z  ||d
   z  |d       |||f   j                  ||d
   z  ||d
   z  |d       |dkD  r||xx   d	z  cc<   n||xx   d	z  cc<   t        ||         |k  s||   j                  ||d
   z  ||d
   z  |d        |j                  |      D ]  \  }}||   }||   }|j                  ||||||t        ||      ||   j                         D cg c])  \  }}||t        |dkD  r|nd|dk  r|nd      |||f   d+ c}}t        ||      ||   d
         |S c c}
w c c}
w c c}}w )NlayerTilesetstilesetr   r   r   	passPairs
blockPairslayersr	   width)r   r   r@   )r@   rA   rC   rB   )
maprN   rH   rA   fallbackPassfallbackBlockrC   pairsr,   samples)r(   rF   getr#   tupler   r   list	enumeratezip
setdefaultr'   r!   most_commonr   rK   )mapsclasseslimit_per_mapsample_limitrowsmap_nameinforN   entryknownpairknown_pairscountsfallback_passfallback_blockpair_countspair_samplespair_pointsrW   indexrH   maskrA   r   r   r@   
pair_counts                              r   	summarizers   R   sA    D . B$88O,E)1D0EqIGR(EIIfb)*S7B1G-HH/4yyb/IJtuT{J$)IIlB$?N
 E$KN
 
  'y&-i'.y/:7/C469DT9J)4T):#,Sh1BDNSTDU-V#W 	E<D$u}t ;4LALd#q(###T4LT']*d7m+3 
 t%,,T']*d7m+. 
 axd#q(#t$)$74=!L0$$g.$w-/"& )	4 "--m< 	KD%&t,J(.KKK" *!, -j+ F /:$.?.K.K.M +
 #)!+(5*.(J*.!)J) #/f~"> 2+tD"4=+ 	SBF K K N
`s   (K	K;.Kc                    t        d| d      S )Nz# Map Tile Class Gapsz../web)markdown_table)rc   s    r   markdownrv      s     r   c                  	 | dddddddg}|D ]  		d   r	d   d   nddd} d		d
    d}dj                  	fd	d   D              }dj                  	fd	j                  dg       D              }dj                  	fd	j                  dg       D              }|j                  d	d
    d	d    d	d    d	d    d	d    d| d| d	d    d	d    d| d| d        |j                  d       dj                  |      S )N z:Generated from `out/maps.js` and `data/tile_classes.json`.zThese rows show the highest-use unclassified `layer0` tile IDs per map. `review` opens the map around the sample tile in `map_review.html`; component and sample links open the overview game view with collision and focus enabled.zt| map | tileset | tile | count | fallback | components | pairs | fallback pass | fallback block | review | samples |zG| --- | --- | ---: | ---: | --- | --- | --- | ---: | ---: | --- | --- |rW   r   )r   r   z/map_review.html?map=rS   z&tileLabels=1z, c              3     K   | ]G  }d |d    d|d    d|j                  dd       d dd	    d
|d    d|d    d|d    d|d    d I yw)[r   r;   r    L1=r@   ?](/game.html?map=rS   &startTile=&focusTile=&collision=1&overview=1)N)rX   ).0r   row
web_prefixs     r   	<genexpr>z!markdown_table.<locals>.<genexpr>   s      
  c
|1U3ZLUYYx-E,FbTcdghmdnco%*QuSzl+eCj\5QT:,Vnp
s   AA c              3     K   | ]F  }d |d    d|d    d|d    d dd    d	|d
   d    d|d
   d    d|d
   d    d|d
   d    d H yw)z[L1=r@   :rA   /rC   r}   r~   rS   r   rB   r   r;   r   r   r   Nr   )r   rh   r   r   s     r   r   z!markdown_table.<locals>.<genexpr>   s      
  4>"!DM?!D4H3IJ<Wfgjkpgqfr$x.-.aXs0C/D$x.-.aXs0C/DD\^
s   AArV   c              3     K   | ]U  }d t        |d          d|d    d|d    d|d    d d	d
    d|d   d    d|d   d    d|d   d    d|d   d    d W yw)rz   r=   r{   r@   z xrA   r   rC   r}   r~   rS   r   rB   r   r;   r   r   r   N)r>   )r   r"   r   r   s     r   r   z!markdown_table.<locals>.<genexpr>   s      

 	 Ih/01i6I5J"YW^M_L``abklzb{a| }|?3u:,)H-c231Yx5H5M4N)H-c231Yx5H5M4NNfh
s   AAr,   |  | rN   rH   rA   rC   rT   rU   z | [review](z) | z |
)joinrX   r'   )
titlerc   r   linesfirstreviewrW   rV   r,   r   s
     `      @r   ru   ru      s   
D
	g
~Q
E  
%(^Iq!qq9Il/E
| 	 )) 
 Y
 

  
 ,	
 
 XX 

 !WW\26
 

 	UCI/s3v;-s3w<.PS>"#3zl#eWCN@S?TTWX[\kXlWm nxtG9B0	
1
: 
LL99Ur   c                    i }| D ]&  }|j                  |d   g       j                  |       ( t        |      D ci c]  }|||   
 c}S c c}w )NrS   )r]   r'   r(   )rc   groupedr   names       r   rows_by_mapr      sV    %'G 73u:r*11#67,27O<DD'$-<<<s   Ac           	     $   |j                  dd       g }t        |       j                         D ]^  \  }}|| dz  }|j                  t	        d| d|d      d       |j                  |t        |      t        d	 |D              |d
       ` |S )NTparentsexist_okz.mdz# z Tile Class Gapsz	../../webutf-8encodingc              3  &   K   | ]	  }|d      yw)rA   Nr   )r   r   s     r   r   z"write_map_pages.<locals>.<genexpr>   s     9G9s   )rS   rc   usespath)mkdirr   rF   
write_textru   r'   r!   sum)rc   out_dir
index_rowsrd   map_rowsr   s         r   write_map_pagesr      s    MM$M.J)$/557 (H:S))Rz)9:HkR 	 	
 	M999	
 	 r   c                   g d}| D ]X  }|d   j                  |      }|j                  d|d    d|d    d|d    d|j                   d	|j                          d
       Z |j                  d       dj	                  |      S )N)z# Map Tile Class Gap Indexrx   z.Generated from `out/map_tile_class_gaps.json`.rx   z| map | rows | uses | page |z| --- | ---: | ---: | --- |r   r   rS   r   rc   r   z | [r}   z) |rx   r   )relative_tor'   r   as_posixr   )r   r   r   r   rels        r   index_markdownr      s    E  k&k%%g.r#e*SVSVT#((SUVYVbVbVdUeehijk 
LL99U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        d       | j                  dt        d       | j                         }t        t        |j                        t        |j                        |j                  |j                        }|j                   j"                  j%                  dd       |j                   j'                  t)        j*                  |dd      dz   d       |j,                  j'                  t/        |      d       t1        ||j2                        }|j2                  dz  j'                  t5        ||j2                        d       t7        dt9        |       d|j,                          y )N)descriptionz--mapszmaps.js)typedefaultz	--classesztile_classes.jsonz
--json-outzmap_tile_class_gaps.jsonz--outzmap_tile_class_gaps.mdz--split-dirmap_tile_class_gapsz--limit-per-map   z--sample-limit   Tr   F)r;   r   )ensure_ascii
separatorsr   r   r   zindex.mdzwrote z map tile class gap rows -> )argparseArgumentParser__doc__add_argumentr   OUTDATAint
parse_argsrs   r   r_   load_tile_classesr`   ra   rb   json_outparentr   r   jsondumpsr
   rv   r   	split_dirr   printr!   )parserargsrc   r   s       r   mainr      s   $$9F
tS9_E
$?R8RS
4?Y9YZ
dC:R4RS
D#@U:UV
)R@
(sA>DYtyy)+<T\\+JDL^L^`d`q`qrDMMtd;MMTZZ5ZX[__jqrHH9 t~~6J	^^j ,,^J-Wbi,j	F3t9+9$((
DEr   __main__)r   r   r   r   returnstr)r)   
list[dict]r   zlist[list[dict]])r)   r   r   dict[str, int])r=   r   r   r   )   )rG   z!dict[tuple[int, int], list[dict]]rH   r   rI   r   r   r   )r   r   )
r_   zdict[str, dict]r`   zdict[str, dict[str, list[int]]]ra   r   rb   r   r   r   )rc   r   r   r   )r   r   rc   r   r   r   r   r   )rc   r   r   zdict[str, list[dict]])rc   r   r   r   r   r   )r   r   r   r   r   r   )r   None)"r   
__future__r   r   r   collectionsr   r   pathlibr   summarize_map_tilesr   tile_classesr   r   __file__resolver   ROOTr   r   r   r0   r9   r>   rK   rs   rv   ru   r   r   r   r   __name__r   r   r   <module>r      s    K "   ,  ) 2 H~''*
Ulf}m*PR2 	J
J,J J 	J
 JZ*Z=$ F( zF r   