§
    <Ë¾jLP  ã                  óÀ   — d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ dd	lmZ g d
¢Z G d„ d¦  «        ZdS )as  
Zone, Dungeon Instance, and Secret Chamber Engine for FreeExile.
Implements:
1. Authoritative Map & Zone Registry (Sanctuary, Open World, Dungeons, Secret Chambers).
2. Boundary-Checked Movement, Spawning, and Anti-Cheat Teleport Validation.
3. Waypoint Network, Proximity Discovery, and Fast Travel Gating.
4. Portal Traversal with Level and Quest Prerequisite Verification.
5. Dynamic Dungeon Instances with Layer Progression, Spatial Grid Isolation, and Time Limits.
6. Cryptic Secret Chamber Spawning, Lifespan Timers, and Auto-Collapse Mechanics.
7. Seamless Closed-Loop Integration with QuestEngine & Combat Subsystems.
é    )ÚannotationsN)ÚDictÚListÚOptionalÚSetÚTuple)ÚSpatialGrid)Úeuclidean_distance_2dÚis_within_radius_2d)Únow_ms)
ÚZoneTypeÚZoneEnvironmentÚWaypointÚ
ZonePortalÚZoneDefinitionÚPlayerLocationÚDungeonTemplateÚInstanceSessionÚSecretChamberTemplateÚSecretChamberSession)Ú&register_canonical_zones_and_templates)Ú
ZoneEnginer   r   r   r   r   r   r   r   r   r   c                  óÜ   — e Zd ZdZdKd„ZdLd„ZdMd
„ZdNd„ZdOd„ZdPd„Z	dQd„Z
dRd„Z	 	 dSdTd „ZdUd#„ZdVd%„Z	 dWdXd&„ZdYd)„ZdZd,„Zd[d.„Z	 d\d]d6„Zd^d<„Zd_d?„Zd`d@„Z	 dadbdF„ZdcdH„ZdcdI„ZdddJ„ZdS )er   zÊ
    Authoritative Zone, Instance, and Secret Chamber Management Engine.
    Guarantees strict spatial bounds, zero-trust fast travel, isolated instances,
    and reactive secret chamber mechanics.
    ÚreturnÚNonec                ó”   — i | _         i | _        i | _        i | _        i | _        i | _        i | _        i | _        t          | ¦  «         d S ©N)	ÚzonesÚdungeon_templatesÚsecret_chamber_templatesÚplayer_locationsÚplayer_unlocked_waypointsÚactive_instancesÚactive_secret_chambersÚzone_spatial_gridsr   )Úselfs    ú1C:\Projects\FreeExile\server\world\zone_engine.pyÚ__init__zZoneEngine.__init__8   s]   € Ø02ˆŒ
Ø=?ˆÔØJLˆÔ%ð <>ˆÔØ>@ˆÔ&ð =?ˆÔØGIˆÔ#ð ;=ˆÔõ 	/¨tÑ4Ô4Ð4Ð4Ð4ó    Úzoner   c                ó^   — || j         |j        <   t          d¬¦  «        | j        |j        <   dS )z2Registers a zone and initializes its spatial grid.ç      P@©Ú	cell_sizeN)r   Úzone_idr	   r%   )r&   r*   s     r'   Úadd_zonezZoneEngine.add_zoneK   s0   € à#'ˆŒ
�4”<Ñ Ý0;ÀdÐ0KÑ0KÔ0KˆÔ ¤Ñ-Ð-Ð-r)   r/   Ústrc                óT   — || j         vrt          d|› d�¦  «        ‚| j         |         S )NzZone 'z' not found in registry.)r   ÚKeyError©r&   r/   s     r'   Úget_zonezZoneEngine.get_zoneT   s6   € Ø˜$œ*Ð$Ð$ÝÐE GÐEÐEÐEÑFÔFÐFØŒz˜'Ô"Ð"r)   úOptional[ZoneDefinition]c                ó6   — | j                              |¦  «        S )zASafe lookup alias for zone definition; returns None if not found.)r   Úgetr4   s     r'   Úget_zone_definitionzZoneEngine.get_zone_definitionY   s   € àŒz�~Š~˜gÑ&Ô&Ð&r)   Útemplate_idr   c                óT   — || j         vrt          d|› d�¦  «        ‚| j         |         S )NzDungeon template 'ú' not found.)r   r3   ©r&   r:   s     r'   Úget_dungeon_templatezZoneEngine.get_dungeon_template]   s8   € Ø˜dÔ4Ð4Ð4ÝÐI°ÐIÐIÐIÑJÔJÐJØÔ% kÔ2Ð2r)   r   c                óT   — || j         vrt          d|› d�¦  «        ‚| j         |         S )NzSecret chamber template 'r<   )r    r3   r=   s     r'   Úget_secret_chamber_templatez&ZoneEngine.get_secret_chamber_templateb   s8   € Ø˜dÔ;Ð;Ð;ÝÐP°{ÐPÐPÐPÑQÔQÐQØÔ,¨[Ô9Ð9r)   Úboolc                ó’   — | j                              |¦  «        }|€dS |j        t          j        t          j        t          j        fv S )zº
        PoE2 Rule: Safe Havens (Sanctuary Hub and Player Hideout) prohibit hostile mobs.
        Only OPEN_WORLD, DUNGEON_INSTANCE, and SECRET_CHAMBER allow hostile encounters.
        NF)r   r8   Ú	zone_typer   Ú
