
    UHju                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ  ee      j                         j                  d   Zedz  Zed	z  Zg d
Zh dZh dZh dZdddddgdddddgdddddddddddddddgdddddgdddddgdddddgdddddgddddddddddgddddddd d!d"dgd#d$dd"dd%d&dd"dgd'd(d ddd)d!d ddgdddddgd*ddd+dgd*ddd+dgd*ddd+dgd,Zd-d.d/ddd d d0ddddd1d"d2d3d4ddd!d!d0ddddd1d"d2d5d6d7dd!d d0ddddd1d"d2d8d9d:dd7dd0ddddd1d"d2giZi d-d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZdYdYd[d\d]d]d^d_d`Zg daZdrdbZdsdcZdtddZdudeZdvdfZdwdxdgZdwdxdhZ 	 	 	 	 	 	 	 	 	 	 	 	 dydiZ!dzdjZ"d{dkZ#d|dlZ$d}dmZ%d~dnZ&ddoZ'ddpZ(e)dqk(  r e* e(             y)z?Build compact data for the UI window/frame CNS assembly review.    )annotationsN)Path)Any)decompress_cnsparse_image   outextract_fld)windowframestatusnumiconicon_sitembtl_etcface_01cara_fntlogo_00titlecompileaaa>   r   r   r   >   r   r   r   r   r   r   >   r   r   r   u   16x16 확정 셀   zconfirmed-grid)label	cellWidth
cellHeightr   u   640x352 전체 프레임confirmed-full-framez	EXE rectszexe-rect16x16review32x16    u   16x16 확정 0-9 x 4색confirmed-glyph-grid32x32u   80x80 초상화 gridP   u   48x64 EXE 후보0   @   	candidateu   11x16 후보   u   8x16 후보   z
144x48 EXE   64x48u   640x480 전체 화면confirmed-full-screen)r   r   r   r   r   r   r   r   r   01234567r   r   r   r   r   r   window_0_0_48_border16zwindow 0,0 48x48 / border 16xywh)lefttoprightbottom)idr   sourceborderr   window_0_0_64_border16zwindow 0,0 64x64 / border 16window_96_0_64_48_border16zwindow 96,0 64x48 / border 16`   window_160_0_96_32_border16zwindow 160,0 96x32 / border 16   um   창/대화상자 조립용 16x16 셀 sheet. 전체 18열x4행 셀 번호를 조합해 프레임을 만든다.r   u   게임 화면을 둘러싸는 640x352 단일 프레임 오버레이. 테두리를 제외한 내부는 투명이며 나누거나 9-slice로 조립하지 않는다.r   uw   0x0047e3e0의 23개 EXE rect 후보가 잡히지만 실제 status.cns 소비처로 확정하지 않은 UI 조각 sheet.r   us   숫자 glyph sheet. 16x16 셀 10열x4행이며 각 행은 흰색/초록색/노란색/빨간색 0-9로 확정한다.r   u\   item/skill command 쪽 32x32 아이콘 grid는 기존 ui_grid_review에서 확정된 영역.r   u<   작은 아이콘 sheet. 32x32 단위로 우선 확인한다.r   uL   장비/아이템 32x32 grid는 기존 ui_grid_review에서 확정된 영역.r   uR   전투 숫자/MISS/HIT/표시 조각 sheet. EXE rect table을 우선 적용한다.r   uj   얼굴 초상화 sheet. 80x80 grid 16칸을 기본으로 보고 EXE 후보 rect는 근거로만 남긴다.r   uS   캐릭터 이름/표기용 후보. EXE rect table은 144x48 중심으로 잡힌다.r   uE   오프닝 로고 조각. EXE rect 2개(E0/E1)를 우선 적용한다.r   uL   타이틀 전체 화면 이미지. 640x480 단일 화면으로 표시한다.r   uQ   COMPILE 로고 전체 화면 이미지. 640x480 단일 화면으로 표시한다.r   uM   AAA 로고 전체 화면 이미지. 640x480 단일 화면으로 표시한다.r-   u   숫자/문구 계열 작은 UI sheet. EXE rect 근거가 없어 전체 이미지로 보고 11x16/8x16은 후보로만 검토한다.ds14_au:   엔딩/타이틀 계열 전체 화면 UI 이미지 후보.ds14_bu)   엔딩 전체 화면 UI 이미지 후보.u/   엔딩 크레딧/문구 계열 작은 UI strip.u   16x16 UI 조각 후보.u.   spot 표시/문구 계열 UI 이미지 후보.u)   전체 화면 UI/연출 이미지 후보.)ds14_ededed_compip_spp_wbspotsun))whiteu   흰색)greenu	   초록색)yellowu	   노란색)redu	   빨간색c                p    	 t        j                  | j                  d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError)pathfallbacks     8/home/exedev/hwanse/tools/build_ui_window_review_data.py	load_jsonrX      s5    zz$..'.:;; s   $' 55c                   t        t              }t        |      }| j                  d      xs g D ]Y  }|j                  d      }|r||v r|j                  d      dk(  s	|t        v s8|j                  |       |j                  |       [ t        t              D ])  }||vs|j                  |       |j                  |       + |S )NrowsassetKeycategoryui-misc)listPREFERRED_TARGET_ASSETSsetgetALWAYS_INCLUDE_ASSETSappendaddsorted)frame_assetstargetsseenrowassets        rW   target_assetsrk      s    *+Gw<D'-2 
#77:)+u8M/MNN5!HHUO -. NN5!HHUO N    c                   | sy | j                  d      xs g }| j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d	      |D cg c]M  t        fd
dD              r7t        d         t        d         t        d         t        d         dO c}d	S c c}w )Nrectsschemastride
frameCounttableStartVaHex
fieldLabelfieldPlus4BoundboundaryKindmatchesAutoCountSetc              3  &   K   | ]  }|v  
 y w)N ).0keyrects     rW   	<genexpr>z compact_table.<locals>.<genexpr>   s     ?33$;?s   r/   r0   r1   r2   r3   )	ro   rp   rq   rr   rs   rt   ru   rv   rn   )ra   allint)tablern   r{   s     `rW   compact_tabler      s    IIg$"E))H%))H%ii- 99%67ii- 99%67		.1$yy)>? 
