§
    pb»j‹  ã            
       ó€  — d Z ddlZddlmc m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mZmZmZ  G d„ de	j        ¦  «        Zedk    r e	j        ¦   «          dS dS )	z§
Unit tests for 2.5D Isometric Math and Server Engine Loop in FreeExile.
Verifies projection consistency, tick execution, spatial AOI culling, and combat integration.
é    Nz../../server)ÚIsometricMathÚVector2D)ÚServerEngineLoopÚClientMoveCommandÚClientSkillCommandÚFiveElementsc                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestIsometricMathAndEngineLoopc                 óò   — d\  }}}t          j        |||¦  «        }t          j        |j        |j        |¦  «        }|                      |j        |d¬¦  «         |                      |j        |d¬¦  «         dS )zHTest world to screen and screen to world reverse projection consistency.)ç      $@g      @g      ø?é   )ÚplacesN)r   Úworld_to_screenÚscreen_to_worldÚxÚyÚassertAlmostEqual)ÚselfÚworld_xÚworld_yÚworld_zÚ	screen_ptÚrecovered_worlds         ú>C:\Projects\FreeExile\tests\unit\test_isometric_engine_loop.pyÚ*test_isometric_projection_and_unprojectionzITestIsometricMathAndEngineLoop.test_isometric_projection_and_unprojection   s   € à$2Ñ!ˆ�˜'Ý!Ô1°'¸7ÀGÑLÔLˆ	õ (Ô7¸	¼ÀYÄ[ÐRYÑZÔZˆà×Ò˜Ô0°'À!ÐÑDÔDÐDØ×Ò˜Ô0°'À!ÐÑDÔDÐDÐDÐDó    c                 óŠ   — t          j        dd¬¦  «        }t          j        dd¬¦  «        }|                      ||¦  «         dS )zJObjects further down on the screen (larger Y) must have higher depth keys.r   ç        )r   r   ç       @N)r   Úcalculate_depth_keyÚassertGreater)r   Ú
depth_nearÚ	depth_fars      r   Útest_depth_sorting_keyz5TestIsometricMathAndEngineLoop.test_depth_sorting_key"   sH   € å"Ô6¸tÈSÐQÑQÔQˆ
Ý!Ô5¸cÈ3ÐOÑOÔOˆ	Ø×Ò˜: yÑ1Ô1Ð1Ð1Ð1r   c                 ó¦   — |                       t          j        dd¦  «        ¦  «         |                      t          j        dd¦  «        ¦  «         dS )zSEntities on different elevation tiers outside capsule threshold should not collide.r   g333333ó?g      @N)Ú
assertTruer   Úcheck_height_overlapÚassertFalse)r   s    r   Útest_height_overlapz2TestIsometricMathAndEngineLoop.test_height_overlap(   sH   € à�Š�Ô:¸3ÀÑDÔDÑEÔEÐEØ×Ò�Ô;¸CÀÑEÔEÑFÔFÐFÐFÐFr   c           	      óú  — t          d¬¦  «        }|                     dddt          j        ¬¦  «         |                     dddt          j        ¬¦  «         |                     t          ddd	d|j        ¬
¦  «        ¦  «         |                     d¬¦  «        }|  	                    |j
        d¦  «         |  	                    |j        d¦  «         |  	                    |j        d¦  «         |                      |j        d¦  «         |j        d         }|                      |j        d¦  «         |                     d¬¦  «        }d„ |D ¦   «         }|                      d|¦  «         |                      d|¦  «         dS )zETest server tick execution with movement and AOI snapshot generation.ç      P@©Ú	cell_sizeé   r   ©Ú	entity_idÚ	initial_xÚ	initial_yÚelementé   g      4@g      ð?r   )r0   Údir_xÚdir_yÚsequenceÚtimestamp_msçTŒó7¡¡?©Údtr   gÍÌÌÌÌL$@©Úobserver_idc                 ó   — g | ]	}|j         ‘Œ
