§
    îTÂj}  ã                  ó`  — U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlZ ee¦  «                             ¦   «         j        j        j        Zedz  dz  d	z  d
z  dz  Zedz  dz  d	z  dz  Zed	z  dz  dz  Zedz  Zedz  Zedz  Zedz  Zedz  dz  d	z  d
z  dz  dz  Zedz  dz  d	z  d
z  dz  Zddg d¢dœddg d¢dœddg d¢dœdd g d!¢dœd"d#g d$¢dœd%d&g d'¢dœd(d)g d*¢dœd+d,g d-¢dœd.d/g d0¢dœd1d2g d3¢dœd4d5g d6¢dœd7d8g d9¢dœgZd:ed;<   d<d=g d>¢dœZd?ed@<   dAdBg dC¢dœdDdEg dF¢dœdGdHg dI¢dœdJdKg dL¢dœdMdNg dO¢dœgZd:edP<   g dQ¢Zg dR¢Zg dS¢Z dddY„Z!ded]„Z" ej#        d^¬_¦  «        dfd`„¦   «         Z$ ej#        d^¬_¦  «        dgdb„¦   «         Z% ej#        d^¬_¦  «        dgdc„¦   «         Z&dS )hz\
Shared constants, tables, fixtures, and validators for FreeExile VFX & Pipeline E2E tests.
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚList)ÚImageÚclientÚcocosÚassetsÚ	resourcesÚvfxÚwebappÚapprovedz#savage_primal_skills_vfx_atlas.jsonz"savage_primal_skills_vfx_atlas.pngz)savage_primal_skills_vfx_atlas_normal.pngz#savage_primal_skills_vfx_atlas.astcÚmonstersÚ
archetypesÚ
charactersié  Úcuu_tieu_loi_kiem)Úlightning_swordÚ
skill_1001r   )ÚidÚkeyÚaliasesiê  Úthanh_phong_van_kiem_vu)Ú
wind_swordÚ
skill_1002r   ië  Úu_minh_huyet_doc_cham)Útoxic_needleÚ
skill_1003r   iì  Úthien_ma_boc_doc_kinh)Úpoison_novaÚ
skill_1004r   ií  Úbang_phach_han_quang_tran)Úglacial_sealÚ
skill_1005r"   Úhan_bang_liet_phach_thuongiî  Úbang_tien_xuyen_tam)Úfrost_arrowÚ
skill_1006r&   Úhuyen_minh_han_bang_chuongiï  Úliet_hoa_toan_phong_tram)Úfire_whirlwind_slashÚ
skill_1007r*   ið  Úliet_diem_boc_khi_tram)Úmagma_cleaveÚ
skill_1008r-   Úcuu_u_liet_diem_chuongiñ  Úkim_cang_truy_dia_chan)Úground_slam_craterÚ
skill_1009r1   iò  Úkim_cang_bat_hoai_the)Úunyielding_guardÚ
skill_1010r4   ió  Úhuyet_ma_khap_huyet_kinh)Úblood_drain_aoeÚ
skill_1011r7   iô  Úman_cot_trieu_hon_do)Úbone_totem_summonÚ
skill_1012r:   zList[Dict[str, Any]]ÚCANONICAL_ACTIVE_SKILLSiK  Úhuyen_anh_bo)Úghost_trail_evasionÚ
skill_1099r>   Údodge_evasionúDict[str, Any]ÚCANONICAL_MOBILITY_SKILLiÑ  Úphan_quang_da_hoa_an)Úmulti_projectile_splitÚ
sigil_2001rD   iÒ  Úboc_pha_khuech_dai_an)Úaoe_expansionÚ
sigil_2002rG   iÔ  Úhuyet_khi_quy_tong_an)Úblood_magicÚ
sigil_2004rJ   iÕ  Úloi_dinh_xau_chuoi_an)Úchain_lightning_arcÚ
sigil_2005rM   iÖ  Úcuc_lanh_an)Úfreeze_afflictionÚ
sigil_2006rP   Ú
sigil_2003Úcuc_han_boc_kinh_anÚdamage_boostÚCANONICAL_SUPPORT_SIGILS)
Úmob_risen_skeletonÚmob_feral_hellhoundÚmob_blood_crawlerÚmob_bramble_treantÚmob_corrupted_raptorÚmob_flesh_abominationÚmob_ironhide_behemothÚmob_primal_cannibalÚmob_shadow_wraithÚmob_tomb_lord)Úchar_sword_masterÚchar_sword_maidenÚchar_feral_berserkerÚchar_wild_archerÚchar_glacial_lancerÚchar_shadow_assassin)ÚSÚSWÚWÚNWÚNÚNEÚEÚSEÚ	clip_nameÚstrÚ
definitionÚreturnÚboolc                ó   — |                       ¦   «         }t          |d         ¦  «        |v rdS |d                               ¦   «         |v rdS |                     dg ¦  «        D ]}|                      ¦   «         |v r dS ŒdS )z?Matches a manifest clip key against skill/sigil id and aliases.r   Tr   r   F)Úlowerrp   Úget)ro   rq   Úc_lowerÚaliass       ú9C:\Projects\FreeExile\tests\e2e_cocos\vfx_test_helpers.pyÚmatch_clip_identifierrz   G   s�   € à�oŠoÑÔ€GÝ
ˆ:�dÔÑÔ Ð'Ð'ØˆtØ�%Ô×ÒÑ Ô  GÐ+Ð+ØˆtØ—’ 	¨2Ñ.Ô.ð ð ˆØ�;Š;‰=Œ=˜GÐ#Ð#Ø�4�4ð $àˆ5ó    Úmanifest_pathr   ú	List[str]c                ój  — |                       ¦   «         sd| › �gS 	 t          | dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   n # t          $ r}d| › d|› �gcY d}~S d}~ww xY wt          |                     d|                     d	d
¦  «        ¦  «        ¦  «        }t          |                     d|                     dd
¦  «        ¦  «        ¦  «        }t          |                     d|                     dd¦  «        ¦  «        ¦  «        }t          |                     d|                     dd¦  «        ¦  «        ¦  «        }t          |                     dt          dt          ||z  ¦  «        ¦  «        ¦  «        ¦  «        }|                     di ¦  «        }	|	s| j	        › d�gS g }
d}|	 
                    ¦   «         D �]Þ\  }}|                     dg ¦  «        }|s!|
                     | j	        › d|› d�¦  «         Œ?t          |¦  «        D �]|\  }}t          |t          ¦  «        rd|v r|d         \  }}}}n¦t          |t          ¦  «        r[d|v rW|d         |d         }}|                     d|¦  «        |                     d|¦  «        }}||z  ||z  }}||z   |z  ||z   |z  }}n6||z   |z  }||z   |z  }||z  |z  }||z  |z  }|dz   |z  |z  }|dz   |z  |z  }d|cxk    rd k    r2n n/d|cxk    rd k    r"n nd|cxk    rd k    rn nd|cxk    rd k    s=n |
                     | j	        › d|› d!|› d"|d#›d$|d#›d$|d#›d$|d#›d%|d&›d|d&›d'�¦  «         ||k    s||k    r#|
                     | j	        › d|› d!|› d(�¦  «         �Œ~|t          |¦  «        z  }�Œà|