OPEN_WORLDÚDUNGEON_INSTANCEÚSECRET_CHAMBER)r&   r/   r*   s      r'   Úcan_spawn_hostile_monstersz%ZoneEngine.can_spawn_hostile_monstersg   s?   € ð
 Œz�~Š~˜gÑ&Ô&ˆØˆ<Ø�5ØŒ~¥(Ô"5µxÔ7PÕRZÔRiÐ!jÐjÐjr)   ÚxÚfloatÚyc                óÄ   — | j                              |¦  «        }|€dS |j                             ¦   «         D ]'}t	          |||j        |j        |j        ¦  «        r dS Œ(dS )z�
        PoE2 Rule: Checks if coordinates (x, y) fall within the safe_radius
        of any registered waypoint in the specified zone.
        NFT)r   r8   Ú	waypointsÚvaluesr   rH   rJ   Úsafe_radius)r&   r/   rH   rJ   r*   Úwps         r'   Úis_in_waypoint_safe_radiusz%ZoneEngine.is_in_waypoint_safe_radiusq   sm   € ð
 Œz�~Š~˜gÑ&Ô&ˆØˆ<Ø�5Ø”.×'Ò'Ñ)Ô)ð 	ð 	ˆBÝ" 1 a¨¬¨r¬t°R´^ÑDÔDð Ø�t�tðàˆur)   FNÚis_dummyúOptional[float]ÚtxúOptional[int]ÚtyúTuple[bool, str]c                óÒ  — t          |t          t          f¦  «        r>t          |¦  «        t          ur(t          |¦  «        |�t          |¦  «        nd}}d\  }}}|rdS |                      |¦  «        sdd|› d�fS |�s|�q| j                             |¦  «        }|�U|j         	                    ¦   «         D ];}t          |||j        |j        |j        ¦  «        rdd|j        › d	|j        › d
�fc S Œ<|�n|�lddlm}	 ddlm}
 |	                     |||¦  «        }||
