§
    ýÙÀj[(  ã                   ó  — U d Z ddlmZmZ ddlmZ ddlZddlmZm	Z	m
Z
mZ 	 ddlmZmZmZmZ ddlmZ ddlmZ n## e$ r ddlmZmZmZmZ ddlmZ ddlmZ Y nw xY w G d	„ d
ee¦  «        Z ed¬¦  «         G d„ d¦  «        ¦   «         Zddddej        ej        ej        g eddej        ddddd¬¦  «         eddej         ddddd ¬¦  «        gd!œd"dd#dej!        ej"        ej#        g ed$d%ej        d&d'ddd(¬¦  «        gd!œd)d#d*dej        ej$        ej%        g ed+d,ej         d-d.ddd/¬¦  «        gd!œd0d*d1d2ej&        ej'        ej%        g ed3d4ej        d5d5ddd6¬¦  «        gd!œd7œZ(eeef         e)d8<    G d9„ d:¦  «        Z*dS );zÀ
Wilderness Encounter Density & Dynamic Ambush Engine for FreeExile.
Enforces PoE2 spatial encounter rules, zone pack distributions,
and strict Safe Haven Firewall protection for Sanctuaries.
é    )Ú	dataclassÚfield)ÚEnumN)ÚDictÚListÚOptionalÚTuple)ÚMonsterGenusÚMonsterRankÚProceduralMonsterÚMonsterPack)ÚMonsterProceduralEngine)Ú
ZoneEnginec                   ó   — e Zd ZdZdZdS )ÚAmbushTriggerTypeÚSHRINEÚCORRUPTED_RIFTN)Ú__name__Ú
__module__Ú__qualname__r   r   © ó    úAC:\Projects\FreeExile\server\world\wilderness_encounter_engine.pyr   r       s   € € € € € Ø€FØ%€N€N€Nr   r   T)Úslotsc                   óz   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeed<   dZe	ed	<   d
Z
eed<   dZeed<   dS )ÚAmbushTriggerÚ
trigger_idÚzone_idÚtrigger_typeÚxÚyç      @Útrigger_radiusFÚis_triggeredé   Úambush_pack_sizeu   Cá»• Cá»‘t Táº¿ Ä�Ã nÚentity_nameN)r   r   r   ÚstrÚ__annotations__r   Úfloatr#   r$   Úboolr&   Úintr'   r   r   r   r   r   %   sƒ   € € € € € € à€O€O�OØ€L€L�LØ#Ð#Ð#Ñ#Ø€H€H�HØ€H€H�HØ€N�EÐÐÑØ€L�$ÐÐÑØÐ�cÐÐÑØ.€K�Ð.Ð.Ñ.Ð.Ð.r   r   u   Bá»� Ä�Ã¡ TÃ n XÆ°Æ¡ngé   é   é   Úambush_tang_kiem_shrineÚzone_tang_kiem_nhaig     €f@g      d@r"   r%   u   BÃ¡t Máº¡ch Linh Ä�Ã i)r   r   r   r    r!   r#   r&   r'   Úambush_tang_kiem_riftg      t@g     €q@g      @é   u   Khe Ná»©t HÆ° KhÃ´ng)ÚnameÚ	min_levelÚ	max_levelÚ
base_packsÚnative_genusÚambushesu   Ä�áº§m Láº§y Thá»‘i Rá»¯aé   Úambush_ancient_sword_shrineÚzone_ancient_sword_barrowg     @o@g     @p@u   Huyáº¿t Táº¿ Ä�Ã nu   Sa Cá»‘t Hoang Máº¡cé   Úambush_sandstorm_riftÚzone_boundless_sandstormg      y@g     @z@u   Cá»• Cá»‘t HÆ° KhÃ´ng ThÃ¡pu   Pháº¿ TÃ­ch Xáº» Thá»‹té(   é   Úambush_blood_scale_shrineÚzone_blood_scale_ruinsg     àu@u   BÃ n Thá»� Quá»· Ä�oáº¡t Má»‡nh)r1   r<   r?   rC   ÚZONE_DENSITY_SPECSc                   óè   — e Zd ZdZ	 	 ddee         dee         ddfd„Zdd„Zde	ddfd	„Z
d
edee         fd„Z	 	 dd
edee         dedee         fd„Zd
ededededeeeee         f         f
d„ZdS )ÚWildernessEncounterEnginezKAuthoritative engine for wilderness pack distribution and dynamic ambushes.NÚzone_engineÚprocedural_engineÚreturnc                 ó˜   — |�|nt          ¦   «         | _        |�|nt          ¦   «         | _        i | _        |                      ¦   «          d S )N)r   rG   r   rH   Ú	_triggersÚ_init_triggers)ÚselfrG   rH   s      r   Ú__init__z"WildernessEncounterEngine.__init__Ÿ   s\   € ð
 +6Ð*A˜;˜;ÅzÁ|Ä|ˆÔð !Ð,ð Ðå(Ñ*Ô*ð 	Ôð
 ?AˆŒØ×ÒÑÔÐÐÐr   c                 ó:  — t                                ¦   «         D ]€\  }}i | j        |<   |                     dg ¦  «        D ]Z}t	          |j        |j        |j        |j        |j	        |j
        |j        |j        |j        ¬¦	  «	        | j        |         |j        <   Œ[Œ�dS )z6Loads default ambush triggers from zone density specs.r9   )	r   r   r   r    r!   r#   r$   r&   r'   N)rD   ÚitemsrK   Úgetr   r   r   r   r    r!   r#   r$   r&   r'   )rM   Úz_idÚspecÚtrigs       r   rL   z(WildernessEncounterEngine._init_triggers­   s°   € å,×2Ò2Ñ4Ô4ð 	ð 	‰JˆD�$Ø#%ˆDŒN˜4Ñ ØŸš ¨RÑ0Ô0ð ð �Ý8EØ#œØ œLØ!%Ô!2Ø”fØ”fØ#'Ô#6Ø!%Ô!2Ø%)Ô%:Ø $Ô 0ð
