
    &MjK                    T   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	 ddl
mZ  e	e      j                         j                  d   Zedz  d	z  Zed
z  Zedz  Zedz  Zedz  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 e!dk(  r e" e              y)&a  Summarize runtime evidence for the opening logo fade path.

The intro capture is useful because it separates three things that were
previously easy to conflate in static analysis:

* a full-screen CNS surface already present at trace start (`compile.cns`),
* a later full-screen CNS load/decode/upload (`aaa.cns`),
* the actual fade, which is observed as repeated DirectDraw palette updates on
  the primary surface rather than alpha blended image draws.
    )annotationsN)Counter)Path)Any   capturesruntimeoutwebzintro_runtime_fade_review.jsonzintro_runtime_fade_review.htmlzpalette_pipeline_review.jsonc                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)values    (tools/build_intro_runtime_fade_review.pyhr       s%    ;;U]r$GGE
$GG    c                p    | j                         si S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)paths    r   	read_jsonr   $   s*    ;;=	::dnngn677r   c                    g }t        | j                  d      j                         d      D ]A  \  }}|j                         st	        j
                  |      }||d<   |j                  |       C |S )Nr   r   r   _line)	enumerater   
splitlinesstripr   r   append)r   eventsline_nolineevents        r   load_eventsr*   *   sl    F"4>>7>#C#N#N#PRST zz|

4  ge Mr   c                     t        t        j                  d            } | sy g }| D ]F  }|j                  d      j                  d      }|j	                         s4|j                  ||f       H |sy |d   S )Nz*intro*.manifest.jsonr   z.jsonl)sortedCAPTURESglobwith_suffixr   r%   )	manifestspairsmanifestjsonls       r   latest_intro_tracer5   5   sw    x}}%<=>IE ,$$R(44X><<>LL(E*+, 9r   c                (   | si S i }ddddddj                         D ]2  \  }}t        j                  ||       }|s|j                  d      ||<   4 t        j                  d|       }|r(|j                  d       d	|j                  d
       |d<   |S )Nzcaller=(0x[0-9a-fA-F]+)zsrcRect=([0-9,\-]+)zdstRect=([0-9,\-]+)zsrcColorKey=([^ ]+)zappliedColorKey=([^ ]+))callersrcRectdstRectsrcColorKeyappliedColorKeyr   z at ([0-9\-]+),([0-9\-]+),   dstPoint)itemsresearchgroup)detailparsedkeypatternmatchats         r   parse_draw_detailrI   C   s    	F,))-5 eg	)W 		'6*++a.F3K	) 
/	8B	 "}Abhhqk];zMr   c                    g d}|D ci c]  }|| v s|| j                  |       }}| j                  d      r!t        | j                  d            }|r||d<   |S c c}w )N)$seqframetickstepr)   pcr7   runnerobjectstreamopcodeprevious_streamnext_streamprevious_opcodenext_opcodesurfaceHandlesourcedestinationsourceLabeldestinationLabelsourceResourceNamedestinationResourceNameresourceNameresourceTypearchiveOffset
imageWidthimageHeightcolorKeypaletteHash	pixelHash
byteLength	writeRectflagsnamerC   rawrC   rD   )getrI   )r)   keysrE   r
   rD   s        r   compact_eventrn   W   sh    %DL +/
?3#,3		#
?C
?yy"599X#67"CMJ @s
   	AAc                   g }g }d }| D ]X  }|j                  d      }t        |t              s%|||dz   k  r|j                  |       n|r|j                  |       |g}|}Z |r|j                  |       g }t	        |d      D ]  \  }}|d   }	|d   }
d }t        |	j                  d      t              r*t        |
j                  d      t              r|
d   |	d   z
  }|j                  i d|d|	j                  d      d	|
j                  d      d
|	j                  d      d|
j                  d      dt        |      dt        |	j                  d      t              rEt        |
j                  d      t              r&|
j                  d      |	j                  d      z
  dz   nd d|d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|