j        |
j        |
j        |
j        |
j        fv s|                     ¦   «         sdd|j        › d|› d|› d�fS dd|› d�fS )z`Validates monster spawn in zone: checks Safe Havens, waypoint safe_radius, and tile passability.Nr   )FNN)Tuf   KhÃ´i Lá»—i Luyá»‡n VÃµ (Target Dummy) Ä‘Æ°á»£c phÃ©p kÃ­ch hoáº¡t Ä‘á»ƒ thá»­ nghiá»‡m chiÃªu thá»©c.FuS   NghiÃªm cáº¥m sáº£n sinh quÃ¡i váº­t trong khu vá»±c An ToÃ n (Sanctuary/Hideout: [u   ]) theo chuáº©n PoE2!u?   NghiÃªm cáº¥m sáº£n sinh quÃ¡i váº­t trong pháº¡m vi an toÃ n (u"   m) cá»§a Ä‘iá»ƒm dá»‹ch chuyá»ƒn [z]!)ÚProceduralMapEngine)ÚTileTypeuN   NghiÃªm cáº¥m sáº£n sinh quÃ¡i váº­t trÃªn Ä‘á»‹a hÃ¬nh khÃ´ng thá»ƒ Ä‘i qua [u	   ] táº¡i (z, z)!Tu   Khu vá»±c [u6   ] há»£p lá»‡ Ä‘á»ƒ sáº£n sinh quÃ¡i váº­t dÃ£ ngoáº¡i.)Ú
isinstanceÚintrI   ÚtyperA   rG   r   r8   rL   rM   r   rH   rJ   rN   ÚnameÚ"server.world.procedural_map_enginerX   Úserver.world.map_data_typesrY   Úget_tile_typeÚWALLÚCHASMÚWATERÚ	BOSS_GATEÚVOIDÚis_passable)r&   r/   rQ   rH   rJ   rS   rU   r*   rO   rX   rY   Ú	tile_types               r'   Úvalidate_monster_spawnz!ZoneEngine.validate_monster_spawn~   sN  € õ
 �h¥¥e Ñ-Ô-ð 	/µ$°x±.´.ÍÐ2LÐ2LÝ˜‘]”]¨a¨m¥C¨¡F¤F FÀ�ˆBØ.‰NˆH�a˜àð 	Bð Bð  BØ×.Ò.¨wÑ7Ô7ð 	OØð  OÐpwð  Oð  Oð  Oð  Oð  OØˆ=˜Q˜]Ø”:—>’> 'Ñ*Ô*ˆDØÐØœ.×/Ò/Ñ1Ô1ð ð �BÝ*¨1¨a°´°r´t¸R¼^ÑLÔLð à!ð \Ð^`Ô^lð  \ð  \ð  QSô  QXð  \ð  \ð  \ð ð ð ð ðð
 ˆ>˜b˜nØNÐNÐNÐNÐNÐNØ<Ð<Ð<Ð<Ð<Ð<Ø+×9Ò9¸'À2ÀrÑJÔJˆIØ˜Xœ]¨H¬N¸H¼NÈHÔL^Ð`hÔ`mÐnÐnÐnÐv÷  wLò  wLñ  wNô  wNÐnàð KÐenÔesð  Kð  Kð  Að  Kð  Kð  EGð  Kð  Kð  Kðð ð Ðb 7ÐbÐbÐbÐbÐbr)   Ú	player_idr   c                óZ   — || j         vr|                      |d¦  «         | j         |         S )NÚzone_boundless_sanctuary)r!   Úspawn_player)r&   ri   s     r'   Úget_player_locationzZoneEngine.get_player_locationŸ   s5   € Ø˜DÔ1Ð1Ð1Ø×Ò˜iÐ)CÑDÔDÐDØÔ$ YÔ/Ð/r)   úSet[str]c                ó  — || j         vrqt          ¦   «         }| j                             ¦   «         D ]?}|j                             ¦   «         D ]#}|j        r|                     |j        ¦  «         Œ$Œ@|| j         |<   | j         |         S r   )r"   Úsetr   rM   rL   Úis_unlocked_by_defaultÚaddÚwaypoint_id)r&   ri   Údefault_unlockedÚzrO   s        r'   Úget_unlocked_waypointsz!ZoneEngine.get_unlocked_waypoints¤   s™   € Ø˜DÔ:Ð:Ð:Ý),©¬ÐØ”Z×&Ò&Ñ(Ô(ð =ð =�Øœ+×,Ò,Ñ.Ô.ð =ð =�BØÔ0ð =Ø(×,Ò,¨R¬^Ñ<Ô<Ð<øð=ð 9IˆDÔ*¨9Ñ5ØÔ-¨iÔ8Ð8r)   c           
     óÞ   — |                       |¦  «        }|�|n|j        }|�|n|j        }t          ||||dd t	          ¦   «         ¬¦  «        }|| j        |<   |                      |¦  «         |S )Nç        )ri   r/   rH   rJ   ru   Úinstance_idÚlast_update_timestamp_ms)r5   Údefault_spawn_xÚdefault_spawn_yr   r   r!   rv   )	r&   ri   r/   rH   rJ   r*   Úspawn_xÚspawn_yÚlocs	            r'   rl   zZoneEngine.spawn_player²   sŠ   € ð �}Š}˜WÑ%Ô%ˆØ�}�!�!¨$Ô*>ˆØ�}�!�!¨$Ô*>ˆåØØØØØØÝ%+¡X¤Xð
