§
    ­½jžJ  ã                  ó.  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZmZmZmZ ddlZej                             ej                             ej                             e¦  «        d¦  «        ¦  «        Zeej        vrej                             de¦  «         ddlmZm Z  ddl!m"Z" dd	l#m$Z$m%Z%m&Z&  ee¦  «         '                    ¦   «         j(        j(        j(        Z)e)d
z  dz  Z* ej+        d¬¦  «        dd„¦   «         Z, ej+        d¬¦  «        dd„¦   «         Z- ej+        d¬¦  «        dd„¦   «         Z.ej+        d d„¦   «         Z/ G d„ d¦  «        Z0 G d„ d¦  «        Z1 G d„ d¦  «        Z2 G d„ d¦  «        Z3dS )!aê  
Comprehensive E2E Test Suite for FreeExile PoE2 Modern ARPG UX/UI,
Character Animation, Skill VFX & 120 FPS Systems (Features 1-23).
Enforces 4-Tier Testing Methodology:
- Tier 1: Functional Feature Coverage (Features 1-23, >=5 test cases per area)
- Tier 2: Boundary & Corner Cases (0/neg HP, rapid spam, extreme coords, empty slots)
- Tier 3: Cross-Feature State Interleaving & Pairwise Combinations
- Tier 4: Real-World End-to-End Application Scenarios (Dummy rotation, touch, 120 FPS)
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚTuplez../../server)ÚCombatEngineÚCombatActor)Úcreate_standard_active_skills)ÚFiveElementsÚSkillTagÚWeaponCategoryÚclientÚwebappÚsession)ÚscopeÚreturnÚstrc                 ó  — g } t           dz  }|                     ¦   «         r)|                      |                     d¬¦  «        ¦  «         t	          t           dz                       d¦  «        ¦  «        D ]+}|                      |                     d¬¦  «        ¦  «         Œ,t	          t           dz                       d¦  «        ¦  «        D ]+}|                      |                     d¬¦  «        ¦  «         Œ,d                     | ¦  «        S )	zFConcatenates WebApp HTML, JS, and CSS files into an opaque-box bundle.z
index.htmlúutf-8©ÚencodingÚjsz**/*.jsÚcssz**/*.cssú
)Ú
WEBAPP_DIRÚexistsÚappendÚ	read_textÚsortedÚglobÚjoin)ÚpartsÚ
index_htmlÚjs_pathÚcss_paths       úAC:\Projects\FreeExile\tests\e2e\test_poe2_ui_animation_vfx_e2e.pyÚclient_bundler(   "   sü   € ð €EÝ˜lÑ*€JØ×ÒÑÔð =Ø�Š�Z×)Ò)°7Ð)Ñ;Ô;Ñ<Ô<Ð<Ý�:¨Ñ,×2Ò2°9Ñ=Ô=Ñ>Ô>ð :ð :ˆØ�Š�W×&Ò&°Ð&Ñ8Ô8Ñ9Ô9Ð9Ð9Ý�J¨Ñ.×4Ò4°ZÑ@Ô@ÑAÔAð ;ð ;ˆØ�Š�X×'Ò'°Ð'Ñ9Ô9Ñ:Ô:Ð:Ð:Ø�9Š9�UÑÔÐó    úDict[str, Any]c                 óx   — t           dz  dz  dz  dz  } t          j        |                      d¬¦  «        ¦  «        S )NÚassetsÚuiÚcombatzhud_combat_metadata.jsonr   r   ©r   ÚjsonÚloadsr   ©Ú	meta_paths    r'   Úhud_metadatar4   0   s=   € å˜XÑ%¨Ñ,¨xÑ7Ð:TÑT€IÝŒ:�i×)Ò)°7Ð)Ñ;Ô;Ñ<Ô<Ð<r)   c                 ór   — t           dz  dz  dz  } t          j        |                      d¬¦  «        ¦  «        S )Nr,   Úskillszmartial_skills_metadata.jsonr   r   r/   r2   s    r'   Úskills_metadatar7   6   s8   € å˜XÑ%¨Ñ0Ð3QÑQ€IÝŒ:�i×)Ò)°7Ð)Ñ;Ô;Ñ<Ô<Ð<r)   ú-Tuple[CombatEngine, CombatActor, CombatActor]c                 óö   — t          ¦   «         } t          ddt          j        ddd¬¦  «        }t          ddt          j        dd¬	¦  «        }|                      |¦  «         |                      |¦  «         | ||fS )
Né   zSavage Exileç     @�@ç     Àb@)Ú
current_hpÚmax_hpÚbase_attacké   u   Má»™c NhÃ¢n Báº¥t Hoáº¡ig    ~„.A)r=   r>   )r	   r
   r   ÚTHUYÚTHOÚregister_actor)ÚengineÚheroÚdummys      r'   Úcombat_setuprG   <   s}   € å‰^Œ^€FÝ�q˜.­,Ô*;ÈÐW]ÐkpÐqÑqÔq€DÝ˜Ð5µ|Ô7GÐT\ÐemÐnÑnÔn€EØ
