§
    {ª½j  ã            
       ó\  — 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mZmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZ  G d„ d	¦  «        ZdS )
zÑ
Unit tests for Monster Pack Spawning, 15-Tier Affixes, Leader Auras, and Coordinated AI.
Verifies PoE2 encounter standards, procedural affix distribution,
proximity aura propagation/decay, and pack alerting.
é    Nz../../server)ÚMonsterGenusÚMonsterRankÚMonsterAIStateÚPackAuraTypeÚMonsterAffixCategoryÚMonsterRuntimeState)ÚMonsterProceduralEngine)Úget_tier_for_levelÚroll_monster_affixesÚapply_affixes_to_statsÚMONSTER_AFFIX_CATALOG)ÚMonsterAIEnginec                   ó.   — e Zd Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestMonsterPackAndAffixesÚreturnNc           	      ó<  — t          ¦   «         }|                     ddddddd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        j        d	u sJ ‚|j        j        t          j        k    sJ ‚|j        j	        t          t          ¦  «        v sJ ‚t          |j        j        ¦  «        d
k    sJ ‚t          |j        ¦  «        dk    sJ ‚|j        D ]H}|j        du sJ ‚|j        |j        j        k    sJ ‚|j        dk    sJ ‚|j        t          j        k    sJ ‚ŒIdS )z@Verifies MonsterPack creates a Rare leader and tethered minions.Úpack_test_alphaÚzone_tang_kiem_nhaié#   ç      Y@g      ^@é*   é   ©Úpack_idÚzone_idÚlevelÚcenter_xÚcenter_yÚseedÚminion_countTé   FN)r	   Úgenerate_packr   r   ÚleaderÚis_pack_leaderÚrankr   ÚRAREÚleader_auraÚlistr   ÚlenÚaffixesÚminionsÚpack_leader_idÚ
monster_idÚCOMMON)ÚselfÚengineÚpackÚminions       úAC:\Projects\FreeExile\tests\unit\test_monster_pack_and_affixes.pyÚ,test_pack_composition_and_leader_designationzFTestMonsterPackAndAffixes.test_pack_composition_and_leader_designation!   sa  € å(Ñ*Ô*ˆØ×#Ò#Ø%Ø)ØØØØØð $ñ 
ô 
ˆð Œ|Ð0Ò0Ð0Ð0Ð0ØŒ|Ð4Ò4Ð4Ð4Ð4ØŒ{Ô)¨TÐ1Ð1Ð1Ð1ØŒ{Ô¥;Ô#3Ò3Ð3Ð3Ð3ØŒ{Ô&­$­|Ñ*<Ô*<Ð<Ð<Ð<Ð<Ý�4”;Ô&Ñ'Ô'¨1Ò,Ð,Ð,Ð,Ý�4”<Ñ Ô  AÒ%Ð%Ð%Ð%à”lð 	5ð 	5ˆFØÔ(¨EÐ1Ð1Ð1Ð1ØÔ(¨D¬KÔ,BÒBÐBÐBÐBØ”>Ð%6Ò6Ð6Ð6Ð6Ø”;¥+Ô"4Ò4Ð4Ð4Ð4Ð4ð		5ð 	5ó    c                 óÀ  — t          t          ¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d	¦  «        d
k    sJ ‚t          d¦  «        dk    sJ ‚t          dt          j        d¬¦  «        }t          |¦  «        dk    sJ ‚|D ]}|j        dk    sJ d|j        › �¦   «         ‚Œ t          dt          j        d¬¦  «        }|D ]}|j        dk    sJ d|j        › �¦   «         ‚Œ d\  }}}t          ||||¦  «        \  }}}	||k    sJ ‚||k    sJ ‚|	|k    sJ ‚dS )z:Verifies the 15-tier affix hierarchy and stat multipliers.é   é_   é   éU   éP   é   é2   é   é
   é   éX   é{   )r   r%   r   r!   zExpected Apex tier 1-3, got é   é   z Expected Novice tier 13-15, got )g     @�@r   ç      I@N)r)   r   r
   r   r   r&   Útierr   )
r/   Úapex_affixesÚaffÚlow_affixesÚbase_hpÚbase_dmgÚbase_armÚmod_hpÚmod_dmgÚmod_arms
             r3   Ú$test_fifteen_tier_affix_distributionz>TestMonsterPackAndAffixes.test_fifteen_tier_affix_distribution<   sÉ  € åÕ(Ñ)Ô)¨RÒ/Ð/Ð/Ð/õ " "Ñ%Ô%¨Ò*Ð*Ð*Ð*Ý! "Ñ%Ô%¨Ò*Ð*Ð*Ð*Ý! "Ñ%Ô%¨Ò*Ð*Ð*Ð*Ý! "Ñ%Ô%¨Ò*Ð*Ð*Ð*Ý! "Ñ%Ô%¨Ò+Ð+Ð+Ð+Ý! !Ñ$Ô$¨Ò*Ð*Ð*Ð*õ ,°"½;Ô;KÐRUÐVÑVÔVˆÝ�<Ñ Ô  AÒ%Ð%Ð%Ð%Øð 	Lð 	LˆCØ”8˜q’=�=�=Ð"KÀÄÐ"KÐ"K‘=”=�=�=õ +°½Ô9IÐPSÐTÑTÔTˆØð 	Qð 	QˆCØ”8˜r’>�>�>Ð#PÀcÄhÐ#PÐ#P‘>”>�>�>ð ':Ñ#ˆ�˜8Ý#9¸'À8ÈXÐWcÑ#dÔ#dÑ ˆ�˜Ø˜Ò Ð Ð Ð Ø˜(Ò"Ð"Ð"Ð"Ø˜(Ò"Ð"Ð"Ð"Ð"Ð"r5   c           	      ó|  — t          ¦   «         }t          ¦   «         }|                     ddddddd¬¦  «        }|                     |¦  «        }|d         }|d	         }|                     |d
