§
    [©½j   ã                   ó†   — d dl Z d dlmZmZmZ 	 d dlmZmZmZm	Z	 n# e
$ r d dlmZmZmZm	Z	 Y nw xY w G d„ d¦  «        ZdS )é    N)ÚListÚOptionalÚTuple)ÚMonsterAIStateÚMonsterRuntimeStateÚMonsterAIActionÚPackAuraTypec                   óæ   — e Zd ZdZdd„Zdededededef
d	„Zd
ededdfd„Z	d
eddfd„Z
dededefd„Z	 ddedeeef         dededef
d„Z	 ddee         deeef         dededee         f
d„ZdS )ÚMonsterAIEnginez@Server-Authoritative AI Controller for feral monsters and packs.ÚreturnNc                 ó"   — d| _         d| _        d S )Ng333333ó?g      ,@)Ú_attack_reach_buffer_metersÚpack_aura_radius_meters)Úselfs    ú7C:\Projects\FreeExile\server\world\monster_ai_engine.pyÚ__init__zMonsterAIEngine.__init__   s   € Ø+.ˆÔ(Ø'+ˆÔ$Ð$Ð$ó    Úx1Úy1Úx2Úy2c                 ó8   — t          j        ||z
  ||z
  ¦  «        S )N)ÚmathÚhypot)r   r   r   r   r   s        r   Ú_calc_distancezMonsterAIEngine._calc_distance   s   € ÝŒz˜"˜r™' 2¨¡7Ñ+Ô+Ð+r   Úminion_stateÚ	aura_typec                 óZ  — |t           j        k    rd|j        d<   d|j        d<   dS |t           j        k    rd|j        d<   d|j        d<   dS |t           j        k    rd	|j        d
<   dS |t           j        k    rd|j        d<   dS |t           j        k    rd|j        d<   d|j        d<   dS dS )z9Applies active leader aura buffs to minion runtime state.gÍÌÌÌÌÌô?Ú
speed_multç333333Ó?Úcooldown_reductionç      ø?Ú
armor_multg      ô?Úres_multgffffffö?Úelemental_dmg_multg      Ð?Úlife_leech_pctgš™™™™™õ?Údmg_multgš™™™™™É?Úcrit_chance_bonusN)r	   ÚHASTEÚactive_buffsÚDAMAGE_RESISTANCEÚELEMENTAL_EMPOWERMENTÚVAMPIRICÚMORTAL_MIGHT)r   r   r   s      r   Úapply_leader_auraz!MonsterAIEngine.apply_leader_aura   sÚ   € à�Ô*Ò*Ð*Ø6:ˆLÔ% lÑ3Ø>BˆLÔ%Ð&:Ñ;Ð;Ð;Ø�,Ô8Ò8Ð8Ø6:ˆLÔ% lÑ3Ø48ˆLÔ% jÑ1Ð1Ð1Ø�,Ô<Ò<Ð<Ø>BˆLÔ%Ð&:Ñ;Ð;Ð;Ø�,Ô/Ò/Ð/Ø:>ˆLÔ%Ð&6Ñ7Ð7Ð7Ø�,Ô3Ò3Ð3Ø48ˆLÔ% jÑ1Ø=AˆLÔ%Ð&9Ñ:Ð:Ð:ð 4Ð3r   c                 ó8   — |j                              ¦   «          dS )zFClears all aura-derived buffs when leader dies or minion is separated.N)r*   Úclear)r   r   s     r   Úclear_leader_auraz!MonsterAIEngine.clear_leader_aura.   s   € àÔ!×'Ò'Ñ)Ô)Ð)Ð)Ð)r   ÚstateÚdtc                 óz  — |                       |j        |j        |j        |j        ¦  «        }|dk    rLt
          j        |_        d|_        |j        |_        |j        |_        t          d|j        |j        ¬¦  «        S d|_        t          |j        j        |j        |j        j        dz  |z  z   ¦  «        |_        |j        j        j        dz  }|j        |j        z
  |z  }|j        |j        z
  |z  }|xj        ||z  |z  z  c_        |xj        ||z  |z  z  c_        t          d|j        |j        ¬¦  «        S )	Nç      ð?FÚSTAND©Úaction_typeÚtarget_xÚtarget_yTr    r"   ÚRETURN_TO_SPAWN)r   Ú	current_xÚ	current_yÚspawn_xÚspawn_yr   ÚIDLEÚai_stateÚis_invulnerabler   ÚminÚmonsterÚmax_hpÚ
