§
    ÿR»jÊ  ã            
       ób  — d Z ddlZddlZddlZddlZej                             dej                             ej                             ej         	                    e
¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZ ddlmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )	uã   
Unit tests for Server-Authoritative Combat Engine & Five Elements System in FreeExile.
Verifies Five Elements mitigation formulas, critical strike calculation, and Huyá»…n áº¢nh Bá»™ (Phantom Evasion) i-frame invulnerability.
é    Nz../../server)ÚCombatEngineÚCombatActor)ÚFiveElementsc                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestCombatEnginec                 ó°  — t          ¦   «         | _        t          ddt          j        ddd¬¦  «        | _        t          ddt          j        d	d	t          j        d
t          j        d
t          j        dt          j        dt          j	        di¬¦  «        | _
        | j                             | j        ¦  «         | j                             | j
        ¦  «         d S )Né   u   Kiáº¿m KhÃ¡ch Há»�a Longç      Y@gš™™™™™É?g      ø?)Úactor_idÚnameÚelementÚbase_attackÚcrit_chanceÚcrit_multiplieré   u   Kim Cang Ä�ao KhÃ¡chç     @@gš™™™™™¹?gš™™™™™Ù?ç        )r   r   r   Ú
current_hpÚmax_hpÚresistances)r   Úenginer   r   ÚHOAÚattackerÚKIMÚMOCÚTHUYÚTHOÚdefenderÚregister_actor)Úselfs    ú6C:\Projects\FreeExile\tests\unit\test_combat_engine.pyÚsetUpzTestCombatEngine.setUp   sÇ   € Ý"‘n”nˆŒÝ#ØØ+Ý Ô$ØØØð
ñ 
ô 
ˆŒõ $ØØ'Ý Ô$ØØåÔ  $ÝÔ  $ÝÔ! 4ÝÔ  #ÝÔ  $ðð
ñ 
ô 
ˆŒð 	Œ×"Ò" 4¤=Ñ1Ô1Ð1ØŒ×"Ò" 4¤=Ñ1Ô1Ð1Ð1Ð1ó    c           
      óN  — | j                              dddt          j        t	          t          j        ¦   «         dz  ¦  «        ¬¦  «        }|                      |j        ¦  «         |                      |j	        d¦  «         |  
                    |j        t          j        ¦  «         dS )u]   Attacker (Há»�a) attacks Defender (Kim) -> Há»�a kháº¯c Kim deals amplified elemental damage.r	   r   r
   éè  ©Úattacker_idÚdefender_idÚ
raw_damageÚdamage_elementÚcurrent_timestamp_msg      ^@N)r   Úcalculate_damager   r   ÚintÚtimeÚassertFalseÚ	is_evadedÚassertGreaterEqualÚfinal_damageÚassertEqualr   )r    Ú	dmg_events     r!   Ú$test_five_elements_damage_mitigationz5TestCombatEngine.test_five_elements_damage_mitigation-   s—   € à”K×0Ò0ØØØÝ'Ô+Ý!$¥T¤Y¡[¤[°4Ñ%7Ñ!8Ô!8ð 1ñ 
ô 
ˆ	ð 	×Ò˜Ô,Ñ-Ô-Ð-à×Ò 	Ô 6¸Ñ>Ô>Ð>Ø×Ò˜Ô*­LÔ,<Ñ=Ô=Ð=Ð=Ð=r#   c                 óŠ  — t          t          j        ¦   «         dz  ¦  «        }| j                             d|¬¦  «         |dz   }| j                             dddt
          j        |¬¦  «        }|                      |j        ¦  «         |  	                    |j
        d¦  «         |  	                    | j        j        d	¦  «         d
S )u\   Defender activates Huyá»…n áº¢nh Bá»™ -> during 0.25s i-frame window, damage is 100% evaded.r%   r   ©r   Útimestamp_mséd   r	   r
   r&   r   r   N)r-   r.   r   Útrigger_phantom_evasionr,   r   r   Ú
assertTruer0   r3   r2   r   r   ©r    Únow_msÚattack_time_msr4   s       r!   Ú(test_huyen_anh_bo_iframe_invulnerabilityz9TestCombatEngine.test_huyen_anh_bo_iframe_invulnerability;   sÁ   € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆð 	Œ×+Ò+°QÀVÐ+ÑLÔLÐLð   #™ˆØ”K×0Ò0ØØØÝ'Ô+Ø!/ð 1ñ 
ô 
ˆ	ð 	�Š˜	Ô+Ñ,Ô,Ð,Ø×Ò˜Ô/°Ñ5Ô5Ð5à×Ò˜œÔ1°5Ñ9Ô9Ð9Ð9Ð9r#   c                 óJ  — t          t          j        ¦   «         dz  ¦  «        }| j                             d|¬¦  «         |dz   }| j                             dddt
          j        |¬¦  «        }|                      |j        ¦  «         |  	                    |j
        d¦  «         d	S )
z[After 0.25s i-frame window expires (e.g. 300ms later), incoming attack deals normal damage.r%   r   r7   i,  r	   r
   r&   r   N)r-   r.   r   r:   r,   r   r   r/   r0   ÚassertGreaterr2   r<   s       r!   Ú(test_damage_applied_after_iframe_expiresz9TestCombatEngine.test_damage_applied_after_iframe_expiresP   s¦   € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØŒ×+Ò+°QÀVÐ+ÑLÔLÐLð   #™ˆØ”K×0Ò0ØØØÝ'Ô+Ø!/ð 1ñ 
ô 
ˆ	ð 	×Ò˜Ô,Ñ-Ô-Ð-Ø×Ò˜9Ô1°3Ñ7Ô7Ð7Ð7Ð7r#   N)Ú__name__Ú
__module__Ú__qualname__r"   r5   r?   rB   © r#   r!   r   r      sP   € € € € € ð2ð 2ð 2ð6>ð >ð >ð:ð :ð :ð*8ð 8ð 8ð 8ð 8r#   r   Ú__main__)Ú__doc__Úunittestr.   ÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.combat_enginer   r   Úworld.martial_matrixr   ÚTestCaser   rC   ÚmainrF   r#   r!   ú<module>rV      sý   ððð ð
 €€€Ø €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø -Ð -Ð -Ð -Ð -Ð -ðN8ð N8ð N8ð N8ð N8�xÔ(ñ N8ô N8ð N8ðb ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr#   