?*>?? d3i.s49~CS	NQTUYZ]U^Q_`
 
s   AC6c                    t         |  dz  }|j                         sy 	 t        t        |j	                                     \  }}}}}|sy |d   D cg c]  }t        |       c}S # t
        $ r Y y w xY wc c}w )N.cnsr   )EXTRACT_FLDexistsr   r   
read_bytes	Exceptionr~   )rj   rU   _width_heightpalette_pixels_bppvalues           rW   palette0_rgbr      s}    E7$'D;;=2=nT__M^>_2`/'4 $+AJ/5CJ//	   0s   (A& A5&	A21A2c                     g } t        t              D ]O  \  }\  }}t        d      D ]9  }| j                  |dz  |z   |||| d| t	        |      d|dz  |dz  ddd       ; Q | S )N
    zconfirmed 16x16 glyphr   )indexdigitcolorKey	colorNamer   overlayLabelsourceLabelr0   r1   r2   r3   )	enumerateNUM_GLYPH_ROWSrangerc   str)glyphs	row_index	color_key
color_namer   s        rW   num_glyph_mapr      s    F.7.G *	*Iz2Y 	EMM&^e3" )!+ *|1UG4$'J#:"R	" Mrl   c                4   t         |  dz  }|j                         sg S 	 t        t        |j	                                     \  }}}}}g }	||z  }
||z  }t        |      D ]  }t        |
      D ]  }||z  }||z  }d}t        |t        ||z   |            D ]4  }||z  |z   }|t        |||z
        z   }|t        d ||| D              z  }6 |sb||
z  |z   }|	j                  |||d| d| t        |      d|||||d         |	S # t
        $ r g cY S w xY w)Nr   r   c              3  ,   K   | ]  }|d k7  s	d  ywr   r   Nrx   ry   r   s     rW   r|   z*nontransparent_cell_map.<locals>.<genexpr>       %UE%ST*a%U   