ñ 
ô 
ˆð ,/ˆÔ˜iÑ(Ø×#Ò# IÑ.Ô.Ð.Øˆ
r)   Únew_xÚnew_yc                óD  — |                       |¦  «        }|                      |j        ¦  «        }|j        dz  }|j        dz  }t          |¦  «        |k    st          |¦  «        |k    rdd|j        › d|d›d|d›d�fS ||_        ||_        t          ¦   «         |_
        dS )	Ng       @Fu%   VÆ°á»£t quÃ¡ ranh giá»›i báº£n Ä‘á»“ u    (Tá»�a Ä‘á»™: x=z.1fz, y=ú))TÚ )rm   r5   r/   Úbounds_widthÚbounds_heightÚabsr]   rH   rJ   r   rz   )r&   ri   r€   r�   r   r*   Úhalf_wÚhalf_hs           r'   Úupdate_player_positionz!ZoneEngine.update_player_positionÆ   sµ   € ð ×&Ò& yÑ1Ô1ˆØ�}Š}˜Sœ[Ñ)Ô)ˆàÔ" SÑ(ˆØÔ# cÑ)ˆåˆu‰:Œ:˜ÒÐ¥# e¡*¤*¨vÒ"5Ð"5ØÐyÀ$Ä)ÐyÐyÐ^cÐyÐyÐyÐmrÐyÐyÐyÐyÐyÐyàˆŒØˆŒÝ'-¡x¤xˆÔ$Øˆxr)   Ú	current_xÚ	current_yc                óˆ  — |                       |¦  «        }|                      |j        ¦  «        }|                      |¦  «        }t	          ¦   «         }|j                             ¦   «         D ]U\  }}	t          |||	j        |	j	        |	j
        ¦  «        r.||vr*|                     |¦  «         |                     |¦  «         ŒV|S )zKChecks if the player is within range of any locked waypoint and unlocks it.)rm   r5   r/   rv   rp   rL   Úitemsr   rH   rJ   Údiscovery_radiusrr   )
r&   ri   r‹   rŒ   r   r*   Úunlocked_setÚnewly_discoveredÚwp_idrO   s
             r'   Úcheck_waypoint_proximityz#ZoneEngine.check_waypoint_proximityÛ   sÁ   € ð ×&Ò& yÑ1Ô1ˆØ�}Š}˜Sœ[Ñ)Ô)ˆØ×2Ò2°9Ñ=Ô=ˆÝ%(¡U¤UÐàœ×-Ò-Ñ/Ô/ð 	0ð 	0‰IˆE�2Ý" 9¨i¸¼¸r¼tÀRÔEXÑYÔYð 0Ø Ð,Ð,Ø ×$Ò$ UÑ+Ô+Ð+Ø$×(Ò(¨Ñ/Ô/Ð/øàÐr)   Útarget_waypoint_idc                óœ  — |                       |¦  «        }||vrdd|› d�fS d}| j                             ¦   «         D ]}||j        v r|j        |         } nŒ|sdd|› d�fS |                      |¦  «        }|j        |_        |j        |_        |j        |_        |j        |_        d|_	        t          ¦   «         |_        dd|j        › d	�fS )