j                  d      d|D cg c]  }|j                  d       c}d|d d D cg c]  }t        |       c}        |S c c}w c c}w )NrL   r   r   r,   rM   runIndexfirstSeqrK   lastSeq
firstFrame	lastFrame
eventCount	frameSpantickSpanrX   r[   rO   r7   firstPaletteHashre   lastPaletteHashpaletteHashes
sampleRows   )rl   
isinstanceintr%   r"   lenrn   )rowsrunscurrentprevious_framerowrL   r
   indexrunfirstlast	tick_spans               r   group_palette_runsr      s   ')D$&G!%N 
 %%!Unq.@%@NN3G$eG
 G
Ca( 

sA2w	eii'-*TXXf=Ms2SVuV}4I

EEIIe, 488E? eii0	
 TXXg. c#h eii0#6:dhhwFWY\;] #hhw/%))G2DDqH I  ?!; uyy7 eiio %))H- #EIIm$<  "488M#:!"  C!HS#''-"8!H#$ S!WEc}S1E%	

8 J	 "IEs   I!I&c                 H   t               } | s	ddddig dS | \  }}t        |      }t        |      }t        t              }t	        d |D              }|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      d	k(  s| }	}|D cg c]=  }|j                  d      d
v r(|j                  d      dv s|j                  d      dv r|? }
}|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dk(  s| }}|D cg c],  }|j                  d      dk(  r|j                  d      dk(  r|. }}|D cg c]*  }|j                  d      dv s|j                  d      dv r|, }}t               }||
z   |z   D ]E  }|j                  d      }t        |t              s%|j                  t        |dz
  |dz                G |D cg c]*  }|j                  d      dv r|j                  d      |v r|, }}g }t	        d |D              j                         D ]0  \  }}|j                  |d   |d   |d   |d   |d   |d   |d       2 t        d |	D        d       }t        d  |	D        d       }t        |      }d!}|sd"}d#d$d%t        |      |D cg c]E  }|j                  d&      |j                  d'      |j                  d(      |j                  d)      d*G c}d+d,d-d.d/d0|r|j                  d1      nd |r|j                  d1      nd |r|j                  d      nd d2d,d3d4d5t        |      t        |      t        |      d6d,g}d|t!        |j#                  t$                    t!        |j#                  t$                    t        j'                         r"t!        t        j#                  t$                    nd d7|d8t        |      t)        |      t+        d9 |D        d :      t-        d; |D        d :      gt        |      t        |      t        |      t        |      t        |      t        |
      t        |      |j                  d<      xs i j                  d=      |j                  d<      xs i j                  d>      d?|D cg c]  }t/        |       c}|	D cg c]  }t/        |       c}|
