
    UHjy;                    H   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	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"dZd#dZd$dZd%dZedk(  r e e             y)&z8Build a frame-review index for non-map CNS image assets.    )annotationsN)Counter)Path   outc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     3/home/exedev/hwanse/tools/build_cns_frame_assets.py	load_jsonr      s*    ;;=::dnngn677    c                    | j                  d      ry| j                  d      ry| j                  d      ry| j                  d      ryy	)
N)bosszenemy-objectcara_	characterbtl_battleface_faceui-misc)
startswith)stems    r   category_forr"      sA    }%wvwr   c                2    ddddddj                  | |       S )Nu   전투/효과u	   캐릭터u   몬스터/오브젝트u   얼굴u   아이템/UI/문구)r   r   r   r   r   get)categorys    r   category_labelr'   "   s)    ! 0( 
c(Hr   c                    t        j                  | d      }|dk(  rd| S |dk(  rd| S |dv rd| S |d	k(  r
| d
k(  rd| S |d	k(  rd| S d| S )NT)quoter   z!../web/monster_review.html?asset=r   z)../web/field_character_review.html?asset=>   r   r   z#../web/ui_window_review.html?asset=r   btl_etcz.../web/battle_effect_visual_review.html?asset=z"../web/cns_rect_review.html?asset=)htmlescape)	asset_keyr&   encodeds      r   review_href_for_assetr/   ,   s    kk)40G>!27)<<;:7)DD&&4WI>>8	Y 64WI>>8?yII/y99r   c                   t        |j                  d      xs d      }t        |j                  d      xs d      }| dv r)dddd|r|dz  nd|r|dz  nd|r|r|dz  |dz  z  ndddd		S | d
k(  r)dddd|r|dz  nd|r|dz  nd|r|r|dz  |dz  z  ndddd		S | dv r)dddd|r|dz  nd|r|dz  nd|r|r|dz  |dz  z  ndddd		S | dk(  r)dddd|r|dz  nd|r|dz  nd|r|r|dz  |dz  z  ndddd		S | dv r)dddd|r|dz  nd|r|dz  nd|r|r|dz  |dz  z  ndddd		S dd|rt        d|      nd|rt        d|      nd|rt        d|t        d|      z        nd|rt        d|t        d|      z        nddddd		S )Nwidthr   height>   cara_at1cara_rs1cara_sm10   @   confirmed-character-walk-gridhigh	sourceXsourceYsourceWidthsourceHeightcolumnsrows
frameCount	inference
confidenceface_01P   zreview-initial-grid-face-80medium>   iconitem    zreview-initial-grid-32num   zreview-initial-grid-16low>   r*   cara_efczreview-initial-grid-effect-64r   zreview-starting-grid-only)intr%   minmax)r!   rowr1   r2   s       r   default_frame_hintrR   ;   s8    %A&E"'a(F33&+u{$*FbL<Af5B;6R<8RS8 

 
	
 y&+u{$*FbL<Af5B;6R<8RS6"

 
	
 &+u{$*FbL<Af5B;6R<8RS1"

 
	
 u}&+u{$*FbL<Af5B;6R<8RS1

 
	
 &&&+u{$*FbL<Af5B;6R<8RS8

 
	
 ).s2u~B+1Br6;3q%3r5>125;AvR010
 
r   c                   i }| D ][  }|j                  d      }|sg }g }|j                  d      xs g D ]  }|j                  d      xs g D ]  }|j                  |j                  dd      |j                  dd      |j                  d|j                  dd	            |j                  d
|j                  dd            |j                  dd       d|j                  dd       |j                  d      |j                  d      d       |j                  |j                  dd       d|j                  dd                |j                  d      xs g D ]  }|j                  |j                  dd      |j                  dd      |j                  dd	      |j                  dd      d|j                  d       d|j                  d       |j                  d      d        dd|j                  dd	      |j                  dd      |j                  d      |j                  d      |j                  d      xs g |j                  d      xs g |d 	||<   ^ |S )!Nfile
directionsframesr;   r   r<   r1   
frameWidthr6   r2   frameHeightr7   name?:indexbboxopaquePixels)xywhlabelr]   r^   specialFramesz	special:rrQ   ccol)r_   r`   ra   rb   rc   r^    out/character_sprite_frames.jsonr8   walkFramesPerDirection	idleFramemovingFramesbackgroundRgb)	sourcestatusrW   rX   rh   ri   rj   rk   rects)r%   append)recordsr\   record	file_namern   labels	directionframes           r   character_frame_indexrv      sP   E %
JJv&	L17R 	WI"x06B 
W9a09a07FJJ|R,HI8VZZr-JK )fc :;1UYYwPQ=R<ST!IIf-$)IIn$=  vs!; <AeiiQR>S=TUV
W	W ZZ06B 	ELLYYy!,YYy!,ZZb1ZZr2$UYYu%5$6a		%8H7IJ %		. 9 	 95 **\26!::mR8&,jj1I&JK0"JJ~6<"#ZZ8>B

i7%
L Lr   c                    | j                  d      xs g D ci c]%  }|j                  d      r|j                  d      |' c}S c c}w )NspriteAssetsenemyCnsr$   )summaryrQ   s     r   battle_enemy_indexr{      sL     ;;~.4"77: 	
S   s   *Ac                    i }| j                  d      xs g D ]7  }|j                  d      }|s|j                  |g       j                  |       9 |S )NlinkedAssetRowsrY   )r%   
setdefaultro   )rz   r\   rQ   rY   s       r   descriptor_indexr      sW    #%E{{,-3 3wwvT2&--c23 Lr   c                   t        |      }t        |      }t        |      }g }| D ]  }	|	j                  d      dk7  rt	        |	j                  d      xs d      }
t        |
      j                  }|
r|j                  d      r`t        |      }|j                  |
      xs i }|j                  |
      xs g }|j                  |
      }t        |j                  d      xs t        ||	            }|r|j                  dd|j                  dd	      |j                  d
