§
    $¿j�  ã                  ó�   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZmZmZ ddlmZmZ  G d„ d¦  «        Z G d„ d	¦  «        ZdS )
zI
TeleportService and TownPortalEngine reference engines for E2E testing.
é    )ÚannotationsN)ÚDictÚOptionalÚTuple)ÚInterruptReasonÚ
TargetTypec                  óP   — e Zd ZdZd%d„Zd&d'd„Zd(d)d„Zd(d*d„Zd+d„Zd,d!„Z	d-d#„Z
d$S ).ÚTeleportServicezPSafe Teleportation with 3.5s cast, move/damage interrupt, and 5-gate validation.ÚreturnÚNonec                óL   — || _         || _        || _        i | _        i | _        d S ©N)Úparty_serviceÚsocial_serviceÚguild_serviceÚactive_channelsÚzone_states)Úselfr   r   r   s       úCC:\Projects\FreeExile\tests\e2e_social_party\test_harness_portal.pyÚ__init__zTeleportService.__init__   s0   € Ø*ˆÔØ,ˆÔØ*ˆÔØ:<ˆÔØ68ˆÔÐÐó    Fé   é   TÚzone_idÚstrÚis_boss_activeÚboolÚis_secret_activeÚplayer_countÚintÚmax_capacityÚ	is_activec                ó&   — |||||dœ| j         |<   d S )N)r   r   r   r!   r"   )r   )r   r   r   r   r   r!   r"   s          r   Úset_zone_statezTeleportService.set_zone_state   s*   € à,ÐBRØ(¸,ÐU^ð%
ð %
ˆÔ˜Ñ!Ð!Ð!r   Ú	player_idÚ	target_idÚtarget_typer   Útarget_zone_idÚtarget_aliveúTuple[bool, str]c                ó¸  ‡— |sdS |t           j        k    rP| j        j                             |¦  «        }|r| j        j                             |¦  «        nd }|r	‰|j        vrdS ny|t           j        k    r| j         	                    |‰¦  «        sdS nK|t           j
        k    r;t          ˆfd„| j        j                             ¦   «         D ¦   «         ¦  «        }|sdS | j                             |dddd	œ¦  «        }	|	d
         |	d         k    rdS |	                     dd¦  «        sdS |	                     dd¦  «        rdS |	                     dd¦  «        rdS dS )N)Fu.   GATE_1_TARGET_DEAD: Má»¥c tiÃªu Ä‘Ã£ tá»­ vong)Fu:   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng cÃ¹ng tá»• Ä‘á»™i)FuI   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng náº±m trong danh sÃ¡ch báº¡n bÃ¨c              3  ó8   •K  — | ]}|D ]}|j         ‰k    V — ŒŒd S r   )r%   )Ú.0ÚrosterÚmr&   s      €r   ú	<genexpr>z?TeleportService.validate_destination_5_gates.<locals>.<genexpr>)   s9   øè è € ÐrÐr°VÐkqÐrÐrÐfg˜œ yÒ0ÐrÐrÐrÐrÐrÐrÐrr   )Fu9   GATE_2_RELATIONSHIP_UNAUTHORIZED: KhÃ´ng cÃ¹ng bang há»™ir   r   T)r   r!   r"   r   r!   )Fu>   GATE_3_CAPACITY_EXCEEDED: Khu vá»±c Ä‘Ã£ Ä‘áº§y ngÆ°á»�i chÆ¡ir"   )FuA   GATE_4_LIFECYCLE_CLOSED: Khu vá»±c Ä‘Ã£ Ä‘Ã³ng hoáº·c háº¿t háº¡nr   F)Fu>   GATE_5_QUARANTINE_BOSS: Ä�ang trong giao tranh Boss nguy cáº¥pr   )FuC   GATE_5_QUARANTINE_SECRET: Máº­t tháº¥t thá»­ thÃ¡ch Ä‘ang diá»…n ra)TÚSUCCESS)r   ÚPARTY_MEMBERr   Úplayer_party_mapÚgetÚpartiesÚmembersÚFRIENDr   Ú	is_friendÚ	GUILDMATEÚanyr   ÚguildsÚvaluesr   )
r   r%   r&   r'   r(   r)   Úp_idÚpartyÚfoundÚzs
     `       r   Úvalidate_destination_5_gatesz,TeleportService.validate_destination_5_gates   s   ø€ àð 	KØJÐJà�*Ô1Ò1Ð1ØÔ%Ô6×:Ò:¸9ÑEÔEˆDØ<@ÐJ�DÔ&Ô.×2Ò2°4Ñ8Ô8Ð8ÀdˆEØð [˜I¨U¬]Ð:Ð:ØZÐZð ;à�JÔ-Ò-Ð-ØÔ&×0Ò0°¸IÑFÔFð jØiÐiðjà�JÔ0Ò0Ð0ÝÐrÐrÐrÐr¸tÔ?QÔ?X×?_Ò?_Ñ?aÔ?aÐrÑrÔrÑrÔrˆEØð ZØYÐYàÔ× Ò  À!ÐUVÐeiÐ1jÐ1jÑkÔkˆØˆ^Ô  .Ô 1Ò1Ð1ØZÐZà�uŠu�[ $Ñ'Ô'ð 	^Ø]Ð]à�5Š5Ð! 5Ñ)Ô)ð 	[ØZÐZØ�5Š5Ð# UÑ+Ô+ð 	`Ø_Ð_Øˆr   c                óä   — |                       |||||¦  «        \  }}|sd|fS d|› dt          t          j        ¦   «         dz  ¦  «        › �}|t          j        ¦   «         d|||dœ| j        |<   d|fS )NFÚchan_Ú_éè  g      @)Ú