D cg c]  }t/        |       c}|||D cg c]  }t/        |       c}|d d@ D cg c]  }t/        |       c}|d dA D cg c]  }t/        |       c}|dBS c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )CNz hwanse-intro-runtime-fade-reviewzmissing-runtime-trace
traceFoundF)kindstatussummarytracesc              3  >   K   | ]  }|j                  d         yw)r)   Nrl   .0r)   s     r   	<genexpr>zbuild.<locals>.<genexpr>   s     <EUYYw'<s   r)   zsurface-snapshotresource-surface-label>   resource-openresource-readsurface-createsurface-uploadresource-decodesurface-colorkeyr   r_   >   aaa.cnscompile.cnsr]   zsurface-palettezdraw-surfacerY   
0x1004C438rZ   
0x10001330r[   rL   r=      >   vm-opvm-op-transitionobject-stream-changec           	   3     K   | ]f  }|j                  d       |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      f h yw)rY   rZ   r[   r\   rO   rj   Nr   r   r   s     r   r   zbuild.<locals>.<genexpr>   sc      
  GGHGGM"GGM"GG&'GGDMGGFO	

s   A,A.r   r         )rY   rZ   r[   r\   rO   rj   countc              3  p   K   | ].  }|j                  d       dk(  r|j                  d      dk(  r| 0 yw)rX   
0x1025D128r_   r   Nr   r   s     r   r   zbuild.<locals>.<genexpr>  s:      	
ww'<7CGGN<SWd<d 	
   46c              3  p   K   | ].  }|j                  d       dk(  r|j                  d      dk(  r| 0 yw)rX   r   r_   r   Nr   r   s     r   r   zbuild.<locals>.<genexpr>  s:      	
ww'<7CGGN<SW`<` 	
r   zpalette-fade-runtime-confirmedz logo-surface-only-no-palette-runzfade-rendering-model	confirmedzThe observed intro fade is driven by repeated palette updates on the primary 8-bit surface, not by per-frame alpha Blt opacity.rs   rt   ru   r7   )rs   rt   ru   r7   )surfacePaletteEventCountpaletteRuns)idr   textevidencezlogo-surface-swapzconfirmed-partialzThe trace starts with the shared full-screen logo surface already labeled compile.cns, then reloads the same handle as aaa.cns at frame 134.r   rK   )sharedLogoSurfacecompileSnapshotSeqaaaLabelSeqaaaResourceFramezanimation-boundaryzsupported-boundaryzThis capture can ground full-screen CNS fade timing and surface replacement. It does not yet prove battle/helper sprite motion; those still need object/helper draw traces during the relevant action.)logoDrawCountfullFramePresentCountvmRowsNearFadeOrLoad)r3   r4   palettePipelineTc              3  ~   K   | ]5  }t        |j                  d       t              s#|j                  d        7 ywrL   Nr}   rl   r~   r   s     r   r   zbuild.<locals>.<genexpr>\  -     cEz%))T[J\^a?bUYYw'c   $==)defaultc              3  ~   K   | ]5  }t        |j                  d       t              s#|j                  d        7 ywr   r   r   s     r   r   zbuild.<locals>.<genexpr>]  r   r   r   setEntriesHelperscopyThenApplyHelper)r   ru   eventCounts
frameRanger   paletteRunCountdrawSurfaceEventCountr   r   resourceLifecycleEventCountr   staticPaletteSetEntriesHelpers staticPaletteCopyThenApplyHelperr|   x   )r   r   rY   r3   r   surfaceSnapshotsresourceLabelsresourceLifecycler   	drawPairslogoDrawRowsfullFramePresentSamplesr   conclusions)r5   r   r*   PALETTE_PIPELINEr   rl   setr}   r~   updaterangemost_commonr%   nextr   r   r   relative_toROOTr   dictminmaxrn   )
trace_pairmanifest_path
jsonl_pathr3   r&   palette_staticcountsr)   surface_snapshotsresource_labelsresource_lifecyclepalette_rows	draw_rowsfull_frame_draws
logo_drawsinteresting_framesr   rL   vm_rows
draw_pairsrE   r   compile_snapshot	aaa_labelpalette_runsr   r   r   s                               r   buildr      s$   #%J6-$e,	
 	
 !+M:'H$F/0N<V<<F,2_5eii6HL^6^__*0cEIIg4FJb4bucOc 99W
	
 IIn%)CCyy-.2LL 	 & (.Ye71CGX1XEYLY$*S5eii.@N.RSIS 99X,.599]3K|3[ 	  99)*.HH99]#'AA 	J  00:= C eS!%%eEAIuqy&ABC 99W!VVIIg"44 	G  J 
 
 
 km

U 	a&"1v"1v$'F!fA
	

. 	
&	

 	 	
&	

 	I &l3L-F3 )! V,/,=  ,   '*ggl&;%(WW[%9&)ggl&;"%''("3	 		
$ &) c%1EU&6&:&:5&A[_7@y}}U3d>GIMM'$:T		
	
 '* ]!$Z),-=)>(+G			