d      t        |	j                  d      xs d      t        |j                  dd	            z  t        |	j                  d      xs d      t        |j                  d
d            z  t        |j                  d      xs g       ddd	       |j                  i d|d|
dd| dd|dt        |      d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|d|d|j                  d      xs |dt!        |      d |d!t#        d" |D              t#        d# |D              t%        |D ch c]%  }|j                  d$      s|j                  d$      ' c}      d%        t%        |d& '      S c c}w )(NkindimagerY    map_	frameHintr   rW   r6   rX   r7   r1   r2   rn   r8   r9   r:   assetKeycnsr   z../extract_fld/z.cnsr&   categoryLabelbpppaletteColorsdecodedSize
pixelBytesconfirmedFramesselectionKindenemyObjectSpritedescriptorRowsdescriptorRefCountc              3  @   K   | ]  }|j                  d d        yw)resourceDescriptorRefCountr   Nr$   .0rH   s     r   	<genexpr>zbuild_rows.<locals>.<genexpr>   s     %lTXdhh/KQ&O%l   c              3  @   K   | ]  }|j                  d d        yw)sceneEventAnchorCountr   Nr$   r   s     r   r   zbuild_rows.<locals>.<genexpr>   s     (jRV2I1)M(jr   runtimeSurface)r   runtimeSurfacesc                    | d   | d   fS )Nr&   r    )rH   s    r   <lambda>zbuild_rows.<locals>.<lambda>   s    $z*:D<L)M r   )key)rv   r{   r   r%   strr   r!   r    r"   dictrR   updaterN   lenro   r'   boolsumsorted)cns_payloadscharacter_recordsbattle_enemy_summarydescriptor_summaryout_dircharacter_framesbattle_enemydescriptorsr@   rQ   rY   r!   r&   
battle_rowdescriptor_rowsr   
frame_hintrH   s                     r   
build_rowsr      s'    -->?%&:;L"#56KD ,776?g%3776?(b)Dztv.%!%%d+1r
%//$/52$((.	*..5V9KDRU9VW
(}}\2> )mR @swww/415Y]]<Y[=\9]]CGGH-23s9==XZ;[7\\!)--"8">B?<$
 
 	 