current_hpÚ
aggressionÚmovement_speed)r   r3   r4   Údist_to_spawnÚspeedÚdxÚdys          r   Ú_handle_leash_returnz$MonsterAIEngine._handle_leash_return2   s-  € Ø×+Ò+¨E¬O¸U¼_ÈeÌmÐ]bÔ]jÑkÔkˆØ˜CÒÐÝ+Ô0ˆEŒNØ$)ˆEÔ!Ø#œmˆEŒOØ#œmˆEŒOÝ"¨wÀÄÐY^ÔYfÐgÑgÔgÐgð !%ˆÔÝ˜uœ}Ô3°UÔ5EÈÌÔH\Ð_cÑHcÐfhÑHhÑ5hÑiÔiˆÔØ”Ô(Ô7¸#Ñ=ˆØŒm˜eœoÑ-°Ñ>ˆØŒm˜eœoÑ-°Ñ>ˆØˆŒ˜2 ™:¨™?Ñ*ˆŒØˆŒ˜2 ™:¨™?Ñ*ˆŒÝÐ+<ÀuÄ}Ð_dÔ_lÐmÑmÔmÐmr   r   Ú
player_posÚcurrent_time_msc                 óÚ  — |j         t          j        k    rt          d|j        |j        ¬¦  «        S |                      |j        |j        |j        |j        ¦  «        }|                      |j        |j        |d         |d         ¦  «        }||j	        j
        j        k    s|j         t          j        k    r't          j        |_         |                      ||¦  «        S |j	        j        j        | j        z   }||k    rÌt          j        |_         d}|j                             dd¦  «        }	t)          dt+          |j	        j
        j        d	|	z
  z  ¦  «        ¦  «        }
||j        z
  |
k    r?|j                             d
d	¦  «        }t1          |j	        j        |z  d¦  «        }||_        t          d|d         |d         |¬¦  «        S ||j	        j
        j        k    p|j         t          j        k    }|rÌt          j        |_         |j                             dd	¦  «        }|j	        j
        j        |z  }|d         |j        z
  t)          d|¦  «        z  }|d         |j        z
  t)          d|¦  «        z  }|xj        ||z  |z  z  c_        |xj        ||z  |z  z  c_        t          d|d         |d         ¬¦  «        S t          j        |_         t          d|j        |j        ¬¦  «        S )z*Executes a single tick (dt) AI evaluation.r7   r8   r   é   Nr!   g        éd   r6   r'   ÚATTACK)r9   r:   r;   Údamage_eventr   gü©ñÒMbP?ÚMOVE_TOWARDS)rB   r   ÚDEADr   r=   r>   r   r?   r@   rE   rH   Úleash_radius_metersÚLEASH_RETURNrN   ÚvisualÚcollision_radiusr   rT   r*   ÚgetÚmaxÚintÚattack_cooldown_msÚlast_attack_timestamp_msÚroundÚbase_damageÚaggro_radius_metersÚPURSUITrI   rA   )r   r3   rO   r4   rP   Údist_from_spawnÚdist_to_playerÚmelee_rangeÚ
dmg_amountÚcd_reductionÚeff_cdr'   Úshould_pursuer   rK   rL   rM   s                    r   ÚupdatezMonsterAIEngine.updateE   sØ  € ð Œ>�^Ô0Ò0Ð0Ý"¨wÀÄÐ[`Ô[jÐkÑkÔkÐkà×-Ò-¨e¬o¸u¼ÐPUÔP]Ð_dÔ_lÑmÔmˆØ×,Ò,¨U¬_¸e¼oÈzÐZ[Ì}Ð^hÐijÔ^kÑlÔlˆð ˜Uœ]Ô5ÔIÒIÐIÈUÌ^Õ_mÔ_zÒMzÐMzÝ+Ô8ˆEŒNØ×,Ò,¨U°BÑ7Ô7Ð7ð ”mÔ*Ô;¸dÔ>^Ñ^ˆØ˜[Ò(Ð(Ý+Ô2ˆEŒNØˆJØ Ô-×1Ò1Ð2FÈÑLÔLˆLÝ˜�c %¤-Ô":Ô"MÐQTÐWcÑQcÑ"dÑeÔeÑfÔfˆFØ Ô!?Ñ?À6ÒIÐIØ Ô-×1Ò1°*¸cÑBÔB�Ý" 5¤=Ô#<¸xÑ#GÈÑKÔK�
Ø1@�Ô.Ý"Ø$Ø# AœØ# AœØ'ð	ñ ô ð ð (¨5¬=Ô+CÔ+WÒWð  GÐ]bÔ]kÕo}ô  pFò  ^FˆØð 	Ý+Ô3ˆEŒNØÔ+×/Ò/°¸cÑBÔBˆJØ”MÔ,Ô;¸jÑHˆEØ˜Q”- %¤/Ñ1µS¸ÀÑ5OÔ5OÑOˆBØ˜Q”- %¤/Ñ1µS¸ÀÑ5OÔ5OÑOˆBØˆOŒO˜r E™z¨B™Ñ.ˆOŒOØˆOŒO˜r E™z¨B™Ñ.ˆOŒOÝ"Ø*Ø# AœØ# Aœðñ ô ð õ (Ô,ˆŒÝ¨7¸U¼_ÐW\ÔWfÐgÑgÔgÐgr   Úpack_statesc                 óÖ  ‡ ‡‡‡— d}|D ]}|j         r|} nŒ|duo|j        dk    o|j        t          j        k    }|D ]Í}|j         r;|r#|j        r‰                      ||j        ¦  «         Œ.‰                      |¦  «         ŒD|rr|�p|j        ri‰                      |j	        |j
        |j	        |j
        ¦  «        }|‰ j        k    r‰                      ||j        ¦  «         Œ¢‰                      |¦  «         Œ¸‰                      |¦  «         ŒÎd}	|D ]ˆ}|j        t          j        t          j        fv rŒ"‰                      |j	        |j
        ‰d         ‰d         ¦  «        }