;'KT 3M55d;<//56JZJaJaJcs#3#?#?#EFim

 f+<cVcmqrcVcmqr ),L(9"<0%(^%()9%: _+./A+B$'L/=/A/A)/L/RPR.W.WXk.l1?1C1CI1N1TRT0Y0YZo0p!
$ <MMC]3/M9HI#=-I<NOSmC0O#7ABs+BBRSUTUBV#W3M#$6#W?Ft} Ms!3 M"G$ $M `c& ZS
x z NIO C#W Mst   U0U:UUAU#&U( U(
U-$U-.1U2%/U74/U<A
VVV1VV&VVc                t    dj                  d | D              }dj                  d |D              }d| d| dS )Nr   c              3  :   K   | ]  }d t        |       d  yw)z<th>z</th>Nr   )r   headers     r   r   ztable.<locals>.<genexpr>v  s     AvT!F)E*A   
c              3  X   K   | ]"  }d dj                  d |D              z   dz    $ yw)z<tr>r   c              3  :   K   | ]  }d t        |       d  yw)z<td>z</td>Nr   )r   r   s     r   r   z"table.<locals>.<genexpr>.<genexpr>x  s     AE4%z/Ar   z</tr>Njoinr   s     r   r   ztable.<locals>.<genexpr>w  s1       	ASAAAGKs   (*z<table><thead><tr>z</tr></thead><tbody>z</tbody></table>r   )headersr   headbodys       r   tabler   u  sJ    77AAAD99  D  v%9$?OPPr   c                J   | j                  d      xs i }| j                  d      xs g }| j                  d      xs g }| j                  d      xs g }| j                  d      xs g }| j                  d      xs g }t        g d|D cg c]x  }|j                  d      |j                  d	       d
|j                  d       |j                  d      |j                  d      |j                  d      |j                  d      gz c}      }t        g d|D cg c]  }|j                  d      |j                  d      |j                  d      |j                  d      xs |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      xs$ |j                  d      xs |j                  d      g c}      }	t        g d|D cg c]t  }|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d       |j                  d!      gv c}      }
t        g d"|d d# D cg c]  }|j                  d      |j                  d      |j                  d      |j                  d$      |j                  d%      xs |j                  d&      |j                  d'      xs |j                  d(      |j                  d)      xs |j                  d*      |j                  d      g c}      }d+j                  d, |D              }d-t        | j                  d.             d/t        |j                  d             d0t        |j                  d1             d2t        |j                  d3             d4t        |j                  d5             d6| d7| d8|	 d9|
 d:| d;t	        j
                  |d<=       d>S c c}w c c}w c c}w c c}w )?Nr   r   r   r   r   r   )r   framesr&   r7   z