4
 odV40
 	

 ^H5
 SWWW%
 cggh'
 3775>
 SWW_5
 377=1
 #'',/
 
 y
 Z^^O<H
  j!1
  o!
" !#%l\k%l"l#
$ &)(jZi(j%j%o&|daeaiaijza{txx0@'A&|}'
 	1,Z $MNN '}s   )K2 K2c           
         t        d | D              }dg ddt        |       t        t        |j	                                     | dS )Nc              3  &   K   | ]	  }|d      yw)r&   Nr   )r   rQ   s     r   r   z build_summary.<locals>.<genexpr>   s     5S_5s   z4Non-map CNS image assets available for frame review.)zout/cns_payloads.jsonrg   z out/battle_enemy_candidates.jsonz)out/non_party_descriptor_asset_links.jsonznon-map-cns-frame-index)scoperl   rm   
assetCountcategoryCountsr@   )r   r   r   r   items)r@   countss     r   build_summaryr      sF    555FG
 ,$ivflln56 r   c                   ddddd| d    dt        j                  | d   d	       d
dddg	}| d   D ]  }|j                  d      xs i }|j                  d       d|j                  d       d|j                  d       }|j                  d      xs i }|j                  d|d    d|d    d|d    d|j                  d       d|j                  d       d| d|j                  dd       d         d!j	                  |      d!z   S )"Nz# CNS Frame Assetsr   zGNon-map CNS image assets exposed to the browser frame review workbench.z
- assets: r   z- category counts: `r   F)ensure_ascii`z:| asset | cns | category | size | frame hint | confirmed |z&| --- | --- | --- | ---: | --- | --- |r@   r   r=   r_   r>    rB   r   z| `r   z` | `r   z` | r&   z | r1   r2   rm   -z |
)r   dumpsr%   ro   join)rz   linesrQ   hint	hint_text	confirmeds         r   markdownr     sF   
Q

W\*+,
tzz'2B*CRWXYYZ[
D0
E v 
ww{#)rxx./q.1I0J!DHHU`LaKbc	GG-.4"	#j/"%E
|4J7Hwww #''("3!4C	{#immT\^aFbEcceg	
	
 99Ud""r   c                    g }| d   D ]}  }|j                  d      xs i }t        |d   |d         }|j                  d| dt        j                  |d          dt        j                  |d          d	t        j                  |d
          d|j                  d       d|j                  d       dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d      xs i j                  d      xs d             d        dj                  d t        | d   j                               D              }dj                  dddddd d!d"d#d$d%d&d'd(d)d*| d+    d,d-| d.d/d0dj                  |       d1d2d3dg      S )4Nr@   r   r   r&   z<tr><td><a href="z"><code>z</code></a></td><td><code>r   z</code></td><td>r   z	</td><td>r1   r_   r2   r=   r>   u    · rB   r   rm   r   z
