
    UHjA                       U d Z ddlmZ ddlZddlmZ  ee      j                         j                  d   Z	e	dz  Z
e	dz  Zdd	d
dZddddg dfddddg dfddddg dfddddg dfddddg dfddddg dfddddg dfddddg dfdd dd!g d"fdd#d$d!g d%fdd&d'd!g d(fdd)d*d!g d+fd,d-dd.g d/fd,d0d$d.g d1fd,d2d'd.g d3fd,d4d*d.g d5fgZd6ed7<   dAd8ZdBd9ZdCd:ZdDd;ZdEd<ZdFd=ZdGd>ZdFd?Zed@k(  r e        yy)Ha  Guard battle skill playback regressions that canonical row checks miss.

The canonical bundle can be internally "confirmed" while a browser preview still
falls back to frame 0 because a frame rect is missing, or while a shifted skill
boundary reintroduces old Rinshan/Runrun regressions.  This verifier checks the
data layer used by the shared battle preview pages, not the original game
runtime.
    )annotationsN)Path   outwebbtl_atbtl_rsbtl_sm)atahorinshansmashur   0x01u   손톱공격)            r      0x02u	   하이킥)
      r   r   0x03u	   미들킥)      r   r   0x04u   로 킥)      r   r   0x05u   도발)3   4   5   r   r   r    r   r   r    6         r"   0x06u   꼬챙이 꿰기0x070x080x09u   안면백조권)         	   r+               r/   r(   r)   r*   r+   r+   r   0x0a   )r(   r)   r*   r+   r+   r,   r-   r.   r/   r/   !   "   &   '   r5   r   0x0br   )r(   r)   r*   r+   r+   r,   r-   r.   r/   r/   r2   r3   #   $   %   r7   r3   )   (   r   0x0cr"   )r(   r)   r*   r+   r+   r,   r-   r.   r/   r/   r2   r3   r4   r5   r5   r2   r3   r7   r8   r9   r7   r3   *   r=   r:   r;   r   r   0x2fu   맹호룬룬권)	,   -   .   /   r?   0   1   2   r   0x30)r?   r@   rA   rB   r?   rC   rD   rE   r   r   r   0x31)r?   r@   rA   rB   r?   rC   rD   rE   r   r         r   0x32)r?   r@   rA   rB   r?   rC   rD   rE   r   r   rH   rI   r*   r+   r   r   r   z-list[tuple[str, str, object, str, list[int]]]REGRESSION_ROWSc                L    t        j                  | j                  d            S )Nutf-8encoding)jsonloads	read_text)paths    1tools/verify_battle_skill_playback_regressions.py	load_jsonrU   1   s    ::dnngn677    c                    t        |       N)AssertionError)messages    rT   failr[   5   s    

!!rV   c                (    | |j                         |fS rX   )lower)ownerskilllevels      rT   row_keyra   9   s    %++-&&rV   c                    | D ci c]W  }t        t        |j                  d      xs d      t        |j                  d      xs d      |j                  d            |Y c}S c c}w )NownerKey 
skillIdHexlevelOrFixed)ra   strget)rowsrows     rT   canonical_row_indexrk   =   sm       	
#)r*%+,GGN#	
 		  s   AA$c                     t        t        dz        } | j                  d      xs g D ci c]E  }|j                  d      r2t        |j                  d      xs d      |j                  d      xs g G c}S c c}w )Ncns_rect_review_data.jsonri   assetrd   rects)rU   OUTrh   rg   )datarj   s     rT   
rect_indexrr   H   st    S667D 88F#)r777 	CGGG"#SWWW%5%;;  s   A
A7c                     g d} dD ];  }t         |z  j                  d      }| d d D ]  }||vst        d| d|         = t         dz  j                  d      }d	|vsd
|vrt        d       y y )N)z#BattleAnimation.buildPlayerPlaybackz"BattleAnimation.mergePlayerActions$battle_skill_timeline_canonical.jsonrm   )!battle_skill_timeline_review.htmlzbattle_formula_calculator.htmlzbattle_simulator.htmlrM   rN   r   zweb/z3 no longer uses shared canonical playback: missing ru   renderRawFilmstriprenderFilmstripzIbattle_skill_timeline_review.html must expose raw and playback filmstrips)WEBrR   r[   )requiredreltextneedletimelines        rT   &assert_shared_pages_bound_to_canonicalr~   Q   s    H ^
 c	$$g$6rl 	^FT!tC5 STZS[\]	^^ 99DDgDVH8+/@/PXY 0QrV   c                   | j                  d      dk7  r/t        | j                  d       d| j                  d       d       | j                  d      dk7  r/t        | j                  d       d| j                  d       d       | j                  d	      |k7  rCt        | j                  d       d| j                  d       d