×Ò˜$ÑÔÐØ
×Ò˜%Ñ Ô Ð Ø�4˜ÐÐr)   c                  ó6  — e Zd ZdZd/d„Zd0d„Zej                             dd	¬
¦  «        d0d„¦   «         Z	d/d„Z
d1d„Zej                             dd¬
¦  «        d0d„¦   «         Zd0d„Zej                             dd¬
¦  «        d0d„¦   «         Zd1d„Zd1d„Zej                             dd¬
¦  «        d0d„¦   «         Zej                             dd¬
¦  «        d0d„¦   «         Zej                             dd¬
¦  «        d0d„¦   «         Zd2d„Zej                             dd ¬
¦  «        d1d!„¦   «         Zd1d"„Zd1d#„Zej                             dd$¬
¦  «        d0d%„¦   «         Zd0d&„Zd3d(„Zej                             dd)¬
¦  «        d0d*„¦   «         Zd0d+„Zd0d,„Zd0d-„Zd.S )4ÚTestTier1FeatureCoveragez9Tier 1: Feature Coverage (Features 1-23 from PROJECT.md).r4   r*   r   ÚNonec                óZ  — t           dz  dz  dz  dz  }g }|j        } |¦   «         }|}|r|d         d         d         }d}||k    }	|	}|�s!d	d
t          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nd
t	          j        |¦  «        t	          j        |¦  «        dœz  }
|                     |
¦  «         |r`t	          j        d|	fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t	          j	        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	}|d         d         d         }d}||k    }|slt	          j        d|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}}|d         d         d         }d}||k    }|slt	          j        d|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}}|d         d         d         }d}||k    }|slt	          j        d|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}}dS )zHVerifies dual orbs assets and layout metadata exist with 180x180 bounds.r,   r-   r.   zhud_dual_orbs_frame.pngÚelementsÚlife_orbÚwé´   ú:%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.exists
}()
}Úframe©Úpy2Úpy4Úpy6©ú==)z%(py9)s == %(py12)s©Úpy9Úpy12ú%(py14)sÚpy14r   úassert %(py17)sÚpy17NÚmana_orbÚh©z%(py1)s == %(py4)s©Úpy1rT   úassert %(py6)srU   Útouch_radiuséZ   )r   r   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprr   Ú_call_reprcompareÚ_format_boolopÚAssertionErrorÚ_format_explanation)Úselfr4   rQ   Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_assert0Ú@py_assert8Ú@py_assert11Ú@py_assert10Ú@py_format7Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18Ú@py_assert2Ú@py_format5s                    r'   Ú&test_f01_dual_orbs_assets_and_metadataz?TestTier1FeatureCoverage.test_f01_dual_orbs_assets_and_metadataJ   sî  € å˜XÑ%¨Ñ,¨xÑ7Ð:SÑSˆØRÐRˆuŒ|ÐRˆ|ˆ|‰~Œ~ÐRˆ~ÐRˆ~ÐR ,¨zÔ":¸:Ô"FÀsÔ"KÐRÈsÐRÐ"KÈsÒ"RÐRÐRÐRÐRÑRÐRÐRÕRÔRÑRÔRÐRÐRÕRÔRˆuÑRÔRÐRÕRÔRˆuÑRÔRÐRÐRÕRÔRˆ|ÑRÔRÕRÔRˆ~ÑRÔRÐRÐRÑRÐRÐR×RÒRÐRÑRÔRÐRˆ~ÐRÕRÔRÐRÐRÐRÐRÐ"KÈsÐRÑRÔRÕRÔRÐ"KÑRÔRÕRÔRÈsÑRÔRÐRÐRÑRÐRÐRÐRÐRÐRÑRÐRÐR×RÒRÐRÑRÔRÐRÕRÔRÐRÐRÑRÔRÐRÑRÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRÐRØ˜JÔ'¨
Ô3°CÔ8Ð?¸CÐ?Ð8¸CÒ?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð8¸CÐ?Ñ?Ô?Õ?Ô?Ð8Ñ?Ô?Õ?Ô?¸CÑ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø˜JÔ'¨
Ô3°NÔCÐIÀrÐIÐCÀrÒIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐCÀrÐIÑIÔIÕIÔIÐCÑIÔIÕIÔIÀrÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIØ˜JÔ'¨
Ô3°NÔCÐIÀrÐIÐCÀrÒIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐCÀrÐIÑIÔIÕIÔIÐCÑIÔIÕIÔIÀrÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIr)   c                ó„  — t           dz  dz  dz  dz  }|                     d¬¦  «        }g }|j        } |¦   «         }|}|rd}||v }|}|rd}	|	|v }
|
}|�sÚd	d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         |�rt          j	        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |r‹t          j	        d|
fd|	|f¦  «        t          j        |	¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	}
dS )zBVerifies sinusoidal wave formula with time * 3.0 in liquid shader.r,   r-   r.   zhud_liquid_glow.metalr   r   z
time * 3.0zsin(rP   Úshader_filerR   ©Úin)z%(py9)s in %(py11)sÚcontent)rY   Úpy11z%(py13)sÚpy13)z%(py16)s in %(py18)s)Úpy16Úpy18ú%(py20)sÚpy20r   úassert %(py23)sÚpy23N)r   r   r   rg   rh   ri   rj   rk   r   rl   rm   rn   ro   )rp   r�   r„   rq   rr   rs   rt   ru   rw   Ú@py_assert15Ú@py_assert17rx   Ú@py_format12Ú@py_format14Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24s                     r'   Ú-test_f01_dual_orbs_liquid_wave_shader_formulazFTestTier1FeatureCoverage.test_f01_dual_orbs_liquid_wave_shader_formulaR   sË  € å  8Ñ+¨dÑ2°XÑ=Ð@WÑWˆØ×'Ò'°Ð'Ñ9Ô9ˆØUÐUˆ{Ô!ÐUÐ!Ð!Ñ#Ô#ÐUÐ#ÐUÐ#ÐU¨ÐU¨¸Ð(?ÐUÐUÐUÐUÐUÀFÐUÀFÈgÐDUÐUÐUÐUÐUÑUÐUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆ{ÑUÔUÐUÕUÔUˆ{ÑUÔUÐUÐUÕUÔUÐ!ÑUÔUÕUÔUÐ#ÑUÔUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÐ#ÑUÕUÔUÐUÐUÐUÐU¨¸ÐUÑUÔUÕUÔU¨ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU¸ÑUÔUÐUÕUÔU¸ÑUÔUÐUÐUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÐUÐUÕUÔUÐUÐUÐUÐUÀFÈgÐUÑUÔUÕUÔUÀFÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUÈgÑUÔUÐUÕUÔUÈgÑUÔUÐUÐUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÕUÔUÐUÐUÑUÔUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUr)   Fz2Negative Baseline: Pending M1 - hud_orbs.js module)ÚstrictÚreasonc           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )z0Verifies client/webapp/js/ui/hud_orbs.js exists.r   r-   zhud_orbs.jsúiassert %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}r   ©Úpy0rS   Úpy5Úpy8r…   r†   N©	r   r   rg   rh   ri   rj   rk   rn   ro   ©
rp   rq   rr   Ú@py_assert4Ú@py_assert6Ú@py_assert7Ú@py_assert9rw   Ú@py_assert12r�   s
             r'   Ú"test_f01_dual_orbs_module_baselinez;TestTier1FeatureCoverage.test_f01_dual_orbs_module_baselineX   s4  € ð "ÐB•
˜TÑ!ÐB DÐBÐ! DÑ(ÐB¨=ÐBÐ(¨=Ñ8ÐBÐ8Ô@ÐBÐ@Ð@ÑBÔBÐBÐBÐBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔB•
ÑBÔBÐBÕBÔB•
ÑBÔBÐBÐBÕBÔB˜TÑBÔBÕBÔB DÑBÔBÕBÔB¨=ÑBÔBÕBÔBÐ@ÑBÔBÕBÔBÐBÑBÔBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBr)   c                óN  — |d         }g }|d         d         }d}||k    }|}|r|d         d         }d}	||	k    }
|
}|�st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }|                     |¦  «         |r`t          j        d|
fd||	f¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}
}	g }|d         d         }d}||k    }|}|r|d         d         }d}	||	k    }
|
}|�st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }|                     |¦  «         |r`t          j        d|
fd||	f¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}
}	|d         d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )zCValidates primary attack, 3 skill slots, and dodge button metadata.rL   Úprimary_attackrN   éd   re   é2   rV   ©z%(py3)s == %(py6)s©Úpy3rU   ú%(py8)sr�   ©z%(py11)s == %(py14)s©r…   r\   ú%(py16)sr‡   r   úassert %(py19)sÚpy19NÚskill_slot_1é4   Úskill_slot_2Úphantom_dodgeÚcharges_maxé   ra   rb   rd   rU   )ri   rl   rk   r   rm   rn   ro   )rp   r4   Úelemsrq   r}   rs   r    rt   rw   Ú@py_assert13r¤   rx   Ú@py_format9rz   Ú@py_format17r|   Ú@py_format20rr   r~   s                      r'   Ú!test_f02_skill_bar_slots_metadataz:TestTier1FeatureCoverage.test_f02_skill_bar_slots_metadata^   s>  € à˜ZÔ(ˆØdÐdˆuÐ%Ô& sÔ+Ðd¨sÐdÐ+¨sÒ2ÐdÐdÐdÐdÐd°uÐ=MÔ7NÈ~Ô7^ÐdÐbdÐdÐ7^ÐbdÒ7dÐdÐdÐdÐdÑdÕdÔdÐdÐdÐdÐdÐ+¨sÐdÑdÔdÕdÔdÐ+ÑdÔdÕdÔd¨sÑdÔdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÐdÐdÕdÔdÐdÐdÐdÐdÐ7^ÐbdÐdÑdÔdÕdÔdÐ7^ÑdÔdÕdÔdÐbdÑdÔdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÕdÔdÐdÐdÑdÔdÐdÑdÐdÐdÐdÐdÐdÑdÐdÕdÕdÔdÐdÑdÔdÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdØTÐTˆu�^Ô$ SÔ)ÐT¨RÐTÐ)¨RÒ/ÐTÐTÐTÐTÐT°E¸.Ô4IÈ#Ô4NÐTÐRTÐTÐ4NÐRTÒ4TÐTÐTÐTÐTÑTÕTÔTÐTÐTÐTÐTÐ)¨RÐTÑTÔTÕTÔTÐ)ÑTÔTÕTÔT¨RÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐ4NÐRTÐTÑTÔTÕTÔTÐ4NÑTÔTÕTÔTÐRTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÕTÔTÐTÐTÑTÔTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTØ�_Ô% mÔ4Ð9¸Ð9Ð4¸Ò9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð4¸Ð9Ñ9Ô9Õ9Ô9Ð4Ñ9Ô9Õ9Ô9¸Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9r)   r(   r   c                óò  — g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )z=Verifies baseline HTML button handles exist in client bundle.z
skill-firezskill-thunderr‚   ©z%(py3)s in %(py5)sr(   ©r¬   rœ   ú%(py7)sÚpy7©z%(py10)s in %(py12)s©Úpy10rZ   r[   r\   r   r]   r^   Nzskill-frostzskill-dodge©
ri   rl   rk   rg   rh   rj   r   rm   rn   ro   ©rp   r(   rq   r}   r    rt   r£   rv   Ú@py_format6Ú@py_format8ry   rz   r{   r|   s                 r'   Ú test_f02_skill_bar_html_bindingsz9TestTier1FeatureCoverage.test_f02_skill_bar_html_bindingse   sÌ  € àQÐQˆ|ÐQˆ|˜}Ð,ÐQÐQÐQÐQÐQ°ÐQ°ÀMÐ1QÐQÐQÐQÐQÑQÕQÔQÐQÐQÐQÐQˆ|˜}ÐQÑQÔQÕQÔQˆ|ÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ˜}ÑQÔQÐQÕQÔQ˜}ÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÐQÐQÕQÔQÐQÐQÐQÐQ°ÀMÐQÑQÔQÕQÔQ°ÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÀMÑQÔQÐQÕQÔQÀMÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÕQÔQÐQÐQÑQÔQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQØPÐPˆ}ÐPˆ} Ð-ÐPÐPÐPÐPÐP°-ÐP°-À=Ð2PÐPÐPÐPÐPÑPÕPÔPÐPÐPÐPÐPˆ} ÐPÑPÔPÕPÔPˆ}ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP ÑPÔPÐPÕPÔP ÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÐP×PÒPÐPÑPÔPÐPÐPÐPÕPÔPÐPÐPÐPÐP°-À=ÐPÑPÔPÕPÔP°-ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPÀ=ÑPÔPÐPÕPÔPÀ=ÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÐP×PÒPÐPÑPÔPÐPÕPÔPÐPÐPÑPÔPÐPÑPÐPÐPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPr)   z7Negative Baseline: Pending M1 - skill_bar_controller.jsc           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )z<Verifies client/webapp/js/ui/skill_bar_controller.js exists.r   r-   zskill_bar_controller.jsr™   r   rš   Nrž   rŸ   s
             r'   Ú-test_f02_skill_bar_controller_module_baselinezFTestTier1FeatureCoverage.test_f02_skill_bar_controller_module_baselinej   s7  € ð "ÐN•
˜TÑ!ÐN DÐNÐ! DÑ(ÐNÐ+DÐNÐ(Ð+DÑDÐNÐDÔLÐNÐLÐLÑNÔNÐNÐNÐNÐNÐNÕNÔNÑNÔNÐNÐNÕNÔN•
ÑNÔNÐNÕNÔN•
ÑNÔNÐNÐNÕNÔN˜TÑNÔNÕNÔN DÑNÔNÕNÔNÐ+DÑNÔNÕNÔNÐLÑNÔNÕNÔNÐNÑNÔNÐNÐNÑNÐNÕNÕNÔNÐNÑNÔNÑNÔNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNr)   c                óp  — t           dz                       d¬¦  «        }g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|�sæt          j        d|fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	d
œz  }
dd|
iz  }|                     |¦  «         |�rt          j        d|fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|	fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}	dS )zKValidates conic-gradient radial sweep and 0.25s ready flash specifications.úTEST_INFRA.mdr   r   Úconicz0.25sÚsweepr‚   rÀ   Ú
infra_textrÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   ©z%(py17)s in %(py19)s©r^   r²   ú%(py21)sÚpy21r   úassert %(py24)sÚpy24N)ÚPROJECT_ROOTr   ri   rl   rk   rg   rh   rj   r   rm   rn   ro   )rp   rÒ   rq   r}   r    rt   r£   rv   Ú@py_assert16Ú@py_assert18rÉ   rÊ   ry   rz   r½   r“   Ú@py_format23Ú@py_format25s                     r'   Ú*test_f03_f04_cooldown_sweep_and_flash_speczCTestTier1FeatureCoverage.test_f03_f04_cooldown_sweep_and_flash_specp   sÌ  € å" _Ñ4×?Ò?ÈÐ?ÑQÔQˆ
ØXÐXˆwÐXˆw˜*Ð$ÐXÐXÐXÐXÐX¨ÐX¨°JÐ)>ÐXÐXÐXÐXÐXÀ7ÐXÀ7ÈjÐCXÐXÐXÐXÐXÑXÕXÔXÐXÐXÐXÐXˆw˜*ÐXÑXÔXÕXÔXˆwÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX˜*ÑXÔXÐXÕXÔX˜*ÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÐXÑXÕXÔXÐXÐXÐXÐX¨°JÐXÑXÔXÕXÔX¨ÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX°JÑXÔXÐXÕXÔX°JÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÐXÐXÕXÔXÐXÐXÐXÐXÀ7ÈjÐXÑXÔXÕXÔXÀ7ÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXÈjÑXÔXÐXÕXÔXÈjÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÕXÔXÐXÐXÑXÔXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXr)   z:Negative Baseline: Pending M1 - hud_skills.css sweep masksc                ó¼  — t           dz  dz  }g }|j        } |¦   «         }|}|rd}|j        }d} ||¬¦  «        }	||	v }
|
}|�s…ddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         |rÄt          j	        d	|
fd
||	f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}
x}x}}	dS )zIVerifies client/webapp/css/hud_skills.css exists with radial sweep rules.r   zhud_skills.csszconic-gradientr   r   rP   Úcss_filerR   r‚   ©z^%(py9)s in %(py17)s
{%(py17)s = %(py13)s
{%(py13)s = %(py11)s.read_text
}(encoding=%(py15)s)
}©rY   r…   r†   Úpy15r^   ú%(py19)sr²   r   úassert %(py22)sÚpy22N©r   r   r   rg   rh   ri   rj   rk   r   rl   rm   rn   ro   )rp   rà   rq   rr   rs   rt   ru   r¤   Ú@py_assert14rÚ   rw   rx   r|   r½   r’   rÜ   s                   r'   Ú$test_f03_f04_hud_skills_css_baselinez=TestTier1FeatureCoverage.test_f03_f04_hud_skills_css_baselineu   sJ  € õ  Ñ%Ð(8Ñ8ˆØ]Ð]ˆxŒÐ]ˆˆÑ Ô Ð]Ð Ð]Ð Ð]Ð%5Ð]¸Ô9KÐ]ÐU\Ð]Ð9KÐ9KÐU\Ð9]Ñ9]Ô9]Ð]Ð%5Ð9]Ð%]Ð]Ð]Ð]Ð]Ñ]Ð]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆxÑ]Ô]Ð]Õ]Ô]ˆxÑ]Ô]Ð]Ð]Õ]Ô]ˆÑ]Ô]Õ]Ô]Ð Ñ]Ô]Ð]Ð]Ñ]Ð]Ð]×]Ò]Ð]Ñ]Ô]Ð]Ð Ð]Õ]Ô]Ð]Ð]Ð]Ð]Ð%5Ð9]Ð]Ñ]Ô]Õ]Ô]Ð%5Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]¸Ñ]Ô]Ð]Õ]Ô]¸Ñ]Ô]Ð]Ð]Õ]Ô]Ð9KÑ]Ô]Õ]Ô]ÐU\Ñ]Ô]Õ]Ô]Ð9]Ñ]Ô]Ð]Ð]Ñ]Ð]Ð]Ð]Ð]Ð]Ñ]Ð]Ð]×]Ò]Ð]Ñ]Ô]Ð]Õ]Ô]Ð]Ð]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]r)   c                óè  — g }d}||v }|}|sd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |s‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}g }d}||v }|}|sd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |s‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )zMVerifies PC keybindings (Q, E, R, Space) and touch joystick in client bundle.z	k === 'q'zkey === 'q'r‚   rÀ   r(   rÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   r:   r]   r^   Nz	k === 'r'zkey === 'r'ÚjoystickActiveÚhandleJoystickPointerMover   rÇ   rÈ   s                 r'   Ú%test_f05_pc_and_mobile_controls_wiredz>TestTier1FeatureCoverage.test_f05_pc_and_mobile_controls_wired|   sº  € àMÐMˆ{ÐMˆ{˜mÐ+ÐMÐMÐMÐMÐM¨}ÐM¨}ÀÐ/MÐMÐMÐMÐMÑMÕMÔMÐMÐMÐMÐMˆ{˜mÐMÑMÔMÕMÔMˆ{ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM˜mÑMÔMÐMÕMÔM˜mÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÐMÐMÕMÔMÐMÐMÐMÐM¨}ÀÐMÑMÔMÕMÔM¨}ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMÀÑMÔMÐMÕMÔMÀÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÕMÔMÐMÐMÑMÔMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMØMÐMˆ{ÐMˆ{˜mÐ+ÐMÐMÐMÐMÐM¨}ÐM¨}ÀÐ/MÐMÐMÐMÐMÑMÕMÔMÐMÐMÐMÐMˆ{˜mÐMÑMÔMÕMÔMˆ{ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM˜mÑMÔMÐMÕMÔM˜mÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÐMÐMÕMÔMÐMÐMÐMÐM¨}ÀÐMÑMÔMÕMÔM¨}ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMÀÑMÔMÐMÕMÔMÀÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÕMÔMÐMÐMÑMÔMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMØaÐaÐÐaÐ =Ð0ÐaÐaÐaÐaÐaÐ5PÐaÐ5PÐTaÐ5aÐaÐaÐaÐaÑaÕaÔaÐaÐaÐaÐaÐ =ÐaÑaÔaÕaÔaÐÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa =ÑaÔaÐaÕaÔa =ÑaÔaÐaÐaÐaÐaÑaÐaÐaÐaÐaÐaÑaÐaÐa×aÒaÐaÑaÔaÐaÐaÐaÕaÔaÐaÐaÐaÐaÐ5PÐTaÐaÑaÔaÕaÔaÐ5PÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔaÐTaÑaÔaÐaÕaÔaÐTaÑaÔaÐaÐaÐaÐaÑaÐaÐaÐaÐaÐaÑaÐaÐa×aÒaÐaÑaÔaÐaÕaÔaÐaÐaÑaÔaÐaÑaÐaÐaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐar)   c           	     ó  — g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}d}t          |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )z^Verifies kinetic tracks in animation_engine.js: idle (6fps), run (12fps), attack_slash, dodge.ÚidleÚrunr‚   rÀ   r(   rÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   r   r]   r^   NÚattack_slashÚdodger,   Ú
animationszhero_anim_atlas.pngr™   r   rš   ©ri   rl   rk   rg   rh   rj   r   rm   rn   ro   r   r   )rp   r(   rq   r}   r    rt   r£   rv   rÉ   rÊ   ry   rz   r{   r|   rr   r¡   r¢   rw   r¤   r�   s                       r'   Ú test_f06_kinetic_animation_clipsz9TestTier1FeatureCoverage.test_f06_kinetic_animation_clipsƒ   sù  € àAÐAˆvÐAˆv˜Ð&ÐAÐAÐAÐAÐA¨5ÐA¨5°MÐ+AÐAÐAÐAÐAÑAÕAÔAÐAÐAÐAÐAˆv˜ÐAÑAÔAÕAÔAˆvÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA˜ÑAÔAÐAÕAÔA˜ÑAÔAÐAÐAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÐA×AÒAÐAÑAÔAÐAÐAÐAÕAÔAÐAÐAÐAÐA¨5°MÐAÑAÔAÕAÔA¨5ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA°MÑAÔAÐAÕAÔA°MÑAÔAÐAÐAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÐA×AÒAÐAÑAÔAÐAÕAÔAÐAÐAÑAÔAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAØKÐKˆ~ÐKˆ~ Ð.ÐKÐKÐKÐKÐK°7ÐK°7¸mÐ3KÐKÐKÐKÐKÑKÕKÔKÐKÐKÐKÐKˆ~ ÐKÑKÔKÕKÔKˆ~ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK ÑKÔKÐKÕKÔK ÑKÔKÐKÐKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÐK×KÒKÐKÑKÔKÐKÐKÐKÕKÔKÐKÐKÐKÐK°7¸mÐKÑKÔKÕKÔK°7ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK¸mÑKÔKÐKÕKÔK¸mÑKÔKÐKÐKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÐK×KÒKÐKÑKÔKÐKÕKÔKÐKÐKÑKÔKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKØ%ÐV•
˜XÑ%ÐV¨ÐVÐ%¨Ñ4ÐVÐ7LÐVÐ4Ð7LÑLÐVÐLÔTÐVÐTÐTÑVÔVÐVÐVÐVÐVÐVÕVÔVÑVÔVÐVÐVÕVÔV•
ÑVÔVÐVÕVÔV•
ÑVÔVÐVÐVÕVÔV˜XÑVÔVÕVÔV¨ÑVÔVÕVÔVÐ7LÑVÔVÕVÔVÐTÑVÔVÕVÔVÐVÑVÔVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVr)   z7Negative Baseline: Pending M2 - 5-phase kinetic machinec                ó|  — t           dz  dz  dz                       d¬¦  «        }g }d}||v }|}|sd}||v }|}|sd}||v }	|	}|�sæt          j        d	|fd
||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         |�st          j        d	|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |s‹t          j        d	|	fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}	dS )zMVerifies 5 kinetic phases (Idle, Run, Wind-up, Hit-stop, Recovery) in engine.r   rD   zanimation_engine.jsr   r   ÚkineticPhaseÚhitStopTimerÚisHitStoppedr‚   rÀ   ÚcrÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   rÓ   rÔ   rÕ   rÖ   r:   r×   rØ   N)r   r   ri   rl   rk   rg   rh   rj   r   rm   rn   ro   )rp   rú   rq   r}   r    rt   r£   rv   rÚ   rÛ   rÉ   rÊ   ry   rz   r½   r“   rÜ   rÝ   s                     r'   Ú$test_f06_five_phase_machine_baselinez=TestTier1FeatureCoverage.test_f06_five_phase_machine_baseline‰   sÚ  € õ ˜$Ñ Ñ)Ð,AÑA×LÒLÐV]ÐLÑ^Ô^ˆØPÐPˆ~ÐPˆ~ Ð"ÐPÐPÐPÐPÐP nÐP n¸Ð&9ÐPÐPÐPÐPÐP¸^ÐP¸^ÈqÐ=PÐPÐPÐPÐPÑPÕPÔPÐPÐPÐPÐPˆ~ ÐPÑPÔPÕPÔPˆ~ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP ÑPÔPÐPÕPÔP ÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÐP×PÒPÐPÑPÔPÐPÐPÑPÕPÔPÐPÐPÐPÐP n¸ÐPÑPÔPÕPÔP nÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP¸ÑPÔPÐPÕPÔP¸ÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÐP×PÒPÐPÑPÔPÐPÐPÐPÕPÔPÐPÐPÐPÐP¸^ÈqÐPÑPÔPÕPÔP¸^ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPÈqÑPÔPÐPÕPÔPÈqÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÐP×PÒPÐPÑPÔPÐPÕPÔPÐPÐPÑPÔPÐPÑPÐPÐPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPr)   z5Negative Baseline: Pending M2 - combat_feel_engine.jsc           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zCVerifies combat_feel_engine.js exists with triggerHitStop contract.r   rD   zcombat_feel_engine.jsr™   r   rš   Nrž   rŸ   s
             r'   Ú!test_f07_hit_stop_engine_baselinez:TestTier1FeatureCoverage.test_f07_hit_stop_engine_baseline�   ó7  € ð "ÐP•
˜TÑ!ÐP HÐPÐ! HÑ,ÐPÐ/FÐPÐ,Ð/FÑFÐPÐFÔNÐPÐNÐNÑPÔPÐPÐPÐPÐPÐPÕPÔPÑPÔPÐPÐPÕPÔP•
ÑPÔPÐPÕPÔP•
ÑPÔPÐPÐPÕPÔP˜TÑPÔPÕPÔP HÑPÔPÕPÔPÐ/FÑPÔPÕPÔPÐNÑPÔPÕPÔPÐPÑPÔPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPÐPr)   z7Negative Baseline: Pending M2 - weapon_swing_catalog.jsc                óÂ  — t           dz  dz  dz  }g }|j        } |¦   «         }|}|rd}|j        }d} ||¬¦  «        }	||	v }
|
}|�s…ddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }|                     |¦  «         |rÄt          j	        d
|
fd||	f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}
x}x}}	dS )zBVerifies weapon_swing_catalog.js covers Slash, Thrust, Slam, Bolt.r   Údatazweapon_swing_catalog.jsÚSLASHr   r   rP   Úcat_filerR   r‚   rá   râ   rä   r²   r   rå   ræ   Nrç   )rp   r  rq   rr   rs   rt   ru   r¤   rè   rÚ   rw   rx   r|   r½   r’   rÜ   s                   r'   Ú&test_f08_weapon_swing_catalog_baselinez?TestTier1FeatureCoverage.test_f08_weapon_swing_catalog_baseline•   sH  € õ  Ñ$ vÑ-Ð0IÑIˆØTÐTˆxŒÐTˆˆÑ Ô ÐTÐ ÐTÐ ÐT WÐT°Ô0BÐTÈGÐTÐ0BÐ0BÈGÐ0TÑ0TÔ0TÐT WÐ0TÐ%TÐTÐTÐTÐTÑTÐTÐTÕTÔTÑTÔTÐTÐTÕTÔTˆxÑTÔTÐTÕTÔTˆxÑTÔTÐTÐTÕTÔTˆÑTÔTÕTÔTÐ ÑTÔTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÐ ÐTÕTÔTÐTÐTÐTÐT WÐ0TÐTÑTÔTÕTÔT WÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔT°ÑTÔTÐTÕTÔT°ÑTÔTÐTÐTÕTÔTÐ0BÑTÔTÕTÔTÈGÑTÔTÕTÔTÐ0TÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÕTÔTÐTÐTÑTÔTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTr)   rG   r8   c                ó  — |\  }}}d}|                      |j        |¦  «         |                     |j        |j        dt          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|j        }d}||k    }|}|�s~t          j        d|
fd||	f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        d	œz  }d
d|iz  }|                     |¦  «         |
ržt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )z8Verifies 0.25s i-frame prevents damage in combat engine.i † g      i@r¨   Tr;   ©Úis©z1%(py4)s
{%(py4)s = %(py2)s.is_evaded
} is %(py7)sÚdmg_res©rS   rT   rÃ   ú%(py9)srY   rV   )z6%(py13)s
{%(py13)s = %(py11)s.current_hp
} == %(py16)srE   ©r…   r†   r‡   ú%(py18)srˆ   r   úassert %(py21)srÖ   N)Útrigger_phantom_evasionÚactor_idÚcalculate_damager   ÚHOAÚ	is_evadedr=   ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   rG   rD   rE   rF   Únow_msr  rq   rr   r¡   rs   rt   r¤   r�   rè   rÊ   Ú@py_format10r¼   r‘   r½   r“   s                        r'   Ú%test_f09_dodge_iframe_state_and_timerz>TestTier1FeatureCoverage.test_f09_dodge_iframe_state_and_timerœ   sw  € à*Ñˆ��eØˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×)Ò)¨%¬.¸$¼-ÈÕP\ÔP`ÐbhÐknÑbnÑoÔoˆØFÐFˆwÔ ÐF DÐFÐ  DÐ(ÐFÐFÐFÐFÐF¨T¬_ÐFÀÐF¨_ÀÒ-FÐFÐFÐFÐFÑFÕFÔFÐFÐFÐFÐFÐ  DÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFˆwÑFÔFÐFÕFÔFˆwÑFÔFÐFÐFÕFÔFÐ ÑFÔFÕFÔF DÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÐF×FÒFÐFÑFÔFÐFÐFÐFÕFÔFÐFÐFÐFÐF¨_ÀÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF¨TÑFÔFÐFÕFÔF¨TÑFÔFÐFÐFÕFÔF¨_ÑFÔFÕFÔFÀÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÐF×FÒFÐFÑFÔFÐFÕFÔFÐFÐFÑFÔFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFr)   z3Negative Baseline: Pending M2 - 3-charge dodge poolc                óü  — g }d}||v }|}|sd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |s‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )zGVerifies dodge charges pool (3 charges, 3s refill) in combat_skills.js.ÚdodgeChargesÚchargesRemainingr‚   rÀ   r(   rÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   r:   r]   r^   NrÇ   rÈ   s                 r'   Ú&test_f09_dodge_charges_budget_baselinez?TestTier1FeatureCoverage.test_f09_dodge_charges_budget_baseline¤   sñ  € ð 	VÐUˆ~ÐUˆ~ Ð.ÐUÐUÐUÐUÐUÐ2DÐUÐ2DÈÐ2UÐUÐUÐUÐUÑUÕUÔUÐUÐUÐUÐUˆ~ ÐUÑUÔUÕUÔUˆ~ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU ÑUÔUÐUÕUÔU ÑUÔUÐUÐUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÐUÐUÕUÔUÐUÐUÐUÐUÐ2DÈÐUÑUÔUÕUÔUÐ2DÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUÈÑUÔUÐUÕUÔUÈÑUÔUÐUÐUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÐU×UÒUÐUÑUÔUÐUÕUÔUÐUÐUÑUÔUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUr)   c           	     óJ  — g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|�sæt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd	|
iz  }|                     |¦  «         |�rt          j        d|fd
||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|	fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}	d}t          |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zdVerifies 3 core elemental skill systems: Crescent Slash (Fire), Lightning (Thunder), Spikes (Frost).Úvfx_slashesÚvfx_lightningsÚ
vfx_spikesr‚   rÀ   r(   rÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   rÓ   rÔ   rÕ   rÖ   r   r×   rØ   Nr,   r6   zelemental_particles.metalr™   r   rš   rô   )rp   r(   rq   r}   r    rt   r£   rv   rÚ   rÛ   rÉ   rÊ   ry   rz   r½   r“   rÜ   rÝ   rr   r¡   r¢   rw   r¤   r�   s                           r'   Ú%test_f10_to_f15_elemental_vfx_presentz>TestTier1FeatureCoverage.test_f10_to_f15_elemental_vfx_presentª   sê  € àuÐuˆ}Ðuˆ} Ð-ÐuÐuÐuÐuÐuÐ2BÐuÐ2BÀmÐ2SÐuÐuÐuÐuÐuÐXdÐuÐXdÐhuÐXuÐuÐuÐuÐuÑuÕuÔuÐuÐuÐuÐuˆ} ÐuÑuÔuÕuÔuˆ}ÑuÔuÐuÕuÔuÑuÔuÐuÐuÕuÔu ÑuÔuÐuÕuÔu ÑuÔuÐuÐuÐuÐuÑuÐuÐuÐuÐuÐuÑuÐuÐu×uÒuÐuÑuÔuÐuÐuÑuÕuÔuÐuÐuÐuÐuÐ2BÀmÐuÑuÔuÕuÔuÐ2BÑuÔuÐuÕuÔuÑuÔuÐuÐuÕuÔuÀmÑuÔuÐuÕuÔuÀmÑuÔuÐuÐuÐuÐuÑuÐuÐuÐuÐuÐuÑuÐuÐu×uÒuÐuÑuÔuÐuÐuÐuÕuÔuÐuÐuÐuÐuÐXdÐhuÐuÑuÔuÕuÔuÐXdÑuÔuÐuÕuÔuÑuÔuÐuÐuÕuÔuÐhuÑuÔuÐuÕuÔuÐhuÑuÔuÐuÐuÐuÐuÑuÐuÐuÐuÐuÐuÑuÐuÐu×uÒuÐuÑuÔuÐuÕuÔuÐuÐuÑuÔuÐuÑuÐuÐuÐuÐuÐuÑuÐuÕuÕuÔuÐuÑuÔuÑuÔuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuÐuØ%ÐX•
˜XÑ%ÐX¨ÐXÐ%¨Ñ0ÐXÐ3NÐXÐ0Ð3NÑNÐXÐNÔVÐXÐVÐVÑXÔXÐXÐXÐXÐXÐXÕXÔXÑXÔXÐXÐXÕXÔX•
ÑXÔXÐXÕXÔX•
ÑXÔXÐXÐXÕXÔX˜XÑXÔXÕXÔX¨ÑXÔXÕXÔXÐ3NÑXÔXÕXÔXÐVÑXÔXÕXÔXÐXÑXÔXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXr)   c                óü  — g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	|                     |	¦  «         |r‹t          j        d|fd	||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
œz  }
dd|
iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )zGVerifies screen shake camera controller is integrated in client bundle.ÚtriggerScreenShakeÚscreenShaker‚   rÀ   r(   rÁ   rÂ   rÃ   rÄ   rÅ   r[   r\   r   r]   r^   NrÇ   rÈ   s                 r'   Útest_f16_screen_shake_in_enginez8TestTier1FeatureCoverage.test_f16_screen_shake_in_engine°   sî  € àWÐWÐ#ÐWÐ# }Ð4ÐWÐWÐWÐWÐW¸ÐW¸È-Ð9WÐWÐWÐWÐWÑWÕWÔWÐWÐWÐWÐWÐ# }ÐWÑWÔWÕWÔWÐ#ÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔW }ÑWÔWÐWÕWÔW }ÑWÔWÐWÐWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÐW×WÒWÐWÑWÔWÐWÐWÐWÕWÔWÐWÐWÐWÐW¸È-ÐWÑWÔWÕWÔW¸ÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔWÈ-ÑWÔWÐWÕWÔWÈ-ÑWÔWÐWÐWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÐW×WÒWÐWÑWÔWÐWÕWÔWÐWÐWÑWÔWÐWÑWÐWÐWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWr)   z5Negative Baseline: Pending M3 - telegraph_renderer.jsc           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zLVerifies telegraph_renderer.js exists for warning cones, circles, and beams.r   rD   ztelegraph_renderer.jsr™   r   rš   Nrž   rŸ   s
             r'   Ú$test_f17_telegraph_renderer_baselinez=TestTier1FeatureCoverage.test_f17_telegraph_renderer_baseline´   rþ   r)   c           	     ó8  — t          ¦   «         }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}t          d
d¦  «        D �]è}||v }|sÂt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }
t          t          j	        |
¦  «        ¦  «        ‚d	}||         }g }|j        }d}||k    }|}|r|j        }d}||k    }|}|�s~t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |ržt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}x}x}x}x}x}}g }|j        }t          |¦  «        }d}||k    }|}|r|j        }|t"          v }|}|�st          j        d|fd ||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d!œz  }d"d#|iz  }|                     |¦  «         |rØt          j        d|fd$|t"          f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d%t	          j        ¦   «         v st          j        t"          ¦  «        rt          j        t"          ¦  «        nd%d&œz  }d'd(|iz  }|                     |¦  «         t          j        |d¦  «        i z  }d)d*|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}x}x}x}x}x}}�Œêd	S )+zSVerifies server martial_catalog defines all 10 canonical active skills (1001-1010).é
   rV   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenr6   ©r›   rc   r¬   rU   úassert %(py8)sr�   Nié  ió  r‚   )z%(py0)s in %(py2)sÚsid)r›   rS   zassert %(py4)srT   r   ©ú>)z2%(py4)s
{%(py4)s = %(py2)s.energy_cost
} > %(py7)sÚskillr	  r
  rY   ©ú>=)z7%(py13)s
{%(py13)s = %(py11)s.cooldown_ms
} >= %(py16)sr  r  rˆ   r  rÖ   )zJ%(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.tags
})
} > %(py10)s)rS   r¬   rœ   rÃ   rÆ   ú%(py12)srZ   )z3%(py16)s
{%(py16)s = %(py14)s.element
} in %(py18)sr   )r\   r‡   rˆ   r‰   rŠ   r‹   rŒ   )r   r(  ri   rl   rg   rh   rj   rk   rn   ro   ÚrangeÚenergy_costÚcooldown_msr   rm   ÚtagsÚelementr   )rp   r6   r}   rs   r    rx   r»   r+  rq   Ú@py_format3r~   r.  rr   r¡   rt   r¤   r�   rè   rÊ   r  r¼   r‘   r½   r“   r£   ru   rŽ   Ú@py_format11ry   r’   r”   s                                  r'   Ú/test_f18_canonical_ten_skills_in_server_catalogzHTestTier1FeatureCoverage.test_f18_canonical_ten_skills_in_server_catalogº   sï  € å.Ñ0Ô0ˆÝ�6‰{Œ{Ð ˜bÐ ˆ{˜bÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ{˜bÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �6Ñ Ô Ð Õ Ô �6Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Õ Ô ˜bÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ý˜˜tÑ$Ô$ð 	Iñ 	IˆCØ˜&�=Ð Ð Ð Õ Ô Ð Ð Ð Ð �3˜&Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �3Ñ Ô Ð Õ Ô �3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜&Ñ Ô Ð Õ Ô ˜&Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ø˜3”KˆEØCÐC�5Ô$ÐC qÐCÐ$ qÒ(ÐCÐCÐCÐCÐC¨UÔ->ÐCÀ!ÐCÐ->À!Ò-CÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCÐ$ qÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC�5ÑCÔCÐCÕCÔC�5ÑCÔCÐCÐCÕCÔCÐ$ÑCÔCÕCÔC qÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ->À!ÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¨UÑCÔCÐCÕCÔC¨UÑCÔCÐCÐCÕCÔCÐ->ÑCÔCÕCÔCÀ!ÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCØHÐH�u”zÐH•3�z‘?”?ÐH QÐH�? QÒ&ÐHÐHÐHÐHÐH¨5¬=ÐH¨=½LÐ+HÐHÐHÐHÐHÑHÕHÔHÐHÐHÐHÐH�? QÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH•3ÑHÔHÐHÕHÔH•3ÑHÔHÐHÐHÐHÕHÔHÑHÔHÐHÐHÕHÔH�uÑHÔHÐHÕHÔH�uÑHÔHÐHÐHÕHÔH�zÑHÔHÕHÔH�?ÑHÔHÕHÔH QÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÐHÐHÕHÔHÐHÐHÐHÐH¨=½LÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH¨5ÑHÔHÐHÕHÔH¨5ÑHÔHÐHÐHÕHÔH¨=ÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH½LÑHÔHÐHÕHÔH½LÑHÔHÐHÐHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÕHÔHÐHÐHÑHÔHÐHÑHÐHÐHÐHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÑHð		Ið 	Ir)   r7   c                ó`  — g }|d         }d}||k    }|}|r|d         }d}||k    }	|	}|�st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd	|
iz  }|                     |¦  «         |r`t          j        d|	fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	}|d         }t          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zIVerifies client metadata defines atlas UVs and target_fps=120 for skills.Úatlas_widthi   Ú
target_fpséx   rV   rª   r«   r­   r�   r®   r¯   r°   r‡   r   r±   r²   Nr6   r&  )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr(  )r›   rS   rT   rÃ   zassert %(py9)srY   )ri   rl   rk   r   rm   rn   ro   r(  rg   rh   rj   )rp   r7   rq   r}   rs   r    rt   rw   rº   r¤   rx   r»   rz   r¼   r|   r½   rr   r¡   rÊ   r  s                       r'   Ú0test_f18_canonical_ten_skills_in_client_metadatazITestTier1FeatureCoverage.test_f18_canonical_ten_skills_in_client_metadataÄ   sÂ  € à^Ð^ˆ˜}Ô-Ð^°Ð^Ð-°Ò5Ð^Ð^Ð^Ð^Ð^¸/È,Ô:WÐ^Ð[^Ð^Ð:WÐ[^Ò:^Ð^Ð^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^Ð-°Ð^Ñ^Ô^Õ^Ô^Ð-Ñ^Ô^Õ^Ô^°Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^Ð:WÐ[^Ð^Ñ^Ô^Õ^Ô^Ð:WÑ^Ô^Õ^Ô^Ð[^Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Õ^Ô^Ð^Ð^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ø" 8Ô,Ð3�sÐ,Ñ-Ô-Ð3°Ð3Ð-°Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð-°Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3�sÑ3Ô3Ð3Õ3Ô3�sÑ3Ô3Ð3Ð3Õ3Ô3Ð,Ñ3Ô3Õ3Ô3Ð-Ñ3Ô3Õ3Ô3°Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r)   z+Negative Baseline: Pending M4 - vfx_pool.jsc           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zRVerifies vfx_pool.js provides static object pools (512 particles, 64 projectiles).r   rD   zvfx_pool.jsr™   r   rš   Nrž   rŸ   s
             r'   Ú*test_f19_zero_allocation_vfx_pool_baselinezCTestTier1FeatureCoverage.test_f19_zero_allocation_vfx_pool_baselineÉ   s4  € ð "ÐF•
˜TÑ!ÐF HÐFÐ! HÑ,ÐF¨}ÐFÐ,¨}Ñ<ÐFÐ<ÔDÐFÐDÐDÑFÔFÐFÐFÐFÐFÐFÕFÔFÑFÔFÐFÐFÕFÔF•
ÑFÔFÐFÕFÔF•
ÑFÔFÐFÐFÕFÔF˜TÑFÔFÕFÔF HÑFÔFÕFÔF¨}ÑFÔFÕFÔFÐDÑFÔFÕFÔFÐFÑFÔFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFr)   c           	     ó  — d}t           |z  }d}||z  }d}||z  }|j        } |¦   «         }|sÎddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}dS )zGVerifies target_dummy_telemetry.js exists for DPS and combat telemetry.r   rD   ztarget_dummy_telemetry.jsr™   r   rš   Nrž   rŸ   s
             r'   Ú&test_f20_target_dummy_telemetry_existsz?TestTier1FeatureCoverage.test_f20_target_dummy_telemetry_existsÎ   s5  € à!ÐT•
˜TÑ!ÐT HÐTÐ! HÑ,ÐTÐ/JÐTÐ,Ð/JÑJÐTÐJÔRÐTÐRÐRÑTÔTÐTÐTÐTÐTÐTÕTÔTÑTÔTÐTÐTÕTÔT•
ÑTÔTÐTÕTÔT•
ÑTÔTÐTÐTÕTÔT˜TÑTÔTÕTÔT HÑTÔTÕTÔTÐ/JÑTÔTÕTÔTÐRÑTÔTÕTÔTÐTÑTÔTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTr)   c                óB  — d}t           |z  }|j        } |¦   «         }|s¨ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}d}t           |z  }|j        } |¦   «         }|s¨ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}dS )z<Verifies TEST_INFRA.md and PROJECT.md exist at project root.rÏ   zMassert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}rÙ   )r›   rS   rœ   rÃ   Nz
PROJECT.md)	rÙ   r   rg   rh   ri   rj   rk   rn   ro   )rp   rq   rr   r    r¡   rÊ   s         r'   Ú(test_f21_test_infra_and_ready_docs_existzATestTier1FeatureCoverage.test_f21_test_infra_and_ready_docs_existÓ   s´  € à.Ð8•˜Ñ.Ð8Ð.Ô6Ð8Ð6Ð6Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8•Ñ8Ô8Ð8Õ8Ô8•Ñ8Ô8Ð8Ð8Õ8Ô8˜Ñ8Ô8Õ8Ô8Ð6Ñ8Ô8Õ8Ô8Ð8Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø+Ð5•˜|Ñ+Ð5Ð+Ô3Ð5Ð3Ð3Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5•Ñ5Ô5Ð5Õ5Ô5•Ñ5Ô5Ð5Ð5Õ5Ô5˜|Ñ5Ô5Õ5Ô5Ð3Ñ5Ô5Õ5Ô5Ð5Ñ5Ô5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5r)   c                óÆ  — ddl m}  |t          t          ¦  «        d¬¦  «        }d„ |j        D ¦   «         }t          |¦  «        }d}||k    }|�s
t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }t          j        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )zQRuns check_code_and_doc_hygiene.py in strict mode; asserts 0 Hard Cap violations.r   )Úrun_hygiene_auditF)Úcheck_funcsc                ó(   — g | ]}|j         d k    ¯|‘ŒS )ÚERROR)Úseverity)Ú.0Úvs     r'   ú
<listcomp>zQTestTier1FeatureCoverage.test_f23_code_and_doc_hygiene_strict.<locals>.<listcomp>Ü   s$   € ÐWÐWÐW !ÀÄÈwÒAVÐAV˜AÐAVÐAVÐAVr)   rV   r'  r(  Úerror_violationsr)  zHard Cap violations found: z
>assert %(py8)sr�   N)Ú%tools.lint.check_code_and_doc_hygienerF  r   rÙ   Úfile_violationsr(  ri   rl   rg   rh   rj   rk   Ú_format_assertmsgrn   ro   )	rp   rF  ÚreportrN  r}   rs   r    rx   r»   s	            r'   Ú$test_f23_code_and_doc_hygiene_strictz=TestTier1FeatureCoverage.test_f23_code_and_doc_hygiene_strictØ   sŒ  € àKÐKÐKÐKÐKÐKØ"Ð"¥3¥|Ñ#4Ô#4À%ÐHÑHÔHˆØWÐW vÔ'=ÐWÑWÔWÐÝÐ#Ñ$Ô$Ð[¨Ð[Ð$¨Ò)Ð[Ð[Ñ[Õ[Ô[Ð[Ð[Ð[Ð[Ð$¨Ð[Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[�sÑ[Ô[Ð[Õ[Ô[�sÑ[Ô[Ð[Ð[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[Ð#Ñ[Ô[Ð[Õ[Ô[Ð#Ñ[Ô[Ð[Ð[Õ[Ô[Ð$Ñ[Ô[Õ[Ô[¨Ñ[Ô[Ð[Ð[Ñ[Ð[Õ[Ô[Ð+[ÐIYÐ+[Ð+[Ñ[Ô[Ð[Ñ[Ð[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[r)   N©r4   r*   r   rJ   ©r   rJ   )r(   r   r   rJ   ©rG   r8   r   rJ   )r7   r*   r   rJ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r•   ÚpytestÚmarkÚxfailr¥   r¾   rË   rÍ   rÞ   ré   rí   rõ   rû   rý   r  r  r  r  r"  r$  r9  r>  r@  rB  rD  rS  © r)   r'   rI   rI   F   s”  € € € € € ØCÐCðJð Jð Jð JðVð Vð Vð Vð „[×Ò˜eÐ,`ÐÑaÔaðCð Cð Cñ bÔaðCð
:ð :ð :ð :ðQð Qð Qð Qð
 „[×Ò˜eÐ,eÐÑfÔfðOð Oð Oñ gÔfðOð
Yð Yð Yð Yð
 „[×Ò˜eÐ,hÐÑiÔið^ð ^ð ^ñ jÔið^ðbð bð bð bðWð Wð Wð Wð „[×Ò˜eÐ,eÐÑfÔfðQð Qð Qñ gÔfðQð „[×Ò˜eÐ,cÐÑdÔdðQð Qð Qñ eÔdðQð „[×Ò˜eÐ,eÐÑfÔfðUð Uð Uñ gÔfðUðGð Gð Gð Gð „[×Ò˜eÐ,aÐÑbÔbðVð Vð Vñ cÔbðVð
Yð Yð Yð YðXð Xð Xð Xð „[×Ò˜eÐ,cÐÑdÔdðQð Qð Qñ eÔdðQð
Ið Ið Ið Ið4ð 4ð 4ð 4ð
 „[×Ò˜eÐ,YÐÑZÔZðGð Gð Gñ [ÔZðGðUð Uð Uð Uð
6ð 6ð 6ð 6ð
\ð \ð \ð \ð \ð \r)   rI   c                  óÆ   — e Zd ZdZej                             dg d¢¦  «        dd	„¦   «         Zej                             d
g d¢¦  «        dd„¦   «         Zdd„Z	dd„Z
dd„ZdS )ÚTestTier2BoundaryAndCornerCaseszYTier 2: Boundary & Corner Cases (0/negative HP, rapid spam, extreme coords, empty slots).zhp_input, expected_ratio))ç        ra  )g      IÀra  )g    €‡ÃÀra  )r;   ç      ð?)g     p—@rb  Úhp_inputÚfloatÚexpected_ratior   rJ   c           	     óÞ  — d}t          dt          d||z  ¦  «        ¦  «        }t          j        }d} ||||¬¦  «        }|�s$ddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}dS )zLDual Orbs fill ratio must clamp smoothly between 0.0 (empty) and 1.0 (full).r;   ra  rb  gñhãˆµøä>©Úabs_tolzcassert %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py3)s, %(py4)s, abs_tol=%(py6)s)
}ÚmathÚratiore  )r›   rS   r¬   rT   rU   r�   N)ÚmaxÚminri  Úiscloserg   rh   ri   rj   rk   rn   ro   )	rp   rc  re  r>   rj  rq   rs   r¢   r»   s	            r'   Ú%test_boundary_orb_fill_ratio_clampingzETestTier2BoundaryAndCornerCases.test_boundary_orb_fill_ratio_clampingã   sk  € ð
 ˆÝ�C�˜S (¨VÑ"3Ñ4Ô4Ñ5Ô5ˆÝŒ|Ð@¸4Ð@ˆ|ˆ|˜E >¸4Ð@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�tÑ@Ô@Ð@Õ@Ô@�tÑ@Ô@Ð@Ð@Õ@Ô@ˆ|Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@˜EÑ@Ô@Ð@Õ@Ô@˜EÑ@Ô@Ð@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ >Ñ@Ô@Ð@Õ@Ô@ >Ñ@Ô@Ð@Ð@Õ@Ô@¸4Ñ@Ô@Õ@Ô@Ð@Ñ@Ô@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r)   Úinvalid_cooldown)g      $Àgü©ñÒMbP¿ra  c                óp  — t          d|¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )	zBNegative or zero cooldown duration must clamp to 0.0s immediately.ra  rV   )z%(py0)s == %(py3)sÚclamped©r›   r¬   úassert %(py5)srœ   N)	rk  ri   rl   rg   rh   rj   rk   rn   ro   )rp   ro  rq  r}   rq   Ú@py_format4rÉ   s          r'   Ú8test_boundary_cooldown_sweep_non_positive_clamps_to_zerozXTestTier2BoundaryAndCornerCases.test_boundary_cooldown_sweep_non_positive_clamps_to_zeroì   sÛ   € õ �cÐ+Ñ,Ô,ˆØÐˆw˜#Š~ÐÐÐÕÔÐÐÐÐˆw˜#ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜#ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr)   rG   r8   c                óp  — |\  }}}d}|                      |j        |¦  «         |j        }|j        }|j        }d}	t          j        }
 ||||	|
|¦  «        }|j        }d}||u }|�st          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        d	t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |
¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}
x}x}x}}|j        }|j        }|j        }d}	t          j        }
d}||z   } ||||	|
|¦  «        }|j        }d}||u }|�s1t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        d	t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |
¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}
x}x}x}x}x}}|j        }|j        }|j        }d}	t          j        }
d}||z   } ||||	|
|¦  «        }|j        }d}||u }|�s1t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        d	t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |
¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}
x}x}x}x}x}}dS )zWTests exact evasion boundaries: t+0ms (evaded), t+249ms (evaded), t+251ms (vulnerable).i ¡ ç      Y@Tr  )zø%(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py2)s
{%(py2)s = %(py0)s.calculate_damage
}(%(py5)s
{%(py5)s = %(py3)s.actor_id
}, %(py8)s
{%(py8)s = %(py6)s.actor_id
}, %(py10)s, %(py13)s
{%(py13)s = %(py11)s.HOA
}, %(py14)s)
}.is_evaded
} is %(py21)srD   rF   rE   r   Út0)r›   rS   r¬   rœ   rU   r�   rÆ   r…   r†   r\   r‡   rˆ   rÖ   r‹   rŒ   Néù   )a  %(py21)s
{%(py21)s = %(py19)s
{%(py19)s = %(py2)s
{%(py2)s = %(py0)s.calculate_damage
}(%(py5)s
{%(py5)s = %(py3)s.actor_id
}, %(py8)s
{%(py8)s = %(py6)s.actor_id
}, %(py10)s, %(py13)s
{%(py13)s = %(py11)s.HOA
}, (%(py14)s + %(py16)s))
}.is_evaded
} is %(py24)s)r›   rS   r¬   rœ   rU   r�   rÆ   r…   r†   r\   r‡   r²   rÖ   rØ   zassert %(py26)sÚpy26éû   F)r  r  r  r   r  r  ri   rl   rg   rh   rj   rk   rn   ro   )rp   rG   rD   rE   rF   rx  rq   r    r¢   r£   r¤   r�   rŽ   Ú@py_assert20Ú@py_assert19r“   r”   rÛ   Ú@py_assert23Ú@py_assert22rÝ   Ú@py_format27s                         r'   Ú,test_boundary_iframe_window_exact_boundarieszLTestTier2BoundaryAndCornerCases.test_boundary_iframe_window_exact_boundariesò   s&  € à*Ñˆ��eØˆØ×&Ò& t¤}°bÑ9Ô9Ð9ØÔ&Ðt u¤~Ðt°t´}ÐtÀeÐtÍ\ÔM]ÐtÐ&Ð& ~°}ÀeÐM]Ð_aÑbÔbÐtÐbÔlÐtÐptÐtÐlÐptÐtÐtÐtÑtÕtÔtÐtÐtÐtÐtÐlÐptÐtÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔtˆvÑtÔtÐtÕtÔtˆvÑtÔtÐtÐtÕtÔtÐ&ÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔt uÑtÔtÐtÕtÔt uÑtÔtÐtÐtÕtÔt ~ÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔt°tÑtÔtÐtÕtÔt°tÑtÔtÐtÐtÕtÔt°}ÑtÔtÕtÔtÀeÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔtÍ\ÑtÔtÐtÕtÔtÍ\ÑtÔtÐtÐtÕtÔtÐM]ÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔtÐ_aÑtÔtÐtÕtÔtÐ_aÑtÔtÐtÐtÕtÔtÐbÑtÔtÕtÔtÐlÑtÔtÕtÔtÐptÑtÔtÐtÐtÑtÐtÐtÐtÐtÐtÑtÐtÕtÕtÔtÐtÑtÔtÑtÔtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtÐtØÔ&Ðz u¤~Ðz°t´}ÐzÀeÐzÍ\ÔM]ÐzÐdgÐzÐ_aÐdgÑ_gÐzÐ&Ð& ~°}ÀeÐM]Ð_gÑhÔhÐzÐhÔrÐzÐvzÐzÐrÐvzÐzÐzÐzÑzÕzÔzÐzÐzÐzÐzÐrÐvzÐzÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔzˆvÑzÔzÐzÕzÔzˆvÑzÔzÐzÐzÕzÔzÐ&ÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔz uÑzÔzÐzÕzÔz uÑzÔzÐzÐzÕzÔz ~ÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔz°tÑzÔzÐzÕzÔz°tÑzÔzÐzÐzÕzÔz°}ÑzÔzÕzÔzÀeÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔzÍ\ÑzÔzÐzÕzÔzÍ\ÑzÔzÐzÐzÕzÔzÐM]ÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔzÐ_aÑzÔzÐzÕzÔzÐ_aÑzÔzÐzÐzÕzÔzÐdgÑzÔzÕzÔzÐhÑzÔzÕzÔzÐrÑzÔzÕzÔzÐvzÑzÔzÐzÐzÑzÐzÐzÐzÐzÐzÑzÐzÕzÕzÔzÐzÑzÔzÑzÔzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzØÔ&Ð{ u¤~Ð{°t´}Ð{ÀeÐ{Í\ÔM]Ð{ÐdgÐ{Ð_aÐdgÑ_gÐ{Ð&Ð& ~°}ÀeÐM]Ð_gÑhÔhÐ{ÐhÔrÐ{Ðv{Ð{ÐrÐv{Ð{Ð{Ð{Ñ{Õ{Ô{Ð{Ð{Ð{Ð{ÐrÐv{Ð{Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ˆvÑ{Ô{Ð{Õ{Ô{ˆvÑ{Ô{Ð{Ð{Õ{Ô{Ð&Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ uÑ{Ô{Ð{Õ{Ô{ uÑ{Ô{Ð{Ð{Õ{Ô{ ~Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{°tÑ{Ô{Ð{Õ{Ô{°tÑ{Ô{Ð{Ð{Õ{Ô{°}Ñ{Ô{Õ{Ô{ÀeÑ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{Í\Ñ{Ô{Ð{Õ{Ô{Í\Ñ{Ô{Ð{Ð{Õ{Ô{ÐM]Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{Ð_aÑ{Ô{Ð{Õ{Ô{Ð_aÑ{Ô{Ð{Ð{Õ{Ô{ÐdgÑ{Ô{Õ{Ô{ÐhÑ{Ô{Õ{Ô{ÐrÑ{Ô{Õ{Ô{Ðv{Ñ{Ô{Ð{Ð{Ñ{Ð{Ð{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{r)   c           	     óü  — t          dt          dt          j        d¦  «        dz  ¦  «        ¦  «        }d}||k    }d}||k    }|r|s¬t	          j        d||fd|||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        dœz  }d	d
|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zFScreen shake intensity from massive damage ($10^6$) clamps to max 8.5.g      !@g      @g    €„.Ag      ø?)ú<=rƒ  )z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sÚraw_intensity)rc   rT   rU   r*  r�   N)rl  rk  ri  Úlog10ri   rl   rk   rg   rh   rj   rn   ro   )rp   r„  rt   r}   rs   rr   rx   r»   s           r'   Ú+test_boundary_extreme_screen_shake_clampingzKTestTier2BoundaryAndCornerCases.test_boundary_extreme_screen_shake_clampingû   s&  € å˜C¥ S­$¬*°[Ñ*AÔ*AÀCÑ*GÑ!HÔ!HÑIÔIˆØÐ*ˆs�mÒ*Ð* sÐ*�m sÒ*Ð*Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð*ˆs�m sÐ*Ñ*Ô*Õ*Ô*ˆsÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�mÑ*Ô*Ð*Õ*Ô*�mÑ*Ô*Ð*Ð*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*r)   c                ó¸  — d}d}d„ t          |¦  «        D ¦   «         }d}|dz  }||         ||         c||<   ||<   d||         d<   g }d}||k    }|}|rt          |¦  «        }	|	|k    }
|
}|�sßt          j        d|fd	||f¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |�rt          j        d|
fd|	|f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	}
dS )zESimulates O(1) swap-and-pop array pointer recycling at pool capacity.i   c                ó   — g | ]}|d dœ‘ŒS )T)ÚidÚactiver^  )rK  Úis     r'   rM  zbTestTier2BoundaryAndCornerCases.test_boundary_particle_pool_swap_and_pop_logic.<locals>.<listcomp>  s    € ÐCÐCÐC¨a�q DÐ)Ð)ÐCÐCÐCr)   r¨   r:   FrŠ  iÿ  rV   )z%(py2)s == %(py5)sÚactive_count©rS   rœ   rÂ   rÃ   )z4%(py12)s
{%(py12)s = %(py9)s(%(py10)s)
} == %(py14)sr(  ÚpoolÚcapacity)rY   rÆ   rZ   r\   r°   r‡   r   r±   r²   N)r2  r(  ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   r�  rŒ  rŽ  Údead_idxrq   r    rr   rt   rv   rº   rÉ   rÊ   rz   r¼   r|   r½   s                    r'   Ú.test_boundary_particle_pool_swap_and_pop_logiczNTestTier2BoundaryAndCornerCases.test_boundary_particle_pool_swap_and_pop_logic   sÃ  € àˆØˆØCÐCµ5¸±?´?ÐCÑCÔCˆàˆØ˜ÑˆØ-1°,Ô-?ÀÀhÄÐ*ˆˆX‰˜˜\Ñ*Ø',ˆˆ\Ô˜8Ñ$Ø<Ð<˜sÐ<ˆ|˜sÒ"Ð<Ð<Ð<Ð<Ð<¥s¨4¡y¤yÐ< y°HÒ'<Ð<Ð<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<ˆ|˜sÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆ|Ñ<Ô<Ð<Õ<Ô<ˆ|Ñ<Ô<Ð<Ð<Õ<Ô<˜sÑ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð< y°HÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¥sÑ<Ô<Ð<Õ<Ô<¥sÑ<Ô<Ð<Ð<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¨4Ñ<Ô<Ð<Õ<Ô<¨4Ñ<Ô<Ð<Ð<Õ<Ô< yÑ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<°HÑ<Ô<Ð<Õ<Ô<°HÑ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Õ<Ô<Ð<Ð<Ñ<Ô<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r)   N)rc  rd  re  rd  r   rJ   )ro  rd  r   rJ   rV  rU  )rW  rX  rY  rZ  r[  r\  Úparametrizern  ru  r�  r†  r‘  r^  r)   r'   r`  r`  à   sß   € € € € € ØcÐcà„[×ÒÐ7ð :ð :ð :ñ ô ðAð Að Añô ðAð „[×ÒÐ/Ð1EÐ1EÐ1EÑFÔFðð ð ñ GÔFðð
|ð |ð |ð |ð+ð +ð +ð +ð

=ð 
=ð 
=ð 
=ð 
=ð 
=r)   r`  c                  ó2   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zd
S )Ú!TestTier3CrossFeatureCombinationszATier 3: Cross-Feature State Interleaving & Pairwise Interactions.rG   r8   r   rJ   c                ó.  — |\  }}}d}d|_         |                     |j        |¦  «         d|_         |                     |j        |j        dt          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|j         }d}||u }|}|�s~t          j        d|
fd||	f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        d	œz  }d
d|iz  }|                     |¦  «         |
ržt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )zUPlayer executing dodge roll during skill wind-up interrupts attack and gains i-frame.i@ TFg     Àr@r©   r  r  Úresr	  r
  rY   )z9%(py13)s
{%(py13)s = %(py11)s.is_channeling
} is %(py16)srE   r  r  rˆ   r   r  rÖ   N)Úis_channelingr  r  r  r   r  r  ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   rG   rD   rE   rF   r  r–  rq   rr   r¡   rs   rt   r¤   r�   rè   rÊ   r  r¼   r‘   r½   r“   s                        r'   Ú%test_cross_dodge_cancels_skill_windupzGTestTier3CrossFeatureCombinations.test_cross_dodge_cancels_skill_windup  s†  € à*Ñˆ��eØˆà!ˆÔà×&Ò& t¤}°fÑ=Ô=Ð=Ø"ˆÔØ×%Ò% e¤n°d´mÀUÍLÔL\Ð^dÐgiÑ^iÑjÔjˆØDÐDˆsŒ}ÐD ÐDˆ} Ð$ÐDÐDÐDÐDÐD¨Ô);ÐD¸uÐDÐ);¸uÐ)DÐDÐDÐDÐDÑDÕDÔDÐDÐDÐDÐDˆ} ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDˆsÑDÔDÐDÕDÔDˆsÑDÔDÐDÐDÕDÔDˆ}ÑDÔDÕDÔD ÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ);¸uÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD¨ÑDÔDÐDÕDÔD¨ÑDÔDÐDÐDÕDÔDÐ);ÑDÔDÕDÔD¸uÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÕDÔDÐDÐDÑDÔDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDr)   c                óô  — d}d}d}d}|r|dz  n|}t          d|d||z  z
  z  ¦  «        }g }||k    }|}	|r||k     }
|
}	|	�s®t          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |r¶t          j        d|
fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}	x}x}}
dS )zOSimulates hit-stop micro-pause (dt * 0.05) occurring while screen shake decays.g333333Ó?g      @gü©ñÒMb�?Tgš™™™™™©?ra  rb  ©rƒ  )z%(py2)s <= %(py4)sÚdecayed_intensityÚshake_intensity)rS   rT   z%(py6)srU   )ú<)z%(py8)s < %(py10)sÚeffective_dtÚdt)r�   rÆ   r1  rZ   r   zassert %(py15)srã   N)rk  ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   Úshake_timerrœ  rŸ  Úis_hit_stoprž  r›  rq   rr   rt   r£   r~   rx   r8  ry   r�   r{   s                    r'   Ú'test_cross_hit_stop_during_screen_shakezITestTier3CrossFeatureCombinations.test_cross_hit_stop_during_screen_shake  su  € àˆØˆØˆØˆØ$/Ð7�r˜D‘y�y°Rˆå  _¸¸lÈ[Ñ>XÑ8XÑ%YÑZÔZÐØIÐIÐ  OÒ3ÐIÐIÐIÐIÐI¸ÀrÒ8IÐIÐIÐIÐIÑIÕIÔIÐIÐIÐIÐIÐ  OÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔIÐ ÑIÔIÐIÕIÔIÐ ÑIÔIÐIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔI OÑIÔIÐIÕIÔI OÑIÔIÐIÐIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÐI×IÒIÐIÑIÔIÐIÐIÐIÕIÔIÐIÐIÐIÐI¸ÀrÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI¸ÑIÔIÐIÕIÔI¸ÑIÔIÐIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔIÀrÑIÔIÐIÕIÔIÀrÑIÔIÐIÐIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÐI×IÒIÐIÑIÔIÐIÕIÔIÐIÐIÑIÔIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIr)   c                ó  — d}d}|dk    }|dk    }g }d}||u }|}|rd}	||	u }
|
}|�sXt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }|                     |¦  «         |r‹t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}
}	dS )zVVerifies state machine allows cooldown sweep and low-HP (<25%) warning simultaneously.g333333Ã?g333333ó?g      Ð?ra  Tr  )z%(py2)s is %(py5)sÚ	is_low_hpr�  rÂ   rÃ   )z%(py9)s is %(py12)sÚis_on_cooldownrX   r[   r\   r   r]   r^   N)
ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   Ú
hp_percentÚcooldown_remainingr¤  r¥  rq   r    rr   rt   rv   rw   rÉ   rÊ   ry   rz   r{   r|   s                    r'   Ú*test_cross_cooldown_sweep_and_low_hp_pulsezLTestTier3CrossFeatureCombinations.test_cross_cooldown_sweep_and_low_hp_pulse'  s	  € àˆ
Ø ÐØ $Ò&ˆ	Ø+¨cÒ1ˆØ;Ð;˜DÐ;ˆy˜DÐ Ð;Ð;Ð;Ð;Ð;°tÐ; ^°tÐ%;Ð;Ð;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;ˆy˜DÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Ð;Õ;Ô;˜DÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð; ^°tÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô; ^Ñ;Ô;Ð;Õ;Ô; ^Ñ;Ô;Ð;Ð;Õ;Ô;°tÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Õ;Ô;Ð;Ð;Ñ;Ô;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r)   c                ól  — d}d}d}d}|dk    o|}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )zNProjectiles in flight continue to target coordinates when target is destroyed.T)r<   g     €k@g      à?rb  r  )z%(py0)s is %(py3)sÚcrater_spawnedrr  rs  rœ   N)ri   rl   rg   rh   rj   rk   rn   ro   )	rp   Útarget_destroyedÚ
target_posÚproj_progressrª  r}   rq   rt  rÉ   s	            r'   Ú6test_cross_projectile_continues_after_target_destroyedzXTestTier3CrossFeatureCombinations.test_cross_projectile_continues_after_target_destroyed/  sï   € àÐØ#ˆ
ØˆàˆØ&¨#Ò-ÐBÐ2BˆØ!%Ð%ˆ~ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ~ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ~Ñ%Ô%Ð%Õ%Ô%ˆ~Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r)   NrV  rU  )rW  rX  rY  rZ  r˜  r¢  r¨  r®  r^  r)   r'   r”  r”    sr   € € € € € ØKÐKð
Eð 
Eð 
Eð 
Eð	Jð 	Jð 	Jð 	Jð<ð <ð <ð <ð&ð &ð &ð &ð &ð &r)   r”  c                  ó*   — e Zd ZdZdd„Zdd„Zdd
„ZdS )ÚTestTier4RealWorldScenariosz4Tier 4: Real-World End-to-End Application Scenarios.rG   r8   r   rJ   c           
     ó²  — |\  }}}d}|                      |j        |j        dt          j        |¦  «        }|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd	|
iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}	}|dz  }|                      |j        |j        dt          j        |¦  «        }|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd	|
iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}	}|dz  }|j        }|j        } |||¦  «        }d}||u }|�sLt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}}|                      |j        |j        dt          j        |dz   ¦  «        }|j        }d}||u }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd	|
iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}	}d
S )zUSimulates player rotation: Primary -> Skill 1001 -> Skill 1007 -> Dodge -> Telemetry.iè  rw  r   r,  )z3%(py2)s
{%(py2)s = %(py0)s.final_damage
} > %(py5)sÚr1)r›   rS   rœ   zassert %(py7)srÃ   Ni,  g     €q@r/  )z4%(py2)s
{%(py2)s = %(py0)s.final_damage
} >= %(py5)sÚr2i�  Tr  )z…%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.trigger_phantom_evasion
}(%(py5)s
{%(py5)s = %(py3)s.actor_id
}, %(py6)s)
} is %(py11)srD   rE   Út)r›   rS   r¬   rœ   rU   r�   r…   zassert %(py13)sr†   g     @@r¨   )z1%(py2)s
{%(py2)s = %(py0)s.is_evaded
} is %(py5)sÚr3)r  r  r   rA   Úfinal_damageri   rl   rg   rh   rj   rk   rn   ro   ÚKIMr  r  r  )rp   rG   rD   rE   rF   r´  r²  rq   r    rr   rÉ   rÊ   r³  r¢   rw   r£   r�   r�   rµ  s                      r'   Ú#test_scenario_target_dummy_rotationz?TestTier4RealWorldScenarios.test_scenario_target_dummy_rotation=  sÉ  € à*Ñˆ��eØˆà×$Ò$ T¤]°E´NÀEÍ<ÔK\Ð^_Ñ`Ô`ˆØŒÐ" Ð"ˆ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆrÑ"Ô"Ð"Õ"Ô"ˆrÑ"Ô"Ð"Ð"Õ"Ô"ˆÑ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"à	ˆS‰ˆØ×$Ò$ T¤]°E´NÀEÍ<ÔK[Ð]^Ñ_Ô_ˆØŒÐ' %Ð'ˆ %Ò'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆrÑ'Ô'Ð'Õ'Ô'ˆrÑ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'à	ˆS‰ˆØÔ-ÐG¨d¬mÐGÐ-Ð-¨m¸QÑ?Ô?ÐGÀ4ÐGÐ?À4ÐGÐGÐGÑGÕGÔGÐGÐGÐGÐGÐ?À4ÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆvÑGÔGÐGÕGÔGˆvÑGÔGÐGÐGÕGÔGÐ-ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG¨dÑGÔGÐGÕGÔG¨dÑGÔGÐGÐGÕGÔG¨mÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG¸QÑGÔGÐGÕGÔG¸QÑGÔGÐGÐGÕGÔGÐ?ÑGÔGÕGÔGÀ4ÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGà×$Ò$ U¤^°T´]ÀEÍ<ÔK[Ð]^ÐadÑ]dÑeÔeˆØŒ|Ð#˜tÐ#ˆ|˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ|˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆrÑ#Ô#Ð#Õ#Ô#ˆrÑ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r)   c           	     ó"  — d}d}d}d}||z   |z   |z   }g }d}||k    }|}	|r t           j        }
d}d} |
|||¬¦  «        }|}	|	�sºt          j        d|fd	||f¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |ríddt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |
¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}
x}x}}dS )z>Validates that micro-budgets for 120 FPS do not exceed 8.33ms.rb  g       @g      @g¤p=
×£@g)\�Âõ¨ @g{®Gáz„?rg  rš  )z%(py2)s <= %(py5)sÚtotal_frame_msr�  rÂ   rÃ   zc%(py18)s
{%(py18)s = %(py11)s
{%(py11)s = %(py9)s.isclose
}(%(py12)s, %(py14)s, abs_tol=%(py16)s)
}ri  )rY   r…   rZ   r\   r‡   rˆ   r   r  rÖ   N)ri  rm  ri   rl   rg   rh   rj   rk   r   rm   rn   ro   )rp   Úinput_budgetÚanimation_budgetÚvfx_particles_budgetÚcanvas_render_budgetrº  rq   r    rr   rt   rw   rº   r�   rŽ   rÉ   rÊ   r‘   r½   r“   s                      r'   Ú/test_scenario_120fps_promotion_budget_breakdownzKTestTier4RealWorldScenarios.test_scenario_120fps_promotion_budget_breakdownO  sv  € àˆØÐØ"ÐØ#ÐØ%Ð(8Ñ8Ð;OÑOÐRfÑfˆØZÐZ ÐZˆ~ Ò%ÐZÐZÐZÐZÐZ­$¬,ÐZÀtÐZÐUYÐZ¨,¨,°~ÀtÐUYÐ*ZÑ*ZÔ*ZÐZÐ*ZÐZÐZÑZÕZÔZÐZÐZÐZÐZˆ~ ÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ~ÑZÔZÐZÕZÔZˆ~ÑZÔZÐZÐZÕZÔZ ÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÐZ×ZÒZÐZÑZÔZÐZÐZÐZÐZÐZÕZÔZÑZÔZÐZÐZÕZÔZ­$ÑZÔZÐZÕZÔZ­$ÑZÔZÐZÐZÕZÔZ¨,ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ°~ÑZÔZÐZÕZÔZ°~ÑZÔZÐZÐZÕZÔZÀtÑZÔZÕZÔZÐUYÑZÔZÕZÔZÐ*ZÑZÔZÐZÐZÑZÐZÐZ×ZÒZÐZÑZÔZÐZÕZÔZÐZÐZÑZÔZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZr)   r4   r*   c                óò  — |d         }|d         }|d         }t          j        |d         |d         z
  |d         |d         z
  ¦  «        }|d         }||k    }|s—t          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}dS )zIVerifies mobile touch targets have non-overlapping ergonomic touch radii.rL   r§   r¶   ÚxÚyre   r,  )z%(py0)s > %(py3)sÚdistrr  rs  rœ   N)
ri  Úhypotri   rl   rg   rh   rj   rk   rn   ro   )
rp   r4   r¹   Úprimaryrò   rÃ  r}   rq   rt  rÉ   s
             r'   Ú.test_scenario_mobile_touch_cluster_interactionzJTestTier4RealWorldScenarios.test_scenario_mobile_touch_cluster_interactionX  s  € à˜ZÔ(ˆØÐ(Ô)ˆØ�oÔ&ˆÝŒz˜' #œ,¨¨s¬Ñ3°W¸S´\ÀEÈ#ÄJÑ5NÑOÔOˆØ˜nÔ-Ð-ˆtÐ-Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆtÐ-Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆtÑ-Ô-Ð-Õ-Ô-ˆtÑ-Ô-Ð-Ð-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r)   NrV  rU  rT  )rW  rX  rY  rZ  r¸  r¿  rÆ  r^  r)   r'   r°  r°  :  sZ   € € € € € Ø>Ð>ð$ð $ð $ð $ð$[ð [ð [ð [ð.ð .ð .ð .ð .ð .r)   r°  )r   r   )r   r*   )r   r8   )4rZ  Ú
__future__r   Úbuiltinsrg   Ú_pytest.assertion.rewriteÚ	assertionÚrewriteri   r0   ri  ÚosÚreÚsysÚtimeÚpathlibr   Útypingr   r   r   r   r[  ÚpathÚabspathr"   ÚdirnameÚ__file__Ú
SERVER_DIRÚinsertÚserver.world.combat_enginer	   r
   Úserver.world.martial_catalogr   Úserver.world.martial_typesr   r   r   ÚresolveÚparentrÙ   r   Úfixturer(   r4   r7   rG   rI   r`  r”  r°  r^  r)   r'   ú<module>rÞ     sî  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø €€€àŒW�_Š_˜RœWŸ\š\¨"¬'¯/ª/¸(Ñ*CÔ*CÀ^ÑTÔTÑUÔU€
Ø�S”XÐÐØ„H‡O‚O�A�zÑ"Ô"Ð"à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø FÐ FÐ FÐ FÐ FÐ FØ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ Màˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø˜HÑ$ xÑ/€
ð €„�iÐ Ñ Ô ð
ð 
ð 
ñ !Ô ð
ð €„�iÐ Ñ Ô ð=ð =ð =ñ !Ô ð=ð
 €„�iÐ Ñ Ô ð=ð =ð =ñ !Ô ð=ð
 „ðð ð ñ „ððW\ð W\ð W\ð W\ð W\ñ W\ô W\ð W\ðt*=ð *=ð *=ð *=ð *=ñ *=ô *=ð *=ðZ*&ð *&ð *&ð *&ð *&ñ *&ô *&ð *&ðZ$.ð $.ð $.ð $.ð $.ñ $.ô $.ð $.ð $.ð $.r)   