|
|j        j        j        k    s|j        t          j        t          j        fv rd}	 nŒ‰|	r@|D ]=}|j        t          j        t          j        t          j        fv rt          j        |_        Œ>ˆˆˆˆ fd„|D ¦   «         S )zh
        Coordinates pack pursuit alerting and proximity leader aura buffs across pack members.
        Nr   FrR   Tc                 ó@   •— g | ]}‰                      |‰‰‰¦  «        ‘ŒS © )rl   )Ú.0ÚsrP   r4   rO   r   s     €€€€r   ú
<listcomp>z/MonsterAIEngine.update_pack.<locals>.<listcomp>µ   s+   ø€ ÐUÐUÐUÀA�—’˜A˜z¨2¨Ñ?Ô?ÐUÐUÐUr   )Úis_pack_leaderrG   rB   r   rW   Úleader_aurar/   r2   r   r=   r>   r   rY   rE   rH   rc   rd   rT   rA   ÚPATROLÚALERT)r   rm   rO   r4   rP   Úleaderrr   Úleader_aliveÚdist_leaderÚpack_alertedÚ	dist_to_ps   ` ```      r   Úupdate_packzMonsterAIEngine.update_pack~   se  øøøø€ ð 15ˆØð 	ð 	ˆAØÔð Ø�Ø�ðð
 ˜$Ðð 7ØÔ! AÒ%ð7à”¥>Ô#6Ò6ð 	ð ð 	*ð 	*ˆAØÔð *Øð . A¤Mð .Ø×*Ò*¨1¨a¬mÑ<Ô<Ð<Ð<à×*Ò*¨1Ñ-Ô-Ð-Ð-Øð * &Ð"4¸Ô9KÐ"4Ø"×1Ò1°!´+¸q¼{ÈFÔL\Ð^dÔ^nÑoÔo�Ø $Ô">Ò>Ð>Ø×*Ò*¨1¨fÔ.@ÑAÔAÐAÐAà×*Ò*¨1Ñ-Ô-Ð-Ð-à×&Ò& qÑ)Ô)Ð)Ð)ð ˆØð 	ð 	ˆAØŒz�nÔ1µ>Ô3NÐOÐOÐOØØ×+Ò+¨A¬K¸¼ÀjÐQRÄmÐU_Ð`aÔUbÑcÔcˆIØ˜AœIÔ0ÔDÒDÐDÈÌ
ÕWeÔWmÕo}ô  pEð  WFð  IFð  IFØ#�Ø�ð IFð ð 	8Ø ð 8ð 8�Ø”:¥.Ô"5µ~Ô7LÍnÔNbÐ!cÐcÐcÝ!/Ô!7�A”Jøð VÐUÐUÐUÐUÐUÐUÈÐUÑUÔUÐUr   )r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úfloatr   r   r	   r/   r2   r   rN   r   r^   rl   r   r}   rp   r   r   r   r      s»  € € € € € ØJÐJð,ð ,ð ,ð ,ð, ð ,¨Eð ,°uð ,À%ð ,ÈEð ,ð ,ð ,ð ,ðBÐ.Að BÈlð BÐ_cð Bð Bð Bð Bð *Ð.Að *Àdð *ð *ð *ð *ðnÐ*=ð nÀ5ð nÈ_ð nð nð nð nð0  !ð7hð 7hà"ð7hð ˜% ˜,Ô'ð7hð ð	7hð
 ð7hð 
ð7hð 7hð 7hð 7hð|  !ð7Vð 7VàÐ-Ô.ð7Vð ˜% ˜,Ô'ð7Vð ð	7Vð
 ð7Vð 
ˆoÔ	ð7Vð 7Vð 7Vð 7Vð 7Vð 7Vr   r   )r   Útypingr   r   r   Úserver.world.monster_typesr   r   r   r	   ÚImportErrorÚworld.monster_typesr   rp   r   r   ú<module>r‡      s  ðØ €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ððð ð ð ð ð ð ð ð ð ð ð ð øð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðøøøðaVð aVð aVð aVð aVñ aVô aVð aVð aVð aVs   � �1°1