| j                  d	      d|       | j                  d      xs g }||k7  rXt        | j                  d       d| j                  d	       d| j                  d       d| j                  d       d| d|        | j                  d      xs i j                  d      xs g D cg c]A  }|j                  d      dk(  r+|j                  d      t        |j                  d            C }}||k7  r4t        | j                  d       d| j                  d	       d| d|        t        |      }|D cg c]  }|dk  s||k\  s| }	}|	r5t        | j                  d       d| j                  d	       d| d|	        y y c c}w c c}w )Nstatus	confirmedrc    re   z is not confirmedtimelineStatusz timeline is not confirmed	skillNamez name mismatch: z != frameSequence level=rf   z$ frameSequence mismatch:
  expected z
  actual   r}   frameEventskindzactor-frameframez& raw actor-frame mismatch:
  expected r   z' references frames outside rect table (z): )rh   r[   intlen)
rj   expected_nameexpected_framesro   frame_sequenceevent
raw_frames
rect_countr   missings
             rT   
assert_rowr   f   s   
wwxK'
#$Acggl&;%<<MNO
ww K/
#$Acggl&;%<<VWX
ww{},wwz"#1SWW\%:$;;Kww{#&d=*;=	

 WW_-3N(wwz"#1SWW[%9$:!CGGL<Q;R SWW^,- .)* +()+	
 ggj)/R44]CIr99V-%))G2D2P 	EIIgJ 
 _$wwz"#1SWW[%9$: ;)* +$'	
 UJ"1VUQY%:BUuVGVwwz"#1SWW[%9$: ;%,c'4	
  Ws   :AI
IIc            
        t        t        dz        } | j                  d      xs i }|j                  d      durt        d       |j                  d      durt        d       | j                  d	      xs g }t	        |      }t               }t        D ]m  \  }}}}}	|j                  t        |||            }
|
st        d
| d| d|       t        j                  |      }t        |
||	|j                  |g              o t                t        d       t        dt        t                      t        d       y )Nrt   summarycanonicalRowsReadyTzGcanonicalRowsReady must be true before playback regression verification	goalReadyFzIgoalReady must stay false; this verifier is one gate, not full completionplayerActionszmissing regression row r   r   z)battle skill playback regression guard okz- guarded rows: zV- checked: canonical frames, raw actor-frame frames, rect bounds, shared page bindings)rU   rp   rh   r[   rk   rr   rK   ra   ASSET_BY_OWNERr   r~   printr   )	canonicalr   ri   indexrects_by_assetr^   r_   r`   nameframesrj   rn   s               rT   mainr      s+   # FFGImmI&,"G{{'(4VW{{;u,XY==)/RD%E\N-< E)ueT6iiue45*5'5'	JK""5)3fn&8&8&CDE +,	
56	S12
34	
bcrV   __main__)rS   r   returndict)rZ   rg   r   None)r^   rg   r_   rg   r`   objectr   ztuple[str, str, object])ri   
list[dict]r   z#dict[tuple[str, str, object], dict])r   zdict[str, list[dict]])r   r   )
rj   r   r   rg   r   z	list[int]ro   r   r   r   )__doc__
__future__r   rP   pathlibr   __file__resolveparentsROOTrp   rx   r   rK   __annotations__rU   r[   ra   rk   rr   r~   r   r   __name__ rV   rT   <module>r      s   #   H~''*
Ul
Ul  n.EFk?;k?;i9h(YZ02IJ02IJ02IJ,.cd,.hi,.xy,  /U  Vfa*,OPfa*,WXfa*,_`fa*,mn!B> (8"'Z*&
Rd2 zF rV   