9ñ 
9ô 
9�”˜tÔ$ T¤_Ñ5Ð5ðð	ð 	r   Útriggerc                 ót   — |j         | j        vri | j        |j         <   || j        |j                  |j        <   dS )z0Registers a custom or procedural ambush trigger.N)r   rK   r   )rM   rU   s     r   Úregister_triggerz*WildernessEncounterEngine.register_trigger¾   s;   € àŒ? $¤.Ð0Ð0Ø.0ˆDŒN˜7œ?Ñ+Ø>EˆŒ�w”Ô'¨Ô(:Ñ;Ð;Ð;r   r   c                 ó6   — t                                |¦  «        S )z0Returns density specifications for a given zone.)rD   rQ   )rM   r   s     r   Úget_zone_density_specz/WildernessEncounterEngine.get_zone_density_specÄ   s   € å!×%Ò% gÑ.Ô.Ð.r   éè  Úmap_tierÚseedc           
      ó”  — | j                              |¦  «        sg S |                      |¦  «        }|r|                     dd¦  «        nd}|r|                     dd¦  «        nd}|�/t	          d|dz
  dz  ¦  «        }||z   }t          dd|z   ¦  «        }	n|r|}|d	         |d
         z   dz  }	n|}d}	g }
t          |¦  «        D ]‚}||dz  z   }d|› d|dz   › �}d|dz  dz  z   }d|dz  dz  dz  z   }|r|dk    r|d	         dk    r|d	         n|	}| j                             |||||||¬¦  «        }|
 	                    |¦  «         Œƒ|
S )zŠ
        Generates packs for outer wilderness zones or map device instances.
        Enforces 0 spawns in Safe Haven Sanctuaries.
        r7   r/   r8   Nr   r-   éd   éD   r5   r6   é   é
   i  Úpack_Ú_g      D@i,  g      ø?é   )Úpack_idr   ÚlevelÚcenter_xÚcenter_yr\   Úallowed_genus)