rz czreview 16x16 cell)r   columnri   r   r   r   r0   r1   r2   r3   nontransparentPixels)r   r   r   r   r   r   r   minsumrc   r   rj   
cell_widthcell_heightrU   widthheight_palettepixelsr   cellscolumnsrZ   r   column_indexx0y0nontransparentr1   startendr   s                        rW   nontransparent_cell_mapr      sz   E7$'D;;=	0;N4??K\<]0^-vx Ez!G[ D4[ 	!'N 	L
*B[(BN2s2#3V<= VE	Bc*ebj99#%UVE#5F%U"UUV "',6ELL"*$ 2l^<$'J#6#$,:	6 LA  	s   (D	 	DDc                $   t         |  dz  }|j                         sg S 	 t        t        |j	                                     \  }}}}}g }	||z  }
||z  }t        |      D ]  }t        |
      D ]  }||z  }||z  }d}t        |t        ||z   |            D ]4  }||z  |z   }|t        |||z
        z   }|t        d ||| D              z  }6 ||
z  |z   }|	j                  |||d| d| d||||||dk(  d         |	S # t
        $ r g cY S w xY w)Nr   r   c              3  ,   K   | ]  }|d k7  s	d  ywr   rx   r   s     rW   r|   z full_cell_map.<locals>.<genexpr>-  r   r   #zconfirmed window 16x16 cellr   r   ri   r   r   r   r0   r1   r2   r3   r   empty
r   r   r   r   r   r   r   r   r   rc   r   s                        rW   full_cell_mapr     sv   E7$'D;;=	0;N4??K\<]0^-vx Ez!G[ D4[ 	!'N 	L
*B[(BN2s2#3V<= VE	Bc*ebj99#%UVE#5F%U"UUV ',6ELL"*$ [&'wK#@#$,:+q0	4 L?  	s   (D DDc               .   t         |  dz  }|j                         sg S 	 t        t        |j	                                     \  }}}}	}
g }||z  }||z  }t        |      D ]  }t        |      D ]  }||z  }||z  }d}t        |t        ||z   |            D ]4  }||z  |z   }|t        |||z
        z   }|t        d |	|| D              z  }6 |s|sd||z  |z   }|j                  |||d| d| |||||||dk(  d         |S # t
        $ r g cY S w xY w)Nr   r   c              3  ,   K   | ]  }|d k7  s	d  ywr   rx   r   s     rW   r|   z!sheet_cell_map.<locals>.<genexpr>\  r   r   r   r   r   )rj   r   r   include_emptysource_labelrU   r   r   r   r   r   r   r   rZ   r   r   r   r   r   r1   r   r   r   s                          rW   sheet_cell_mapr   B  s    E7$'D;;=	0;N4??K\<]0^-vx Ez!G[ D4[ 	!'N 	L
*B[(BN2s2#3V<= VE	Bc*ebj99#%UVE#5F%U"UUV !',6ELL"*$ [&'wK#/#$,:+q0	8 LC  	s   (D DDc                    t         |  dz  }|j                         sy 	 t        t        |j	                                     \  }}}}}t        d |D              }||z  }ddddd|||||rt        ||z  dz  d      d	
S dd	
S # t
        $ r Y y w xY w)
Nr   c              3  ,   K   | ]  }|d k7  s	d  ywr   rx   r   s     rW   r|   z"full_frame_meta.<locals>.<genexpr>{  s     =u%1*=r   u   전체 화면 프레임fullzconfirmed full-frame overlayr   d      )
r   r   r   r0   r1   r2   r3   r   totalPixelscoveragePercent)r   r   r   r   r   r   r   round)	rj   rU   r   r   r   r   r   r   totals	            rW   full_frame_metar   s  s    E7$'D;;=0;N4??K\<]0^-vx ===NFNE*5 .GL5.5"8C!?C  ST 	  s   (B 	BBc               6    | sy t        |       } || d<   || d<   | S )Nr   r   )dict)metar   r   s      rW   relabel_full_imager     s)    :DDM&DKrl   c                l   |j                  d      xs g D ci c]  }|j                  d      | }}|j                  d      xs g D ci c]  }|j                  d      | }}|j                  |       xs i }|j                  |       xs i }| t        v rt        |j                  d            nd }| t        v r|j                  d      xs g d d ng D cg c]  }t        |       }	}|	D cg c]  }|s|	 }	}|xs	 |	r|	d   nd }
d}|rd	}n|	rd
}i d| d|j                  d      xs |  dd|j                  d      xs d|  dd|j                  d      xs |j                  d      d|j                  d      xs |j                  d      d|j                  d      d|j                  d      dt        |       dddt        j                  | d      d|j                  d      xs i dt
        j                  |       xs g d|d|	d|d|