z)Teleports player to an unlocked waypoint.Fu'   ChÆ°a kÃ­ch hoáº¡t Trá»¥ Tháº§n HÃ nh 'z'!Nu'   KhÃ´ng tÃ¬m tháº¥y Trá»¥ Tháº§n HÃ nh 'ú'.Tu$   Dá»‹ch chuyá»ƒn thÃ nh cÃ´ng Ä‘áº¿n ú.)rv   r   rM   rL   rm   r/   rH   rJ   ru   ry   r   rz   r]   )r&   ri   r”   ÚunlockedÚ	target_wpru   r   s          r'   Úteleport_via_waypointz ZoneEngine.teleport_via_waypointì   s  € à×.Ò.¨yÑ9Ô9ˆØ XÐ-Ð-ØÐZÐDVÐZÐZÐZÐZÐZà(,ˆ	Ø”×"Ò"Ñ$Ô$ð 	ð 	ˆAØ! Q¤[Ð0Ð0ØœKÐ(:Ô;�	Ø�ð 1ð ð 	[ØÐZÐDVÐZÐZÐZÐZÐZà×&Ò& yÑ1Ô1ˆØÔ'ˆŒØ”ˆŒØ”ˆŒØ”ˆŒØˆŒÝ'-¡x¤xˆÔ$ØÐM¸I¼NÐMÐMÐMÐMÐMr)   é   Ú	portal_idÚplayer_levelr[   Úcompleted_questsúOptional[Set[str]]úTuple[bool, str, str]c                óì  — |                       |¦  «        }|                      |j        ¦  «        }||j        vr	ddd|› d�fS |j        |         }||j        k     rddd|› d|j        › d�fS |j        r|�	|j        |vrddd	|j        › d
�fS |j        |_        |j        |_        |j	        |_
        d|_        t          ¦   «         |_        |                      |j        ¦  «        }d|j        d|j        › d�fS )zn
        Traverses a zone boundary portal.
        Returns: (success, target_zone_id, status_message)
        Fr„   u2   KhÃ´ng tÃ¬m tháº¥y Lá»‘i Qua VÃ¹ng Ä�áº¥t Cháº¿t 'u!   ' trong báº£n Ä‘á»“ hiá»‡n táº¡i.u%   ChÆ°a Ä‘áº¡t cáº¥p Ä‘á»™ yÃªu cáº§u (ú/u   ) Ä‘á»ƒ vÃ o khu vá»±c nÃ y!Nu.   Cáº§n hoÃ n thÃ nh nhiá»‡m vá»¥ tiá»�n Ä‘á»� 'u"   ' Ä‘á»ƒ má»Ÿ phong áº¥n lá»‘i qua!Tõ   BÆ°á»›c vÃ o u    thÃ nh cÃ´ng.)rm   r5   r/   ÚportalsÚ	min_levelÚrequired_quest_idÚtarget_zone_idÚtarget_xrH   Útarget_yrJ   ry   r   rz   r]   )	r&   ri   rœ   r�   rž   r   Úcurrent_zoneÚportalÚtarget_zones	            r'   Útraverse_portalzZoneEngine.traverse_portal  sZ  € ð ×&Ò& yÑ1Ô1ˆØ—}’} S¤[Ñ1Ô1ˆà˜LÔ0Ð0Ð0Ø˜"ÐÐS\ÐÐÐÐÐàÔ% iÔ0ˆà˜&Ô*Ò*Ð*Ø˜"ð  DÀlð  Dð  DÐU[ÔUeð  Dð  Dð  Dð  Dð  DàÔ#ð 	LÐ)9Ð)AÀVÔE]ÐeuÐEuÐEuØ˜"ð  LÈvÔOgð  Lð  Lð  Lð  Lð  LàÔ+ˆŒØ”ˆŒØ”ˆŒØˆŒÝ'-¡x¤xˆÔ$à—m’m FÔ$9Ñ:Ô:ˆØ�VÔ*Ð,\¸KÔ<LÐ,\Ð,\Ð,\Ð\Ð\r)   Ú	leader_idÚmembersú	List[str]Úleader_levelú+Tuple[bool, Optional[InstanceSession], str]c                óî  ‡— || j         vr	ddd|› d�fS | j         |         }||j        k     rddd|j        › d|j        › d�fS |j        r|j        |vrddd|j        › d	�fS ‰gˆfd
„|D ¦   «         z   }t	          |¦  «        |j        k    rdddt	          |¦  «        › d|j        › d�fS d|› dt          j        ¦   «         j        dd…         › �}d|› �}	t          |||	‰|d|j
        |j        |j        t          ¦   «         t          d¬¦  «        ¬¦  «        }