rG   Úcan_spawn_hostile_monstersrY   rQ   ÚmaxÚminÚrangerH   Úgenerate_packÚappend)rM   r   r[   r\   rS   r7   r8   Ú
tier_bonusÚtotal_packsÚ	avg_levelÚpacksÚiÚ	pack_seedre   ÚcxÚcyÚpack_lvlÚpacks                     r   Úgenerate_zone_encounter_packsz7WildernessEncounterEngine.generate_zone_encounter_packsÈ   sÆ  € ð Ô×:Ò:¸7ÑCÔCð 	ØˆIà×)Ò)¨'Ñ2Ô2ˆØ26Ð=�T—X’X˜l¨AÑ.Ô.Ð.¸Aˆ
Ø9=ÐG�t—x’x °Ñ5Ô5Ð5À4ˆØÐÝ˜Q ¨A¡°!Ñ 3Ñ4Ô4ˆJØ$ zÑ1ˆKÝ˜C  h¡Ñ/Ô/ˆIˆIØð 	Ø$ˆKØ˜kÔ*¨T°+Ô->Ñ>À1ÑDˆIˆIà$ˆKØˆIà#%ˆÝ�{Ñ#Ô#ð 	ð 	ˆAØ˜q 3™w™ˆIØ/˜gÐ/Ð/¨¨A©Ð/Ð/ˆGØ˜ S™¨CÑ/Ñ/ˆBØ˜) q™.¨CÑ/°3Ñ6Ñ6ˆBØ-1Ðg°a¸1²f°fÀÀkÔARÐVWÒAWÐAW�t˜KÔ(Ð(Ð^gˆHØÔ)×7Ò7ØØØØØØØ*ð 8ñ ô ˆDð �LŠL˜ÑÔÐÐØˆr   r   Úplayer_xÚplayer_yc                 óÒ  — | j                              |¦  «        s	dd|› d�g fS | j                             |i ¦  «        }|                     |¦  «        }|€	dd|› d�g fS |j        rddg fS t          j        ||j        z
  ||j        z
  ¦  «        }||j	        k    rdd|d	›d
|j	        › d�g fS d|_        |  
                    |¦  «        }|r|d         |d         z   dz  nd}	t          d|j        dz
  ¦  «        }