dt        j                  |       xs g }| dk(  r-|j                  dd g d t               ddddd dd!d"d#d$d%
d&       |S | d'k(  rzt        | dd      }|j                  d(d d g |ddddt        |j                  d      xs ddz        t        |j                  d      xs ddz        t        |      d)d*d$d+d,d-       |S | d.k(  rOt        |       }|j                  d/d g d g |dd|j                  d      |j                  d      d0d0d0d1d$d2d3
d4       |S | d5k(  rYt        t        |       d6d78      }|j                  d9d g |dd|j                  d      |j                  d      d0d0d0d:d;d<d3
d=       |S | d>k(  r{t        | d?d?d@dAB      }|j                  dCd |ddd?d?t        |j                  d      xs dd?z        t        |j                  d      xs dd?z        t        |      dDdEd$dFd,dG       |S | dHk(  r[t        t        |       d6d78      }|j                  d9d g d g |dd|j                  d      |j                  d      d0d0d0dId;dJd3
d4       |S | dKv r| dLv rdMndN}t        | dOdOd@| dPB      }|j                  |d |	d g |dddOdOt        |j                  d      xs ddOz        t        |j                  d      xs ddOz        t        |      d)dQ| dLv rd$nd;dRd,dS       |S | t        v r[t        t        |       dTdU8      }|j                  dVd g d g |dd|j                  d      |j                  d      d0d0d0dWd$dXd3
d4       |S |j                  dY      dZk(  r|
s|j                  d      d[k(  r|j                  d      d\k(  rdVnd9}
t        t        |       |
dVk(  rdTnd6|
dVk(  rdUnd78      }|j                  |
d |	d g |dd|j                  d      |j                  d      d0d0d0d]|
dVk(  rd$nd;d^d3
d4       |S c c}w c c}w c c}w c c}w )_NrZ   r[   rj   	bestTablecandidateTables   r   nonezbest-exe-rectzcandidate-exe-rectcnsr   rU   z../extract_fld/r   r   bpppaletteColorstransparentRgbtransparentSourcezcns-palette-index-0note 	frameHintgridCandidatesselectedRectSource	rectTablenineSliceCandidatesr   r"   r   r   (   z.rows white,green,yellow,red; columns digit 0-9zmanual-confirmed-num-glyph-grid	confirmed)
sourceXsourceYsourceWidthsourceHeightr   rZ   rq   order	inference
confidence)r   r   r   r   glyphMapr   r   zconfirmed-16x16-cell-gridzrow-major 0-based cell indicesz!manual-confirmed-window-cell-gridztEvery 16x16 cell is exposed, including transparent cells, so manual frame recipes can reference stable cell numbers.)r   r   r   r   r   rZ   rq   r   r   r   r   )r   r   r   r   cellMapr   r   r   r   z#manual-confirmed-full-frame-overlayz<A single transparent overlay that surrounds the game screen.)
r   r   r   r   r   rZ   rq   r   r   r   )r   r   r   r   r   	fullFramer   r   u   전체 이미지zreview whole-image UI)r   r   zreview-full-imagez manual-review-whole-status-imager   zThe 0x0047e3e0 EXE rect table is retained in candidateTables only; it is not promoted until a draw-call/consumer match is proven.)r   r   r   r   r   r   r$   Tzconfirmed 80x80 face cell)r   r   zconfirmed-80x80-face-gridz row-major 0-based portrait cellsz manual-confirmed-face-80x80-gridzmPrompt portraits are laid out as 80x80 cells; EXE 48x64 rect candidates are kept only as unpromoted evidence.)r   r   r   r   r-   z"manual-review-whole-01234567-imagez\No EXE rect table is promoted for this sheet. 11x16/8x16 remain visual grid candidates only.>   r   r   r   >   r   r   zconfirmed-32x32-cell-gridzreview-32x32-cell-gridr!   z cellzmanual-ui-32x32-cell-gridzjCells are exposed here for UI CNS inspection; item/action semantic mappings remain in ui_grid_review.html.)r   r   r   r   r   r   r   u   전체 화면 UIzconfirmed full-screen UI imager,   zmanual-confirmed-full-screen-uiz&A single full-screen UI/opening image.r\   r]   i  i  zmanual-review-whole-ui-imagezPWhole-image review fallback for UI/misc CNS without a promoted rect or cell map.)ra   RECT_REVIEW_ASSETSr   r   ASSET_NOTESGRID_CANDIDATESNINE_SLICE_CANDIDATESupdater   r   r~   lenr   r   r   FULL_SCREEN_ASSETS)rj   rf   	rect_scanri   
frame_rows	scan_rows	frame_rowscan_row
best_tablecandidate_tablesselectedselected_statusr9   cell_map
full_framer   s                   rW   source_for_assetr    s   6B6F6Fv6N6TRTUs#''*%s*UJU2;--2G2M2N3!3&NINu%+I}}U#)rH=BFX=Xx||K89^bJ DIL^C^X\\"34:BQ?df 	c  (8?3??P5E.q14HO)	.y}}U#5%~ 		f%F?5')F 	w'@8<<+@	
 	)--)CX\\(-C 	y}}U# 	7 	,u- 	2 	r* 	Y]];/52 	/--e4: 	Z 	+ 	o  	X!" 	488?E2#F& ~&<!#%!)O  #%$&!"$M!B"-	