channel_idÚ
start_timeÚ	cast_timer&   r'   r(   T)rA   r    Útimer   )	r   r%   r'   r&   r(   r)   ÚokÚreasonrF   s	            r   Ústart_teleport_channelz&TeleportService.start_teleport_channel:   s“   € Ø×6Ò6°yÀ)È[ÐZhÐjvÑwÔw‰
ˆˆFØð 	!Ø˜&�=Ð Ø@˜YÐ@Ð@­­T¬Y©[¬[¸Ñ-=Ñ)>Ô)>Ð@Ð@ˆ
à$µD´I±K´KÈcØ"°;ÐR`ð+
ð +
ˆÔ˜YÑ'ð �ZÐÐr   ÚmagÚfloatúOptional[InterruptReason]c                óL   — || j         v r|dk    r| j         |= t          j        S d S )Ngš™™™™™©?)r   r   ÚINTERRUPT_MOVEMENT)r   r%   rM   s      r   Úon_player_movedzTeleportService.on_player_movedE   s1   € Ø˜Ô,Ð,Ð,°°t²°ØÔ$ YÐ/Ý"Ô5Ð5Øˆtr   Údamagec                óL   — || j         v r|dk    r| j         |= t          j        S d S )Ng        )r   r   ÚINTERRUPT_DAMAGE)r   r%   rS   s      r   Úon_player_damagedz!TeleportService.on_player_damagedK   s1   € Ø˜Ô,Ð,Ð,°¸#²°ØÔ$ YÐ/Ý"Ô3Ð3Øˆtr   Úelapsed_timec                ó~   — | j                              |¦  «        }|sdS ||d         k     rdS | j         |= d|d         fS )N)FÚNO_ACTIVE_CHANNELrH   )FÚCAST_INCOMPLETETr(   )r   r4   )r   r%   rW   Úchans       r   Úcomplete_channelz TeleportService.complete_channelQ   sX   € ØÔ#×'Ò'¨	Ñ2Ô2ˆØð 	.Ø-Ð-Ø˜$˜{Ô+Ò+Ð+Ø+Ð+ØÔ  Ð+Ø�TÐ*Ô+Ð+Ð+r   N©r   r   )FFr   r   T)r   r   r   r   r   r   r   r    r!   r    r"   r   r   r   )T)r%   r   r&   r   r'   r   r(   r   r)   r   r   r*   )r%   r   r'   r   r&   r   r(   r   r)   r   r   r*   )r%   r   rM   rN   r   rO   )r%   r   rS   rN   r   rO   )r%   r   rW   rN   r   r*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   rA   rL   rR   rV   r\   © r   r   r
   r
      sµ   € € € € € ØZÐZð9ð 9ð 9ð 9ð
ð 
ð 
ð 
ð 
ðð ð ð ð ð>	 ð 	 ð 	 ð 	 ð 	 ðð ð ð ðð ð ð ð,ð ,ð ,ð ,ð ,ð ,r   r
   c                  óR   — e Zd ZdZd d„Zd!d"d„Zd#d„Zd$d%d„Zd&d'd„Zd(d„Z	d)d*d„Z