| j                             d|j        › �||	|j        |j        t!          |j        dz  |j        z   ¦  «        |
¬¦  «        }|j        g|j        z   }d|j        › d�}d||fS )zÇ
        Evaluates proximity to an ambush trigger and spawns an ambush pack if valid.
        Strictly enforces the Safe Haven Firewall: returns False with rejection message if in sanctuary.
        FuB   NghiÃªm cáº¥m kÃ­ch hoáº¡t phá»¥c kÃ­ch trong khu vá»±c An ToÃ n [u   ] theo chuáº©n PoE2!Nu*   KhÃ´ng tÃ¬m tháº¥y cÆ¡ quan phá»¥c kÃ­ch 'z'.u?   CÆ¡ quan phá»¥c kÃ­ch Ä‘Ã£ Ä‘Æ°á»£c kÃ­ch hoáº¡t trÆ°á»›c Ä‘Ã³.u	   Cá»± ly (z.1fu)   m) vÆ°á»£t quÃ¡ bÃ¡n kÃ­nh kÃ­ch hoáº¡t (zm).Tr5   r6   r`   é   r-   Úambush_r^   )re   r   rf   rg   rh   r\   Úminion_countu   Phá»¥c kÃ­ch bÃ¹ng ná»• táº¡i ú!)rG   rj   rK   rQ   r$   ÚmathÚhypotr    r!   r#   rY   rk   r&   rH   rn   r   r,   ÚleaderÚminionsr'   )rM   r   r   r{   r|   Ú
zone_trigsrU   ÚdistrS   Úlvlr€   Úambush_packÚall_mobsÚmsgs                 r   Úcheck_and_trigger_ambushz2WildernessEncounterEngine.check_and_trigger_ambushö   sÛ  € ð Ô×:Ò:¸7ÑCÔCð 	àØrÐU\ÐrÐrÐrØðð ð ”^×'Ò'¨°Ñ4Ô4ˆ
Ø—.’. Ñ,Ô,ˆØˆ?ØÐUÀzÐUÐUÐUÐWYÐYÐYàÔð 	`ØÐ[Ð]_Ð_Ð_åŒz˜( W¤YÑ.°¸7¼9Ñ0DÑEÔEˆØ�'Ô(Ò(Ð(àØj˜DÐjÐjÐjÈwÔOeÐjÐjÐjØðð ð  $ˆÔØ×)Ò)¨'Ñ2Ô2ˆØ>BÐJˆt�KÔ  4¨Ô#4Ñ4¸Ñ:Ð:Èˆå˜1˜gÔ6¸Ñ:Ñ;Ô;ˆØÔ,×:Ò:Ø2˜gÔ0Ð2Ð2ØØØ”YØ”YÝ�W”Y ‘_ w¤yÑ0Ñ1Ô1Ø%ð ;ñ 
ô 
ˆð  Ô&Ð'¨+Ô*=Ñ=ˆØE¨wÔ/BÐEÐEÐEˆØ�S˜(Ð"Ð"r   )NN)rI   N)NrZ   )r   r   r   Ú__doc__r   r   r   rN   rL   r   rW   r(   r   rY   r,   r   r   rz   r*   r	   r+   r   rŒ   r   r   r   rF   rF   œ   sk  € € € € € ØUÐUð -1Ø?Cðð à˜jÔ)ðð $Ð$;Ô<ðð 
ð	ð ð ð ðð ð ð ð"F¨ð F¸$ð Fð Fð Fð Fð/¨Sð /°X¸d´^ð /ð /ð /ð /ð #'Øð	,ð ,àð,ð ˜3”-ð,ð ð	,ð
 
ˆkÔ	ð,ð ,ð ,ð ,ð\5#àð5#ð ð5#ð ð	5#ð
 ð5#ð 
ˆt�S˜$Ð0Ô1Ð1Ô	2ð5#ð 5#ð 5#ð 5#ð 5#ð 5#r   rF   )+r�   Údataclassesr   r   Úenumr   r‚   Útypingr   r   r   r	   Úserver.world.monster_typesr
   r   r   r   Ú&server.world.monster_procedural_enginer   Úserver.world.zone_enginer   ÚImportErrorÚworld.monster_typesÚworld.monster_procedural_engineÚworld.zone_enginer(   r   r   ÚFERAL_HELLHOUNDÚCORRUPTED_RAPTORÚRISEN_SKELETONr   r   ÚBLOOD_CRAWLERÚSHADOW_WRAITHÚBRAMBLE_TREANTÚIRONHIDE_BEHEMOTHÚ	TOMB_LORDÚPRIMAL_CANNIBALÚFLESH_ABOMINATIONrD   r)   rF   r   r   r   ú<module>r¢      sù  ððð ð ð )Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .ð-ðð ð ð ð ð ð ð ð ð ð ð ð OÐNÐNÐNÐNÐNØ3Ð3Ð3Ð3Ð3Ð3Ð3øØð -ð -ð -ðð ð ð ð ð ð ð ð ð ð ð ð HÐGÐGÐGÐGÐGØ,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ð-øøøð&ð &ð &ð &ð &˜˜Tñ &ô &ð &ð
 €�ÐÑÔð	/ð 	/ð 	/ð 	/ð 	/ñ 	/ô 	/ñ Ôð	/ð )ØØØàÔ(ØÔ)ØÔ'ð
ð ˆMØ4Ø-Ø.Ô5ØØØ"Ø!"Ø4ð	ñ 	ô 	ð ˆMØ2Ø-Ø.Ô=ØØØ"Ø!"Ø2ð	ñ 	ô 	ð
ð ð  ðD ,ØØØàÔ&ØÔ&ØÔ'ð
ð ˆMØ8Ø3Ø.Ô5ØØØ"Ø!"Ø0ð	ñ 	ô 	ð
ð"ð "ð0 'ØØØàÔ)ØÔ*ØÔ"ð
ð ˆMØ2Ø2Ø.Ô=ØØØ"Ø!"Ø9ð	ñ 	ô 	ð
ð!ð !ð0 *ØØØàÔ(ØÔ*ØÔ"ð
ð ˆMØ6Ø0Ø.Ô5ØØØ"Ø!"Ø=ð	ñ 	ô 	ð
ðð ðag'ð g'Ð �D˜˜d˜”Oð gð gñ gðTO#ð O#ð O#ð O#ð O#ñ O#ô O#ð O#ð O#ð O#s   £< ¼AÁA