first hashz	last hashrp   rs   z..rt   ru   r7   rx   ry   )rK   rL   r)   resourcesurfacerO   r7   z	rect/hashrK   rL   r)   r_   r]   rX   rO   rh   rf   re   )rY   rZ   zsource labelzdestination labelrO   methodr   rY   rZ   r[   r\   rj   r   )rK   rL   r)   rQ   rR   rS   r   rO   <   rQ   rR   rT   rS   rV   rU   newr   c              3  .  K   | ]  }d t        |j                  d             dt        |j                  d             dt        |j                  d             dt        t        j                  |j                  d      xs i dd	
             d	  yw)z<article><h3>r   z <span>r   z</span></h3><p>r   z	</p><pre>r   Fr=   ensure_asciiindentz</pre></article>N)r   rl   r   dumpsr   s     r   r   zrender_html.<locals>.<genexpr>  s      ! #''$-()37783D1E0FoVWX[X_X_`fXgVhUiirstuyuu  AD  AH  AH  IS  AT  AZ  XZ  in  wx  vy  tz  s{  {K  	L!s   BBu  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Intro Runtime Fade Review</title>
  <style>
    body { margin: 0; padding: 24px; background: #f7f7f4; color: #1f2328; font: 14px/1.55 system-ui, sans-serif; }
    main { max-width: 1180px; margin: 0 auto; }
    h1 { margin: 0 0 8px; font-size: 26px; }
    h2 { margin: 28px 0 10px; font-size: 18px; }
    .lead { color: #4f5b66; margin: 0 0 16px; }
    .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px; margin: 16px 0; }
    .metric, article { background: #fff; border: 1px solid #d8d8d0; border-radius: 8px; padding: 12px; }
    .metric strong { display: block; font-size: 20px; }
    article h3 { margin: 0 0 8px; font-size: 15px; }
    article h3 span { color: #6a5a00; font-weight: 600; }
    table { border-collapse: collapse; width: 100%; background: #fff; border: 1px solid #d8d8d0; }
    th, td { border: 1px solid #e3e3dc; padding: 6px 8px; vertical-align: top; }
    th { background: #efefe8; text-align: left; }
    code, pre { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
    pre { overflow: auto; background: #f3f3ee; padding: 10px; border-radius: 6px; }
    .note { border-left: 4px solid #a56b00; padding: 8px 12px; background: #fff8e9; }
  </style>
</head>
<body>
<main>
  <h1>Intro Runtime Fade Review</h1>
  <p class="lead">게임 시작부의 <code>compile.cns</code> / <code>aaa.cns</code> 로고 페이드가 런타임에서 어떤 draw/palette 단위로 보이는지 정리합니다.</p>
  <p><a href="index.html">index</a> · <a href="palette_pipeline_review.html">palette pipeline</a> · <a href="render_pipeline_model_review.html">render pipeline</a></p>
  <div class="grid">
    <div class="metric"><span>status</span><strong>r   zC</strong></div>
    <div class="metric"><span>events</span><strong>zL</strong></div>
    <div class="metric"><span>palette updates</span><strong>r   zI</strong></div>
    <div class="metric"><span>palette runs</span><strong>r   zG</strong></div>
    <div class="metric"><span>logo draws</span><strong>r   u  </strong></div>
  </div>
  <section class="note">
    <p>현재 캡처는 trace-start 시점에 <code>compile.cns</code>가 이미 <code>0x1025D128</code> 서피스로 존재하고, frame 134에서 같은 핸들이 <code>aaa.cns</code>로 재라벨/업로드되는 흐름을 잡습니다. 따라서 첫 로고의 로드 자체는 부분 캡처이고, 페이드와 두 번째 로고 로드는 런타임 근거가 있습니다.</p>
  </section>
  <h2>Conclusions</h2>
  <div class="grid">z&</div>
  <h2>Palette Fade Runs</h2>
  z&
  <h2>Logo Resource Lifecycle</h2>
  z!
  <h2>Draw Surface Pairs</h2>
  z%
  <h2>VM Rows Near Fade/Load</h2>
  z4
  <script>window.HWANSE_INTRO_RUNTIME_FADE_READY = F)r	  z#;</script>
</main>
</body>
</html>
)rl   r   r   r   r   r  )datar   r   r   r   r   r   r   palette_tablelifecycle_table
draw_tablevm_tableconclusion_cardss                r   render_htmlr  ~  s   hhy!'RG88M*0bL"56<"+&,"J((=)/RKhh-.4"GH $
	
  
#77<()CGGK,@+AB%!*+)*
	
M U *	
    'H3773G+H(!$V(<V@V		
O  _ "	
  !&&*+ 	
J M s|	
    !!?SWW->%?!?SWW->%?&8#''%.		
H  yy !! 
6< 788J6K5L M667L8Q6R5S T??@MgAh?i>j k<<=gkkJ[>\<];^ _::;GKK<X:Y9Z [ (( )/  , * 448JJwUZ4[3\ ]c5 5A
	
	
 	
	
s   A=P
CP
0A9P
?CP 
c                 L   t               } t        j                  t        j                  | dd      dz   d       t
        j                  t        |       d       t        dt        j                  t                      t        dt
        j                  t                      y)	NFr=   r  r   r   r   zwrote r   )
r   JSON_OUT
write_textr   r  HTML_OUTr  printr   r   )r  s    r   mainr     s    7D

4eAFMX_`D)G<	F8''-.
/0	F8''-.
/0r   __main__)r   r   returnr   )r   r   r  dict[str, Any])r   r   r  list[dict[str, Any]])r  ztuple[Path, Path] | None)rC   z
str | Noner  r  )r)   r  r  r  )r   r  r  r  )r  r  )r   z	list[str]r   zlist[list[Any]]r  r   )r  r  r  r   )r  r~   )#__doc__
__future__r   r   r   r@   collectionsr   pathlibr   typingr   __file__resolveparentsr   r.   OUTWEBr  r  r   r   r   r*   r5   rI   rn   r   r   r   r  r  __name__
SystemExit r   r   <module>r*     s   	 #   	    H~''**y(
Ul
Ul111177 H8(,^/dzzQD z
TV
 r   