` Mw 
(	 B/&A!!')#  #%$&"FJJw$7$<1#CDH!5!:r AB"%h-=!D"- S	
r MG 
'	$U+
&<!#%!')'  #)::g#6$*JJx$8 "#!F"-Z	
B MW 
(	'E"$0


 	&9!')'  #)::g#6$*JJx$8 "#!C"* `	
J Mc 
)	!4
 	&A!#  #%$&"FJJw$7$<1#CDH!5!:r AB"%h-?!C"- L		
R Mk 
*	'E"$0


 	&9!#%!')'  #)::g#6$*JJx$8 "#!E"*z	
^ Ms 
,	,059I0I,Og!"85)
 	&,!#3!')#  #%$&"FJJw$7$<1#CDH!5!:r AB"%h-=!<16:J1J+PX I	
` Ms 
$	$'E"$9


 	&=!#%!')'  #)::g#6$*JJx$8 "#!B"-D	
f M; 
z	"i	/.4jj.AS.HVZZX`MaehMh*  oB'E"(04K(K$Qc=EI`=`9f}


 	&.!#3!')'  #)::g#6$*JJx$8 "#!?19=T1T+Zbn	
, Mi VN @s   X"
X'X,/X17X1c           	        t        | i       }t        |i       }t        |      D cg c]  }t        |||       }}|D cg c]H  }|j                  d      s3|j                  d      s"|j                  d      s|j                  d      r|J }}ddt	        | j                  t                    t	        |j                  t                    gt        |      t        |      t        d |D              |g dd	S c c}w c c}w )
Nr   r   r   r   zui-window-cns-assembly-reviewz`All ui-misc CNS image sheets plus btl_etc/face_01/cara_fnt review units and EXE rect candidates.c              3  D   K   | ]  }|j                  d       sd  yw)r   r   N)ra   )ry   rj   s     rW   r|   z build_summary.<locals>.<genexpr>  s     "]EIIF[<\1"]s     )	zFThis is a review workbench, not a promotion of every UI assembly rule.zitem.cns/icon.cns 32x32 semantic mappings remain in ui_grid_review.html; this page also exposes the source cells for visual inspection.zPframe.cns is a confirmed full-screen frame overlay, not a sliced assembly sheet.zPnum.cns is a confirmed 16x16 digit glyph sheet, not an EXE rect candidate table.zstatus.cns is shown as a whole-image review by default; the 23-entry EXE rect table at 0x0047e3e0 is retained only as unpromoted candidate evidence.zgwindow.cns is now a confirmed 16x16 cell sheet; frame recipes still need manual/EXE draw-call evidence.zface_01.cns defaults to 80x80 portrait cells; 01234567.cns remains whole-image review because no EXE rect consumer has been promoted.zwAll ui-misc CNS rows from cns_frame_assets.json are included here, including 01234567, ds14_*, ed*, p_*, spot, and sun.zzaaa.cns, compile.cns, and title.cns are full-screen UI/opening images; logo_00.cns and btl_etc.cns keep EXE rect evidence.)r   scoper9   
assetCountrectAssetCountnineSliceAssetCountassetsnotes)	rX   rk   r  ra   r   relative_toROOTr   r   )frame_assets_pathrect_scan_pathrf   r   rj   r  rect_assetss          rW   build_summaryr    s    .3L."-ILYZfLgh5ulI>hFh 99[!UYYz%:eii	>RV[V_V_`kVl 	K  2s!--d34**401
 &kk*""]&"]]

  is   C8 AC=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_okzui_window_review_data.jsonFr   )ensure_asciiindent
