§
    ^ð»jà  ã                  ó0  — 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mZ ddlZddlmZmZmZ  ee¦  «                             ¦   «         j        j        j        Zedz  dz  dz  d	z  Z G d
„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )zÀ
Unit Tests for FreeExile 2.5D Isometric Animation Pipeline and Motion-Matching Kinematics.
Tests stride-length foot-speed synchronization, 8-directional heading math, and manifest integrity.
é    )ÚannotationsN)ÚPath)Úcalculate_action_durationÚcalculate_stride_fpsÚresolve_heading_8dirÚclientÚwebappÚassetsÚ
animationsc                  ó:   — e Zd ZdZd
d„Zd
d„Zd
d„Zd
d„Zd
d„Zd	S )Ú&TestAnimationPipelineAndMotionMatchingzPTest suite for kinematic motion-matching formulas and baked animation manifests.ÚreturnÚNonec                óN  — d}d}|                       t          d||¦  «        d¦  «         t          d||¦  «        }|                      |dd¬¦  «         t          d||¦  «        }|                      |dd¬¦  «         t          d||¦  «        }|                      |d	d¬¦  «         d
S )zRVerifies that frame rate scales precisely with velocity to eliminate foot sliding.gÍÌÌÌÌÌ@g      (@ç        gÍÌÌÌÌÌ @g      @é   ©Úplacesgffffff@g      5@N)ÚassertEqualr   ÚassertAlmostEqual)ÚselfÚ
base_speedÚbase_fpsÚwalk_fpsÚrun_fpsÚ
sprint_fpss         úOC:\Projects\FreeExile\tests\unit\test_animation_pipeline_and_motion_matching.pyÚ#test_foot_speed_synchronization_fpszJTestAnimationPipelineAndMotionMatching.test_foot_speed_synchronization_fps   sÁ   € àˆ
Øˆð 	×ÒÕ-¨c°:¸xÑHÔHÈ#ÑNÔNÐNõ (¨¨Z¸ÑBÔBˆØ×Ò˜x¨°QÐÑ7Ô7Ð7õ ' s¨J¸ÑAÔAˆØ×Ò˜w¨°QÐÑ7Ô7Ð7õ *¨$°
¸HÑEÔEˆ
Ø×Ò˜z¨4¸ÐÑ:Ô:Ð:Ð:Ð:ó    c                ó6  — d}|                       t          |d¦  «        dd¬¦  «         |                       t          |d¦  «        dd¬¦  «         |                       t          |d¦  «        dd¬¦  «         |                      t          |d	¦  «        d
¦  «         dS )zEVerifies skill cast duration scales inversely with action speed stat.g333333ã?g      ð?é   r   g      ø?gš™™™™™Ù?g       @g333333Ó?gš™™™™™©?g      @N)r   r   Ú
assertLess)r   Úbase_durations     r   Útest_action_speed_scalingz@TestAnimationPipelineAndMotionMatching.test_action_speed_scaling.   s©   € àˆð 	×ÒÕ8¸ÈÑLÔLÈdÐ[\ÐÑ]Ô]Ð]ð 	×ÒÕ8¸ÈÑLÔLÈdÐ[\ÐÑ]Ô]Ð]ð 	×ÒÕ8¸ÈÑLÔLÈdÐ[\ÐÑ]Ô]Ð]ð 	�ŠÕ1°-ÀÑFÔFÈÑLÔLÐLÐLÐLr   c                ó  — |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d	¦  «        d
¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         |                       t          d¦  «        d¦  «         dS )zAVerifies 360-degree angle mapping to 8 isometric compass facings.r   ÚEg     €F@ÚSEg     €V@ÚSg     à`@ÚSWg     €f@ÚWg      l@ÚNWg     àp@ÚNg     °s@ÚNEg     €v@g     €VÀg     €†@N)r   r   )r   s    r   Ú-test_8_directional_isometric_heading_resolverzTTestAnimationPipelineAndMotionMatching.test_8_directional_isometric_heading_resolver>   s]  € à×ÒÕ-¨cÑ2Ô2°CÑ8Ô8Ð8Ø×ÒÕ-¨dÑ3Ô3°TÑ:Ô:Ð:Ø×ÒÕ-¨dÑ3Ô3°SÑ9Ô9Ð9Ø×ÒÕ-¨eÑ4Ô4°dÑ;Ô;Ð;Ø×ÒÕ-¨eÑ4Ô4°cÑ:Ô:Ð:Ø×ÒÕ-¨eÑ4Ô4°dÑ;Ô;Ð;Ø×ÒÕ-¨eÑ4Ô4°cÑ:Ô:Ð:Ø×ÒÕ-¨eÑ4Ô4°dÑ;Ô;Ð;à×ÒÕ-¨eÑ4Ô4°cÑ:Ô:Ð:Ø×ÒÕ-¨eÑ4Ô4°cÑ:Ô:Ð:Ø×ÒÕ-¨eÑ4Ô4°cÑ:Ô:Ð:Ð:Ð:r   c                óV  — t           dz  }|                      |                     ¦   «         d¦  «         t          |dd¬¦  «        5 }t	          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                      |d         d¦  «         |                      |d	         d
¦  «         |                      |d         d
¦  «         g d¢}|D ]q}|                      ||d         ¦  «         |d         |         }|                      t          |d         ¦  «        d
¦  «         |                      |d         d
¦  «         Œr|d         d         }|                      d|¦  «         |                      |d         d
dg¦  «         |d         d         }|                      |d         d¦  «         dS )zWVerifies baked hero animation manifest structure, required clips, and frame dimensions.zhero_anim_manifest.jsonz%Hero manifest file must exist on diskÚrúutf-8©ÚencodingNÚ	entity_idÚheroÚtexture_widthr   Útexture_height)ÚidleÚrunÚattack_slashÚskill_whirlwindÚdodgeÚhurtr   ÚframesÚfpsr9   Ú	footstepsé   r:   Ú	hit_framer   )
ÚANIMATIONS_DIRÚ
assertTrueÚexistsÚopenÚjsonÚloadr   ÚassertGreaterÚassertInÚlen)	r   Úhero_manifest_pathÚfÚdataÚrequired_clipsÚ	clip_nameÚclipÚrun_clipÚattack_clips	            r   Ú&test_hero_animation_manifest_integrityzMTestAnimationPipelineAndMotionMatching.test_hero_animation_manifest_integrityM   só  € å+Ð.GÑGÐØ�ŠÐ*×1Ò1Ñ3Ô3Ð5\Ñ]Ô]Ð]åÐ$ c°GÐ<Ñ<Ô<ð 	 ÀÝ”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 	×Ò˜˜kÔ*¨FÑ3Ô3Ð3Ø×Ò˜4 Ô0°!Ñ4Ô4Ð4Ø×Ò˜4Ð 0Ô1°1Ñ5Ô5Ð5ð ]Ð\Ð\ˆØ'ð 	/ð 	/ˆIØ�MŠM˜) T¨,Ô%7Ñ8Ô8Ð8Ø˜Ô% iÔ0ˆDØ×Ò�s 4¨¤>Ñ2Ô2°AÑ6Ô6Ð6Ø×Ò˜t Eœ{¨AÑ.Ô.Ð.Ð.ð ˜Ô% eÔ,ˆØ�Š�k 8Ñ,Ô,Ð,Ø×Ò˜ +Ô.°°A°Ñ7Ô7Ð7ð ˜<Ô(¨Ô8ˆØ×Ò˜ [Ô1°1Ñ5Ô5Ð5Ð5Ð5s   ÁA&Á&A*Á-A*c                óT  — dD �]#}t           |› d�z  }|                      |                     ¦   «         d|› d�¦  «         t          |dd¬¦  «        5 }t	          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                      |d	         |¦  «         g d
¢}|D ]}|                      ||d         ¦  «         Œt           |› d�z  }t           |› d�z  }|                      |                     ¦   «         ¦  «         |                      |                     ¦   «         ¦  «         �Œ%dS )zHVerifies monster animation manifests for hellhound and skeleton warrior.)Úmob_feral_hellhoundÚmob_skeleton_warriorz_anim_manifest.jsonzMonster manifest for z must existr0   r1   r2   Nr4   )r8   r9   Úattackr=   Údeathr   z_anim_atlas.pngz_anim_atlas_normal.png)rC   rD   rE   rF   rG   rH   r   rJ   )	r   Úmob_idÚm_pathrM   Úm_dataÚrequired_mob_clipsrP   Ú	atlas_pngÚ
normal_pngs	            r   Ú test_monster_animation_manifestszGTestAnimationPipelineAndMotionMatching.test_monster_animation_manifestsj   s…  € àEð 	1ñ 	1ˆFÝ#¨Ð&DÐ&DÐ&DÑDˆFØ�OŠO˜FŸMšM™OœOÐ-XÀVÐ-XÐ-XÐ-XÑYÔYÐYå�f˜c¨GÐ4Ñ4Ô4ð &¸Ýœ 1™œ�ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð ×Ò˜V KÔ0°&Ñ9Ô9Ð9Ø!KÐ!KÐ!KÐØ/ð ?ð ?�	Ø—’˜i¨°Ô)=Ñ>Ô>Ð>Ð>õ '¨FÐ)CÐ)CÐ)CÑCˆIÝ'¨VÐ*KÐ*KÐ*KÑKˆJØ�OŠO˜I×,Ò,Ñ.Ô.Ñ/Ô/Ð/Ø�OŠO˜J×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ñ0ð!	1ð 	1s   ÁA2Á2A6	Á9A6	N)r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r.   rT   r`   © r   r   r   r      s‚   € € € € € ØZÐZð;ð ;ð ;ð ;ð(Mð Mð Mð Mð ;ð ;ð ;ð ;ð6ð 6ð 6ð 6ð:1ð 1ð 1ð 1ð 1ð 1r   r   Ú__main__)rd   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrG   ÚmathÚpathlibr   ÚunittestÚ'tools.asset_pipeline.animation_pipeliner   r   r   Ú__file__ÚresolveÚparentÚWORKSPACE_ROOTrC   ÚTestCaser   ra   Úmainre   r   r   ú<module>rx      s5  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€ðð ð ð ð ð ð ð ð ð ð ��h‘”×'Ò'Ñ)Ô)Ô0Ô7Ô>€Ø (Ñ*¨XÑ5¸Ñ@À<ÑO€ðe1ð e1ð e1ð e1ð e1¨XÔ->ñ e1ô e1ð e1ðP ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   