|
| j        |<   |D ]F}|                      |¦  «        }|	|_        ||_        d|_        d|_        t          ¦   «         |_        ŒGd|
d|j        › d�fS )z3Creates an authoritative isolated dungeon instance.FNu%   KhÃ´ng tÃ¬m tháº¥y máº«u phÃ³ báº£n 'r–   u   ChÆ°a Ä‘áº¡t cáº¥p Ä‘á»™ u    Ä‘á»ƒ má»Ÿ r—   u!   Cáº§n hoÃ n thÃ nh nhiá»‡m vá»¥ 'u   ' trÆ°á»›c khi tham chiáº¿n.c                ó    •— g | ]
}|‰k    ¯|‘ŒS © rµ   )Ú.0Úmr®   s     €r'   ú
<listcomp>z6ZoneEngine.create_dungeon_instance.<locals>.<listcomp>>  s   ø€ Ð$JÐ$JÐ$J¨1¸1À	º>¸> Q¸>¸>¸>r)   u   Sá»‘ lÆ°á»£ng ngÆ°á»�i chÆ¡i (u   ) vÆ°á»£t quÃ¡ giá»›i háº¡n (z).Úinst_Ú_é   Úzone_r›   r,   r-   )ry   r:   Úinstance_zone_idÚleader_player_idÚmember_player_idsÚcurrent_layerÚ
max_layersÚlives_remainingÚtime_limit_secÚstart_timestamp_msÚspatial_gridrx   Tu   Khai má»Ÿ phÃ³ báº£n u    thÃ nh cÃ´ng!)r   r¥   r]   r¦   ÚlenÚmax_party_sizeÚuuidÚuuid4Úhexr   rÁ   Úrevive_livesrÃ   r   r	   r#   rm   r/   ry   rH   rJ   rz   )r&   r:   r®   r¯   r±   rž   ÚtmplÚall_membersry   r½   ÚsessionÚpr   s     `          r'   Úcreate_dungeon_instancez"ZoneEngine.create_dungeon_instance*  s  ø€ ð ˜dÔ4Ð4Ð4Ø˜$Ð WÈÐ WÐ WÐ WÐWÐWàÔ% kÔ2ˆà˜$œ.Ò(Ð(Ø˜$Ð d¸D¼NÐ dÐ dÐX\ÔXaÐ dÐ dÐ dÐdÐdàÔ!ð 	y dÔ&<ÐDTÐ&TÐ&TØ˜$Ð xÀDÔDZÐ xÐ xÐ xÐxÐxà �kÐ$JÐ$JÐ$JÐ$J°Ð$JÑ$JÔ$JÑJˆÝˆ{ÑÔ˜dÔ1Ò1Ð1Ø˜$ð  !HÅÀ[ÑAQÔAQð  !Hð  !HÐptô  qDð  !Hð  !Hð  !Hð  Hð  HàB˜kÐBÐB­D¬J©L¬LÔ,<¸R¸a¸RÔ,@ÐBÐBˆØ0 ;Ð0Ð0Ðå!Ø#Ø#Ø-Ø&Ø%ØØ”Ø Ô-ØÔ.Ý%™xœxÝ$¨tÐ4Ñ4Ô4ð
ñ 
ô 
ˆð .5ˆÔ˜kÑ*àð 	4ð 	4ˆAØ×*Ò*¨1Ñ-Ô-ˆCØ*ˆCŒKØ)ˆCŒOØˆCŒEØˆCŒEÝ+1©8¬8ˆCÔ(Ð(à�WÐO°d´iÐOÐOÐOÐOÐOr)   ry   úTuple[int, bool]c                óø   — || j         vrt          d|› d�¦  «        ‚| j         |         }|j        |j        k    rd|_        |j        dfS |xj        dz  c_        |j        |j        k    }|rd|_        |j        |fS )zk
        Advances the instance to the next floor/layer.
        Returns: (new_layer, is_completed)
        z