rN   rO   ui_window_review_data.jsz&window.HWANSE_UI_WINDOW_REVIEW_DATA = ),:)r  
separatorsz;
)mkdir
write_textrQ   dumps)summaryout_dirs     rW   write_outputsr"    s    MM$M.++77

7q9D@ 8  ))550
**W5Z
H	I
	 	 6 rl   c                 
   t        j                  t              } | j                  dt        t
               | j                  dt        t
        dz         | j                  dt        t
        dz         | j                         S )N)descriptionz	--out-dir)typedefaultz--frame-assetszcns_frame_assets.jsonz--rect-scanzcns_frame_rect_exe_scan.json)argparseArgumentParser__doc__add_argumentr   OUT
parse_args)parsers    rW   r,  r,    sm    $$9F
$<
(tSCZ=Z[
D#@^:^_rl   c            	         t               } t        | j                  | j                        }t	        || j
                         t        d|d    d|d    d| j
                  dz          y)Nzwrote r  z UI CNS review assets, r	  z with rect data -> r  r   )r,  r  rf   r   r"  r!  print)argsr   s     rW   mainr1    sn    <DD--t~~>G'4<<(	
&''>#$
%%8Hb9b8c	e rl   __main__)rU   r   rV   r   returnr   )rf   r   r3  z	list[str])r   dict | Noner3  r4  )rj   r   r3  zlist[int] | None)r3  list[dict[str, Any]])r   r   )rj   r   r   r~   r   r~   r3  r5  )rj   r   r   r~   r   r~   r   boolr   r   r3  r5  )rj   r   r3  dict[str, Any] | None)r   r7  r   r   r   r   r3  r7  )rj   r   rf   r   r   r   r3  r   )r  r   r  r   r3  r   )r   r   r!  r   r3  None)r3  zargparse.Namespace)r3  r~   )+r)  
__future__r   r'  rQ   pathlibr   typingr   
decode_cnsr   r   __file__resolver  r  r+  r   r_   rb   r   r   r   r   r   r   rX   rk   r   r   r   r   r   r   r   r   r  r  r"  r,  r1  __name__
SystemExitrx   rl   rW   <module>rA     s/   E "     2 H~''*
Ul]" "    %2RScd 3RS_uvwAQ*U"Q"Q ,"BZpq RrM]^_ rxXYRrM]^_AQ*U"Q
 )rWgh$2RS^_
 !r{[ar[Y
 SjY"Q &AQR\]^/aq\stu1QR^uvw-AQZqrsG$N *3ABR8!"rRH!	
 +3ABR8!"rRH!	
 /4QRb9!"rRH!	
 05abr:!"rRH!	
- B}  r   H 
  A	
 j L Z c { e V [ b 
Z   V  J!" J#$ L
5A%%<616"*
0,&R%P... .
 . . .b0UpD z
TV
 rl   