dS )+ÚTownPortalEnginezKPoE2 2-Way Town Portal Engine with 6 portal charges, Boss & Puzzle lockout.r   r   c                ó>   — i | _         i | _        i | _        i | _        d S r   )ÚportalsÚmap_chargesÚboss_activeÚsecret_active)r   s    r   r   zTownPortalEngine.__init__^   s'   € Ø24ˆŒØ+-ˆÔØ,.ˆÔØ.0ˆÔÐÐr   FÚinstance_idr   rh   r   ri   c                ó.   — || j         |<   || j        |<   d S r   )rh   ri   )r   rj   rh   ri   s       r   Úset_encounter_statez$TownPortalEngine.set_encounter_stated   s"   € Ø(3ˆÔ˜Ñ%Ø*7ˆÔ˜;Ñ'Ð'Ð'r   r   r*   c                óz   — | j                              |d¦  «        rdS | j                             |d¦  «        rdS dS )NF)TuS   QUARANTINE_BOSS_ENGAGED: Cáº¥m má»Ÿ cá»•ng/trá»‘n thoÃ¡t khi Boss Ä‘ang giao tranh!)Tue   QUARANTINE_SECRET_CHAMBER: Máº­t tháº¥t Ä‘áº¿m ngÆ°á»£c Ä‘ang kÃ­ch hoáº¡t, khÃ´ng thá»ƒ má»Ÿ cá»•ng!)FÚUNLOCKED)rh   r4   ri   )r   r   rj   s      r   Úcheck_quarantine_lockz&TownPortalEngine.check_quarantine_lockh   sR   € ØÔ×Ò ¨UÑ3Ô3ð 	oØnÐnØÔ×!Ò! +¨uÑ5Ô5ð 	Að Að  AØ Ð r   Úzone_player_hideoutr%   ÚwxrN   ÚwyÚhub_zoneúTuple[bool, str, Optional[str]]c                óÂ   — |                       ||¦  «        \  }}|rd|d fS d|› dt          t          j        ¦   «         dz  ¦  «        › �}	||||||ddœ| j        |	<   dd|	fS )NFÚtp_rD   rE   T)r%   Úorigin_zonerj   Úorigin_xÚorigin_yrs   r"   r1   )ro   r    rI   rf   )
r   r%   r   rj   rq   rr   rs   Ú	is_lockedÚerrÚ	portal_ids
             r   Úrequest_town_portalz$TownPortalEngine.request_town_portalo   sŠ   € Ø×3Ò3°G¸[ÑIÔI‰ˆ	�3Øð 	$Ø˜#˜tÐ#Ð#Ø=˜)Ð=Ð=¥c­$¬)©+¬+°dÑ*:Ñ&;Ô&;Ð=Ð=ˆ	à"°7È;Ø¨¸Ètð#
ð #
ˆŒ�YÑð �Y 	Ð)Ð)r   r   Úinitial_chargesr    c                ó   — || j         |<   d S r   )rg   )r   rj   r~   s      r   Úregister_astral_map_devicez+TownPortalEngine.register_astral_map_devicez   s   € Ø(7ˆÔ˜Ñ%Ð%Ð%r   úTuple[bool, str, int]c                ó‚   — | j                              |d¦  «        }|dk    rdS |dz
  | j         |<   dd| j         |         fS )Nr   )FuR   MAP_SEALED: Háº¿t lÆ°á»£t cá»•ng (0/6). Báº£n Ä‘á»“ Ä‘Ã£ phong tá»�a vÄ©nh viá»…n!r   r   TÚENTER_SUCCESS)rg   r4   )r   rj   Úchargess      r   Úenter_map_portalz!TownPortalEngine.enter_map_portal}   sO   € ØÔ"×&Ò& {°AÑ6Ô6ˆØ�aŠ<ˆ<ØqÐqØ(/°!©ˆÔ˜Ñ%Ø�_ dÔ&6°{Ô&CÐCÐCr   Úis_map_instancec                óL  — |rO| j                              |d¦  «        }|dk    r|dz
  | j         |<   dd| j                              |d¦  «        › d�fS d}t          | j                             ¦   «         ¦  «        D ]#\  }}|d         |k    r|d         r
d|d<   |dz  }Œ$dd	|› d
�fS )Nr   r   Tu&   MAP_DEATH_CONSUMED_PORTAL: CÃ²n láº¡i u    lÆ°á»£tr%   r"   FÚWILDERNESS_DEATH_CLOSED_Ú_PORTALS)rg   r4   Úlistrf   Úitems)	r   r%   r   rj   r†   r„   ÚclosedÚpidÚps	            r   Úon_player_deathz TownPortalEngine.on_player_death„   sÙ   € Øð 	qØÔ&×*Ò*¨;¸Ñ:Ô:ˆGØ˜Š{ˆ{Ø07¸!±�Ô  Ñ-ØÐpÀ$ÔBR×BVÒBVÐWbÐdeÑBfÔBfÐpÐpÐpÐpÐpØˆÝ˜4œ<×-Ò-Ñ/Ô/Ñ0Ô0ð 	ð 	‰FˆC�Ø�Œ~ Ò*Ð*¨q°¬~Ð*Ø!&��+‘Ø˜!‘�øØÐ@°Ð@Ð@Ð@Ð@Ð@r   Nr]   )FF)rj   r   rh   r   ri   r   r   r   )r   r   rj   r   r   r*   )rp   )r%   r   r   r   rj   r   rq   rN   rr   rN   rs   r   r   rt   )r   )rj   r   r~   r    r   r   )rj   r   r   r�   )F)
r%   r   r   r   rj   r   r†   r   r   r*   )r^   r_   r`   ra   r   rl   ro   r}   r€   r…   r�   rb   r   r   rd   rd   [   sÅ   € € € € € ØUÐUð1ð 1ð 1ð 1ð8ð 8ð 8ð 8ð 8ð!ð !ð !ð !ð	*ð 	*ð 	*ð 	*ð 	*ð8ð 8ð 8ð 8ð 8ðDð Dð Dð DðAð Að Að Að Að Að Ar   rd   )ra   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrI   Útypingr   r   r   Ú*tests.e2e_social_party.test_harness_modelsr   r   r
   rd   rb   r   r   ú<module>r™      sé   ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RðM,ð M,ð M,ð M,ð M,ñ M,ô M,ð M,ð`4Að 4Að 4Að 4Að 4Añ 4Aô 4Að 4Að 4Að 4Ar   