</td></tr>r   c           	   3  l   K   | ],  \  }}d | dt        j                  t        |             d . yw)z<div class="card"><strong>z</strong><span>z</span></div>N)r+   r,   r'   )r   r&   counts      r   r   zhtml_page.<locals>.<genexpr>5  s<      He 'ug_T[[X`Ia=b<ccpqs   24r   r   z<!doctype html>z<html lang="ko">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z!  <title>CNS Frame Assets</title>z	  <style>z    body{font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#101214;color:#edf2f4;margin:24px;line-height:1.45}z    a{color:#9bd4ff} code{color:#f5eec8}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin:16px 0}z    .card{border:1px solid #303940;background:#151a1f;padding:10px}.card strong{display:block;font-size:22px}.card span{color:#aeb8bd}z    table{border-collapse:collapse;width:100%;font-size:13px}th,td{border:1px solid #303940;padding:7px 9px;text-align:left;vertical-align:top}th{background:#151a1f;position:sticky;top:0}z
  </style>z</head>z<body>z  <h1>CNS Frame Assets</h1>u     <p>비맵 CNS 이미지 r   u<   개를 프레임 검토 워크벤치에 연결합니다.</p>z  <div class="cards">z</div>z  <table><thead><tr><th>asset</th><th>cns</th><th>category</th><th>size</th><th>initial frame hint</th><th>confirmed</th></tr></thead>z	  <tbody>z</tbody></table>z</body>z</html>)	r%   r/   ro   r+   r,   r   r   r   r   )rz   r@   rQ   r   hrefcardss         r   	html_pager   &  sS   Dv 
ww{#)r$S_c*oF!F)DKKJ,H+I JSZ01 2;;s?345 6777#$Acggh&7%8 9;;s488M#:;<=Qt{{3txxXfOgKh?i>jjnosozoz{~  @D  @H  @H  IT  @U  |V  pW  oX X;;sCGG,=$>$D"#I#I(#S#ZWZ[\] ^		

 GG %g.>&?&E&E&GH E 99"P+ 	_ 	W 	Q 	F%
$W\%:$;;wx
!%/ 	Q
BGGDM?"23
-  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  dt        j                  | dd      z   dz   d	       y )NT)parentsexist_okcns_frame_assets.jsonF   )r   indentr   r	   r
   zcns_frame_assets.jsz!window.HWANSE_CNS_FRAME_ASSETS = ),r[   )r   
separatorsz;
)mkdir
write_textr   r   )rz   r   s     r   write_outputsr   S  s    MM$M.&&22

7q9D@ 3  $$00+
**W5Z
H	I
	 	 1 r   c                    t        j                  t              } | j                  dt        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                         S )N)descriptionz	--out-dir)typedefaultz--cns-payloadszcns_payloads.jsonz--character-frameszcharacter_sprite_frames.jsonz--battle-enemy-candidateszbattle_enemy_candidates.jsonz--non-party-descriptor-linksz%non_party_descriptor_asset_links.json)argparseArgumentParser__doc__add_argumentr   OUT
parse_args)parsers    r   r   r   a  s    $$9F
$<
(tSCV=VW
,4GeAef
3$NlHlm
6T3QxKxyr   c            	     n   t               } t        t        | j                  g       t        | j                  g       t        | j
                  i       t        | j                  i       | j                        }t        |      }t        || j                         t        d|d    d| j                  dz          y)Nzwrote r   z non-map CNS frame assets -> r   r   )r   r   r   r   r   battle_enemy_candidatesnon_party_descriptor_linksr   r   r   print)argsr@   rz   s      r   mainr   k  s    <D$##R($'',$..3$1126D D!G'4<<(	F7<())Ft||VmGmFn
opr   __main__)r   r   )r!   r   returnr   )r&   r   r   r   )r-   r   r&   r   r   r   )r!   r   rQ   r   r   r   )rp   
list[dict]r   dict[str, dict])rz   r   r   r   )rz   r   r   zdict[str, list[dict]])r   r   r   r   r   r   r   r   r   r   r   r   )r@   r   r   r   )rz   r   r   r   )rz   r   r   r   r   None)r   zargparse.Namespace)r   rN   ) r   
__future__r   r   r+   r   collectionsr   pathlibr   __file__resolver   ROOTr   r   r"   r'   r/   rR   rv   r{   r   r   r   r   r   r   r   r   __name__
SystemExitr   r   r   <module>r      s    > "      H~''*
Ul8	:IX(V8O8O!8O 8O 	8O
 8O 8Ov"#.*Z z
TV
 r   