Instance 'r<   Tr›   )r#   r3   rÀ   rÁ   Úis_completed)r&   ry   rÎ   Úis_dones       r'   Úadvance_instance_layerz!ZoneEngine.advance_instance_layer^  s¢   € ð
 ˜dÔ3Ð3Ð3ÝÐA¨ÐAÐAÐAÑBÔBÐBàÔ'¨Ô4ˆØÔ  GÔ$6Ò6Ð6Ø#'ˆGÔ ØÔ(¨$Ð.Ð.àÐÔ Ñ"ÐÔØÔ(¨GÔ,>Ò>ˆØð 	(Ø#'ˆGÔ àÔ$ gÐ-Ð-r)   c                óò   — || j         vrdS | j                              |¦  «        }t          ¦   «         }|j        D ];}|| j        v r0| j        |         }d|_        d|_        d|_        d|_        ||_	        Œ<dS )zJEvacuates all members back to sanctuary and destroys the instance session.Nrk   rx   )
r#   Úpopr   Úall_playersr!   r/   ry   rH   rJ   rz   )r&   ry   rÎ   Úcurrent_time_msrÏ   r   s         r'   Úclose_instancezZoneEngine.close_instancer  s�   € à˜dÔ3Ð3Ð3ØˆFàÔ'×+Ò+¨KÑ8Ô8ˆÝ ™(œ(ˆØÔ$ð 	?ð 	?ˆAØ�DÔ)Ð)Ð)ØÔ+¨AÔ.�Ø8�”Ø"&�”Ø�”Ø�”Ø/>�Ô,øð	?ð 	?r)   Úparent_zone_idÚportal_xÚportal_yÚlifespan_secú0Tuple[bool, Optional[SecretChamberSession], str]c                óX  — || j         vr	ddd|› d�fS | j         |         }|�|n|j        }t          ¦   «         }	d|› dt          j        ¦   «         j        dd…         › �}
d|› �}t          |
|||||||	|	|d	z  z   d
d
dt          d¬¦  «        ¬¦  «        }|| j        |
<   d
|d|j	        › d�fS )zLDynamically spawns a secret chamber portal upon satisfying cryptic criteria.FNu'   KhÃ´ng tÃ¬m tháº¥y máº«u máº­t tháº¥t 'r–   Úchamber_rº   r»   r¼   iè  Tr,   r-   )Ú
chamber_idr:   Úchamber_zone_idri   Úportal_zone_idrÜ   rÝ   Úspawn_timestamp_msÚcollapse_timestamp_msÚ	is_activeÚis_discoveredÚ
is_clearedrÅ   u&   Ká»³ ngá»™ xuáº¥t hiá»‡n: Cá»•ng vÃ o u    Ä‘Ã£ khai má»Ÿ!)
r    rÞ   r   rÈ   rÉ   rÊ   r   r	   r$   r]   )r&   r:   ri   rÛ   rÜ   rÝ   rÞ   rÌ   ÚdurationÚcurrent_now_msrâ   rã   rÎ   s                r'   Úspawn_secret_chamberzZoneEngine.spawn_secret_chamber†  sÿ   € ð ˜dÔ;Ð;Ð;Ø˜$Ð YÈ+Ð YÐ YÐ YÐYÐYàÔ,¨[Ô9ˆØ#/Ð#;�<�<ÀÔARˆÝ™œˆàD ÐDÐD­d¬j©l¬lÔ.>¸rÀ¸rÔ.BÐDÐDˆ
Ø/ +Ð/Ð/ˆå&Ø!Ø#Ø+ØØ)ØØØ-Ø"0°H¸t±OÑ"DØØØÝ$¨tÐ4Ñ4Ô4ð
ñ 
ô 
ˆð 3:ˆÔ# JÑ/à�WÐbÀtÄyÐbÐbÐbÐbÐbr)   râ   c                óŒ  — || j         vrdS | j         |         }t          ¦   «         }||j        k    s|j        s|                      |¦  «         dS |j        |k    rdS |                      |¦  «        }|j        |_        |j	        |_
        d|_        d|_        ||_        |                      |j        ¦  «        }dd|j        › d�fS )z?Player steps through the secret portal into the secret chamber.)Fu?   Cá»•ng máº­t tháº¥t khÃ´ng tá»“n táº¡i hoáº·c Ä‘Ã£ sá»¥p Ä‘á»•!)Fu;   Máº­t tháº¥t Ä‘Ã£ sá»¥p Ä‘á»•, lá»‘i vÃ o Ä‘Ã£ khÃ©p láº¡i!)FuW   CÆ¡ duyÃªn máº­t tháº¥t nÃ y chá»‰ dÃ nh riÃªng cho ngÆ°á»�i há»¯u duyÃªn kÃ­ch hoáº¡t!rx   Tr£   u8    thÃ nh cÃ´ng. HÃ£y nhanh chÃ³ng tÃ¬m kiáº¿m cÆ¡ duyÃªn!)r$   r   ræ   rç   Úcollapse_secret_chamberri   rm   rã   r/   râ   ry   rH   rJ   rz   r@   r:   r]   )r&   ri   râ   Úchamberrë   r   rÌ   s          r'   Úenter_secret_chamberzZoneEngine.enter_secret_chamber­  sÜ   € à˜TÔ8Ð8Ð8Ø[Ð[àÔ-¨jÔ9ˆÝ™œˆà˜WÔ:Ò:Ð:À'ÔBSÐ:Ø×(Ò(¨Ñ4Ô4Ð4ØWÐWàÔ 	Ò)Ð)ØsÐsà×&Ò& yÑ1Ô1ˆØÔ-ˆŒØ!Ô,ˆŒØˆŒØˆŒØ'5ˆÔ$à×/Ò/°Ô0CÑDÔDˆØÐh T¤YÐhÐhÐhÐhÐhr)   c                ó^   — || j         vrdS | j         |         }|j        |k    rdS d|_        dS )z0Marks the secret chamber objective as completed.)Fu    Máº­t tháº¥t khÃ´ng tá»“n táº¡i!)Fu,   KhÃ´ng pháº£i chá»§ sá»Ÿ há»¯u máº­t tháº¥t!T)Tu/   Khai má»Ÿ trá»�n váº¹n cÆ¡ duyÃªn máº­t tháº¥t!)r$   ri   ré   )r&   ri   râ   rï   s       r'   Úcomplete_secret_chamberz"ZoneEngine.complete_secret_chamberÆ  sE   € à˜TÔ8Ð8Ð8Ø<Ð<àÔ-¨jÔ9ˆØÔ 	Ò)Ð)ØHÐHà!ˆÔØFÐFr)   c                ó  — || j         vrdS | j                              |¦  «        }d|_        |j        }|| j        v rM| j        |         }|j        |_        d|_        |j        |_	        |j
        |_        t          ¦   «         |_        dS dS )zUCollapses the secret chamber and returns the player back to the parent zone entrance.NF)r$   r×   rç   ri   r!   rä   r/   ry   rÜ   rH   rÝ   rJ   r   rz   )r&   râ   rï   ri   r   s        r'   rî   z"ZoneEngine.collapse_secret_chamberÒ  s•   € à˜TÔ8Ð8Ð8ØˆFàÔ-×1Ò1°*Ñ=Ô=ˆØ!ˆÔàÔ%ˆ	Ø˜Ô-Ð-Ð-ØÔ'¨	Ô2ˆCØ!Ô0ˆCŒKØ"ˆCŒOØÔ$ˆCŒEØÔ$ˆCŒEÝ+1©8¬8ˆCÔ(Ð(Ð(ð .Ð-r)   )r   r   )r*   r   r   r   )r/   r1   r   r   )r/   r1   r   r6   )r:   r1   r   r   )r:   r1   r   r   )r/   r1   r   rA   )r/   r1   rH   rI   rJ   rI   r   rA   )FNNNN)r/   r1   rQ   rA   rH   rR   rJ   rR   rS   rT   rU   rT   r   rV   )ri   r1   r   r   )ri   r1   r   rn   )NN)