S © ©r0   ©Ú.0Úss     r   ú
<listcomp>zTTestIsometricMathAndEngineLoop.test_server_engine_tick_lifecycle.<locals>.<listcomp>L   s   € Ð6Ð6Ð6 q�q”{Ð6Ð6Ð6r   N)r   Úregister_playerr   ÚKIMÚHOAÚqueue_move_commandr   Úcurrent_time_msÚ	step_tickÚassertEqualÚtick_numberÚprocessed_movesÚentities_countr!   Úsnapshots_generatedÚactive_entitiesr   Úget_aoi_snapshots_for_entityÚassertIn)r   ÚengineÚtick_resÚp1Ú	snapshotsÚvisible_idss         r   Ú!test_server_engine_tick_lifecyclez@TestIsometricMathAndEngineLoop.test_server_engine_tick_lifecycle-   s�  € å!¨DÐ1Ñ1Ô1ˆð 	×Ò¨°dÀdÕT`ÔTdÐÑeÔeÐeØ×Ò¨°dÀdÕT`ÔTdÐÑeÔeÐeð 	×!Ò!Õ"3ØØØØØÔ/ð#
ñ #
ô #
ñ 	ô 	ð 	ð ×#Ò# wÐ#Ñ/Ô/ˆà×Ò˜Ô-¨qÑ1Ô1Ð1Ø×Ò˜Ô1°1Ñ5Ô5Ð5Ø×Ò˜Ô0°!Ñ4Ô4Ð4Ø×Ò˜8Ô7¸Ñ;Ô;Ð;ð Ô# AÔ&ˆØ×Ò˜2œ4 Ñ'Ô'Ð'ð ×7Ò7ÀAÐ7ÑFÔFˆ	Ø6Ð6¨IÐ6Ñ6Ô6ˆØ�Š�a˜Ñ%Ô%Ð%Ø�Š�a˜Ñ%Ô%Ð%Ð%Ð%r   c                 óÈ  — t          d¬¦  «        }|                     dddt          j        ¬¦  «         |                     dddt          j        ¬¦  «         |                     t          dddd	t          j        d|j        ¬
¦  «        ¦  «         |                     d¬¦  «        }|  	                    |j
        d¦  «         |j        j        d         }|                      |¦  «         |                     d|j        ¬¦  «         |                     d¬¦  «         |                     d¬¦  «        }t!          d„ |D ¦   «         ¦  «        }|                      |j        ¦  «         dS )zJTest skill execution and 250ms phantom evasion i-frame during engine tick.r+   r,   ée   r   r/   éf   r   r.   g      Y@)Úattacker_idÚ	target_idÚskill_idÚ
raw_damager3   r7   r8   r9   r:   )r0   r8   g{®Gáz„?r<   c              3   ó0   K  — | ]}|j         d k    ¯|V — ŒdS )r[   Nr@   rA   s     r   ú	<genexpr>zVTestIsometricMathAndEngineLoop.test_combat_and_evasion_in_tick_loop.<locals>.<genexpr>q   s.   è è € ÐIÐI 1°a´kÀSÒ6HÐ6H˜QÐ6HÐ6HÐ6HÐ6HÐIÐIr   N)r   rE   r   rG   rF   Úqueue_skill_commandr   rI   rJ   rK   Úprocessed_skillsÚcombat_engineÚactorsÚassertIsNotNoneÚqueue_evasionrQ   Únextr&   Ú
is_evading)r   rS   rT   Ú
p102_actorÚ
p101_viewsÚp102_snapshots         r   Ú$test_combat_and_evasion_in_tick_loopzCTestIsometricMathAndEngineLoop.test_combat_and_evasion_in_tick_loopP   sv  € å!¨DÐ1Ñ1Ô1ˆà×Ò¨¸ÀsÕT`ÔTdÐÑeÔeÐeØ×Ò¨¸ÀsÕT`ÔTdÐÑeÔeÐeð 	×"Ò"Õ#5ØØØØÝ Ô$ØØÔ/ð$
ñ $
ô $
ñ 	ô 	ð 	ð ×#Ò# wÐ#Ñ/Ô/ˆØ×Ò˜Ô2°AÑ6Ô6Ð6ð Ô)Ô0°Ô5ˆ
Ø×Ò˜ZÑ(Ô(Ð(ð 	×Ò s¸Ô9OÐÑPÔPÐPØ×Ò˜DÐÑ!Ô!Ð!ð ×8Ò8ÀSÐ8ÑIÔIˆ
ÝÐIÐI¨
ÐIÑIÔIÑIÔIˆØ�Š˜Ô0Ñ1Ô1Ð1Ð1Ð1r   N)Ú__name__Ú
__module__Ú__qualname__r   r$   r)   rX   rm   r?   r   r   r
   r
      sf   € € € € € ð	Eð 	Eð 	Eð2ð 2ð 2ðGð Gð Gð
!&ð !&ð !&ðF"2ð "2ð "2ð "2ð "2r   r
   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚsysÚosÚunittestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.isometric_mathr   r   Úworld.server_engine_loopr   r   r   r   ÚTestCaser
   rn   Úmainr?   r   r   ú<module>r†      s:  ððð ð
 € € € € € € € € € € € € €
€
€
€
Ø 	€	€	€	Ø €€€ð „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð ð ð ð ð\2ð \2ð \2ð \2ð \2 XÔ%6ñ \2ô \2ð \2ð~ ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   