d¬¦  «         t          |j        ¦  «        dk    sJ ‚d|_        t          j	        |_
        |                     |d
d¬¦  «         t          |j        ¦  «        dk    sJ ‚|j        j        |_        t          j        |_
        d|_        d|_        |                     |d
d¬¦  «         t          |j        ¦  «        dk    sJ ‚dS )zYVerifies minions receive buffs within 14.0m, and buffs decay if leader dies or separates.Úpack_aura_testr   é   rE   i	  r!   r   r   r9   )ç      i@rT   çL7‰A`å ?©Ú
player_posÚdtg        r   N)r	   r   r"   Úcreate_pack_runtime_statesÚupdate_packr)   Úactive_buffsÚ
current_hpr   ÚDEADÚai_stateÚmonsterÚmax_hpÚIDLEÚ	current_xÚ	current_y)r/   r0   Úair1   ÚstatesÚ	leader_stÚ	minion_sts          r3   Ú+test_leader_aura_buff_application_and_decayzETestMonsterPackAndAffixes.test_leader_aura_buff_application_and_decayZ   sR  € å(Ñ*Ô*ˆÝÑÔˆà×#Ò#Ø$Ø)ØØØØØð $ñ 
ô 
ˆð ×2Ò2°4Ñ8Ô8ˆØ˜1”Iˆ	Ø˜1”Iˆ	ð 	�Š�v¨.¸UˆÑCÔCÐCÝ�9Ô)Ñ*Ô*¨QÒ.Ð.Ð.Ð.ð  #ˆ	ÔÝ+Ô0ˆ	ÔØ
�Š�v¨.¸UˆÑCÔCÐCÝ�9Ô)Ñ*Ô*¨aÒ/Ð/Ð/Ð/ð  )Ô0Ô7ˆ	ÔÝ+Ô0ˆ	ÔØ#ˆ	ÔØ#ˆ	ÔØ
�Š�v¨.¸UˆÑCÔCÐCÝ�9Ô)Ñ*Ô*¨aÒ/Ð/Ð/Ð/Ð/Ð/r5   c           	      óN  — t          ¦   «         }t          ¦   «         }|                     ddddddd¬¦  «        }|                     |¦  «        }|d         }|j        d	z   |j        f}|                     ||d
¬¦  «         |D ]#}|j        t          j	        t          j
        fv sJ ‚Œ$dS )zPVerifies that when one minion detects the player, all pack members join pursuit.Úpack_aggro_testr   é   g      >@ix  r!   r   r9   g      ð?rU   rV   N)r	   r   r"   rY   rb   rc   rZ   r^   r   ÚPURSUITÚATTACK)r/   r0   rd   r1   re   Úminion_targetÚplayer_nearÚss           r3   Ú%test_pack_coordinated_aggro_broadcastz?TestMonsterPackAndAffixes.test_pack_coordinated_aggro_broadcast   sÔ   € å(Ñ*Ô*ˆÝÑÔˆà×#Ò#Ø%Ø)ØØØØØð $ñ 
ô 
ˆð ×2Ò2°4Ñ8Ô8ˆà˜qœ	ˆØ$Ô.°Ñ4°mÔ6MÐNˆð 	�Š�v¨+¸%ˆÑ@Ô@Ð@ð ð 	Qð 	QˆAØ”:¥.Ô"8½.Ô:OÐ!PÐPÐPÐPÐPÐPð	Qð 	Qr5   )r   N)Ú__name__Ú
__module__Ú__qualname__r4   rP   rh   rq   © r5   r3   r   r       sk   € € € € € ð5ð 5ð 5ð 5ð6#ð #ð #ð #ð<#0ð #0ð #0ð #0ðJQð Qð Qð Qð Qð Qr5   r   )Ú__doc__ÚmathÚosÚsysÚpytestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.monster_typesr   r   r   r   r   r   Úworld.monster_procedural_enginer	   Úworld.monster_affix_catalogr
   r   r   r   Úworld.monster_ai_enginer   r   ru   r5   r3   ú<module>r…      sr  ððð ð €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð DÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð ð ð ð ð ð ð 4Ð 3Ð 3Ð 3Ð 3Ð 3ðxQð xQð xQð xQð xQñ xQô xQð xQð xQð xQr5   