ri   r1   r/   r1   rH   rR   rJ   rR   r   r   )ri   r1   r€   rI   r�   rI   r   rV   )ri   r1   r‹   rI   rŒ   rI   r   rn   )ri   r1   r”   r1   r   rV   )r›   N)
ri   r1   rœ   r1   r�   r[   rž   rŸ   r   r    )r:   r1   r®   r1   r¯   r°   r±   r[   rž   rn   r   r²   )ry   r1   r   rÑ   )ry   r1   r   r   r   )r:   r1   ri   r1   rÛ   r1   rÜ   rI   rÝ   rI   rÞ   rT   r   rß   )ri   r1   râ   r1   r   rV   )râ   r1   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r0   r5   r9   r>   r@   rG   rP   rh   rm   rv   rl   rŠ   r“   rš   r­   rÐ   rÕ   rÚ   rì   rð   rò   rî   rµ   r)   r'   r   r   1   sF  € € € € € ðð ð5ð 5ð 5ð 5ð&Lð Lð Lð Lð#ð #ð #ð #ð
'ð 'ð 'ð 'ð3ð 3ð 3ð 3ð
:ð :ð :ð :ð
kð kð kð kðð ð ð ð eiØ6:ðcð cð cð cð cðB0ð 0ð 0ð 0ð
9ð 9ð 9ð 9ð ]aðð ð ð ð ð(ð ð ð ð* ð  ð  ð  ð"Nð Nð Nð Nð: mqð]ð ]ð ]ð ]ð ]ðD2Pð 2Pð 2Pð 2Pðh.ð .ð .ð .ð(?ð ?ð ?ð ?ð6 '+ð%cð %cð %cð %cð %cðNið ið ið ið2
Gð 
Gð 
Gð 
Gð4ð 4ð 4ð 4ð 4ð 4r)   r   ) r÷   Ú
__future__r   rÈ   Útypingr   r   r   r   r   Úserver.world.spatial_gridr	   Úserver.common.math_utilsr
   r   Úserver.common.time_utilsr   Úserver.world.zone_typesr   r   r   r   r   r   r   r   r   r   Úserver.world.zone_catalogr   Ú__all__r   rµ   r)   r'   ú<module>r      sl  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð MÐ LÐ LÐ LÐ LÐ Lðð ð €ðp4ð p4ð p4ð p4ð p4ñ p4ô p4ð p4ð p4ð p4r)   