S ))zKValidates UV coordinates and pixel boundaries for all frames in a manifest.zFile missing: Úrúutf-8©ÚencodingNzInvalid JSON in z: ÚtextureWidthÚtexture_widthi   ÚtextureHeightÚtexture_heightÚ
frameWidthÚframe_widthé    ÚframeHeightÚframe_heightÚcolsé   Úclipsz: No clips defined in manifestr   Úframesz -> z: No framesÚuvÚxÚyÚwÚhg        g      ð?ú[z!]: UV out of bounds [0.0, 1.0]: (z.4fz, z
) [atlas: z.0fú]z]: Degenerate UV bounds)ÚexistsÚopenÚjsonÚloadÚ	ExceptionÚfloatrv   ÚintÚmaxÚnameÚitemsÚappendÚ	enumerateÚ
isinstanceÚdictÚlen)r|   ÚfÚdataÚeÚtex_wÚtex_hÚframe_wÚframe_hrŒ   rŽ   ÚerrorsÚ
global_idxro   Ú	clip_datar�   Ú	local_idxÚf_descÚu0Úv0Úu1Úv1r‘   r’   r“   r”   ÚcolÚrows                              ry   Úvalidate_manifest_uv_boundsr¸   T   s  € à×ÒÑ!Ô!ð 2Ø0 Ð0Ð0Ð1Ð1ð9Ý�- ¨wÐ7Ñ7Ô7ð 	 ¸1Ý”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 øøåð 9ð 9ð 9Ø7 =Ð7Ð7°AÐ7Ð7Ð8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð9øøøõ �$—(’(˜>¨4¯8ª8°OÀTÑ+JÔ+JÑKÔKÑLÔL€EÝ�$—(’(˜?¨D¯HªHÐ5EÀtÑ,LÔ,LÑMÔMÑNÔN€EÝ�D—H’H˜\¨4¯8ª8°MÀ3Ñ+GÔ+GÑHÔHÑIÔI€GÝ�D—H’H˜]¨D¯HªH°^ÀSÑ,IÔ,IÑJÔJÑKÔK€GÝˆt�xŠx˜¥ A¥s¨5°GÑ+;Ñ'<Ô'<Ñ =Ô =Ñ>Ô>Ñ?Ô?€Dà�HŠH�W˜bÑ!Ô!€EØð GØ Ô%ÐEÐEÐEÐFÐFà€FØ€Jà %§¢¡¤ð "ñ "Ñˆ	�9Ø—’˜x¨Ñ,Ô,ˆØð 	Ø�MŠM˜]Ô/ÐKÐK°YÐKÐKÐKÑLÔLÐLØå!*¨6Ñ!2Ô!2ð 	iñ 	iÑˆI�vÝ˜&¥$Ñ'Ô'ð 3¨D°F¨N¨NØ!'¨¤‘��B˜˜B˜BÝ˜F¥DÑ)Ô)ð 3¨c°V¨m¨mØ˜c”{ F¨3¤K�1�Ø—z’z # wÑ/Ô/°·²¸CÀÑ1IÔ1I�1�Ø˜U™ A¨¡I�B�Ø˜a™% 5™¨1¨q©5°E©/�B��à! IÑ-°Ñ5�Ø! IÑ-°$Ñ6�Ø˜G‘m uÑ,�Ø˜G‘m uÑ,�Ø˜Q‘w 'Ñ)¨UÑ2�Ø˜Q‘w 'Ñ)¨UÑ2�à˜2Ð$Ð$Ò$Ð$ Ò$Ð$Ð$Ð$Ð$¨°Ð)9Ð)9Ò)9Ð)9°cÒ)9Ð)9Ð)9Ð)9Ð)9¸cÀRÐ>NÐ>NÒ>NÐ>NÈ3Ò>NÐ>NÐ>NÐ>NÐ>NÐSVÐZ\ÐScÐScÒScÐScÐ`cÒScÐScÐScÐScØ—’Ø$Ô)ð að a¨yð að a¸9ð að aØÐ`ðað aØ"$Ð`ðað aØ,.Ð`ðað aØ68Ð`ðað aØHMÐ`ðað aØTYÐ`ðað að añô ð ð �RŠxˆx˜2 š8˜8Ø—’ Ô!3ÐgÐg¸ÐgÐgÀYÐgÐgÐgÑhÔhÐhùà•c˜&‘k”kÑ!ˆ
‰
Ø€Ms@   œA ®AÁA ÁAÁA ÁAÁA Á
A8Á%A3Á-A8Á3A8Úmodule)Úscopec                 ó   — t                                ¦   «         sJ dt           › �¦   «         ‚t          t           dd¬¦  «        5 } t          j        | ¦  «        }ddd¦  «         n# 1 swxY w Y   t          |t          ¦  «        s
J d¦   «         ‚|S )zLoads Cocos VFX manifest JSON.z Cocos VFX manifest not found at r   r€   r�   Nz"Manifest JSON must be a dictionary)ÚCOCOS_MANIFEST_PATHr—   r˜   r™   rš   r£   r¤   )r¦   r§   s     ry   Úloaded_manifestr½   �   sÇ   € õ ×%Ò%Ñ'Ô'ÐaÐaÐ)aÕL_Ð)aÐ)aÑaÔaÐ'Ý	Õ! 3°Ð	9Ñ	9Ô	9ð ¸QÝŒy˜‰|Œ|ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å�d�DÑ!Ô!ÐGÐGÐ#GÑGÔGÐ!Ø€Ks   ÁA$Á$A(Á+A(úImage.Imagec                 óÄ   — t                                ¦   «         sJ dt           › �¦   «         ‚t          j        t           ¦  «        } | j        dv sJ d| j        › �¦   «         ‚| S )z%Loads Cocos Albedo Diffuse Atlas PNG.z"Albedo atlas texture not found at ©ÚRGBAÚRGBz(Albedo texture must be RGBA or RGB, got )ÚCOCOS_ALBEDO_PATHr—   r   r˜   Úmode©Úimgs    ry   Úloaded_albedo_imagerÇ   —   sk   € õ ×#Ò#Ñ%Ô%Ð_Ð_Ð'_ÕL]Ð'_Ð'_Ñ_Ô_Ð%Ý
Œ*Õ&Ñ
'Ô
'€CØŒ8�Ð&Ð&Ð&Ð(]ÐSVÔS[Ð(]Ð(]Ñ&Ô&Ð&Ø€Jr{   c                 óÄ   — t                                ¦   «         sJ dt           › �¦   «         ‚t          j        t           ¦  «        } | j        dv sJ d| j        › �¦   «         ‚| S )z%Loads Cocos Tangent Normal Atlas PNG.z"Normal atlas texture not found at rÀ   z,Normal map texture must be RGBA or RGB, got )ÚCOCOS_NORMAL_PATHr—   r   r˜   rÄ   rÅ   s    ry   Úloaded_normal_imagerÊ       sk   € õ ×#Ò#Ñ%Ô%Ð_Ð_Ð'_ÕL]Ð'_Ð'_Ñ_Ô_Ð%Ý
Œ*Õ&Ñ
'Ô
'€CØŒ8�Ð&Ð&Ð&Ð(aÐWZÔW_Ð(aÐ(aÑ&Ô&Ð&Ø€Jr{   )ro   rp   rq   rB   rr   rs   )r|   r   rr   r}   )rr   rB   )rr   r¾   )'Ú__doc__Ú
__future__r   r™   Úpathlibr   Útypingr   r   r   ÚPILr   ÚpytestÚ__file__ÚresolveÚparentÚ	REPO_ROOTÚCOCOS_VFX_DIRÚWEBAPP_VFX_DIRÚAPPROVED_VFX_DIRr¼   rÃ   rÉ   ÚCOCOS_ASTC_PATHÚCOCOS_MONSTERS_DIRÚCOCOS_CHARACTERS_DIRr=   Ú__annotations__rC   rV   ÚCANONICAL_MONSTER_GENERAÚCANONICAL_EXILE_CLASSESÚCANONICAL_DIRECTIONSrz   r¸   Úfixturer½   rÇ   rÊ   © r{   ry   ú<module>rá      sw  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø €€€àˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2Ô9€	à˜HÑ$ wÑ.°Ñ9¸KÑGÈ%ÑO€Ø˜XÑ%¨Ñ0°8Ñ;¸eÑC€Ø˜xÑ'¨*Ñ4°uÑ<Ð à#Ð&KÑKÐ Ø!Ð$HÑHÐ Ø!Ð$OÑOÐ ØÐ"GÑG€à Ñ)¨GÑ3°hÑ>ÀÑLÈzÑYÐ\hÑhÐ Ø  8Ñ+¨gÑ5¸Ñ@À;ÑNÐQ]Ñ]Ð ð Ð+Ð8nÐ8nÐ8nÐoÐoØÐ1Ð>uÐ>uÐ>uÐvÐvØÐ/Ð<sÐ<sÐ<sÐtÐtØÐ/Ð<rÐ<rÐ<rÐsÐsØÐ3ð  AZð  AZð  AZð  [ð  [ØÐ-ð  ;Mð  ;Mð  ;Mð  Nð  NØÐ2ð  @Bð  @Bð  @Bð  Cð  CØÐ0ð  >Pð  >Pð  >Pð  Qð  QØÐ0Ð={Ð={Ð={Ð|Ð|ØÐ/Ð<wÐ<wÐ<wÐxÐxØÐ2Ð?|Ð?|Ð?|Ð}Ð}ØÐ.Ð;vÐ;vÐ;vÐwÐwð1Ð ð ð ð ñ ð  ØØUÐUÐUð,ð ,Ð ð ð ð ñ ð Ð.Ð;{Ð;{Ð;{Ð|Ð|ØÐ/Ð<tÐ<tÐ<tÐuÐuØÐ/Ð<rÐ<rÐ<rÐsÐsØÐ/Ð<zÐ<zÐ<zÐ{Ð{Ø˜ð  3Zð  3Zð  3Zð  [ð  [ð2Ð ð ð ð ñ ðð ð Ð ðð ð Ð ð
 DÐCÐCÐ ð
ð 
ð 
ð 
ð6ð 6ð 6ð 6ðr €„�hÐÑÔðð ð ñ  Ôðð €„�hÐÑÔðð ð ñ  Ôðð €„�hÐÑÔðð ð ñ  Ôðð ð r{   