§
    ±“»j×B  ã                  óÐ   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZ ddlmZm Z  d	Z!d
Z" G d„ d¦  «        Z#dS )a¶  
Authoritative Endgame Atlas Engine for FreeExile.
Manages:
1. Transition from Basic Campaign Quests to Endgame Phase.
2. Infinite Procedural World Map (Atlas) Node Graph generation.
3. Deterministic Frontier Expansion upon clearing maps.
4. Procedural Map Content Encounter rolling (1 to 5 random contents per node).
5. Integration with Hideout 6-Portal Map Device.
6. Server-Authoritative traversal rules and Atlas Passive progression.
é    )ÚannotationsN)ÚDictÚListÚOptionalÚTupleÚSetÚAny)ÚEndGameStatusÚMapBiomeTypeÚContentTypeÚMapNodeStatusÚ
MapContentÚMapNodeÚAtlasWorldState)ÚALL_CONTENT_TYPESÚCONTENT_DEFINITIONSÚBIOME_METADATAÚAFFIX_POOL_BY_TIERÚ calculate_content_count_for_tier)ÚHideoutEngineÚ	AstralMap)ÚQuestEngineÚQuestStatusé
   Ú"quest_norm_05_khai_mo_van_gioi_cacc                  ót   — e Zd Zd1d„Zd2d„Zd3d„Zd4d„Zd5d6d„Zd7d„Zd7d„Z	d8d„Z
d9d„Zd:d*„Zd;d,„Z	 d5d<d0„ZdS )=ÚEndGameAtlasEngineÚquest_enginer   Úhideout_enginer   ÚreturnÚNonec                ó0   — || _         || _        i | _        d S ©N)r   r   Ú_player_atlases)Úselfr   r   s      ú:C:\Projects\FreeExile\server\world\endgame_atlas_engine.pyÚ__init__zEndGameAtlasEngine.__init__+   s"   € ð
 )ˆÔØ,ˆÔà;=ˆÔÐÐó    Ú	player_idÚstrÚboolc                óâ   — | j         j                             |d¦  «        }|t          k     rdS | j                              |t
          ¦  «        }|€dS |j        t          j        t          j	        fv S )zODetermines if the player has completed basic campaign quests to unlock endgame.é   F)
r   Ú_player_levelsÚgetÚCAMPAIGN_COMPLETION_MIN_LEVELÚget_player_questÚCAMPAIGN_COMPLETION_QUEST_IDÚstatusr   Ú	COMPLETEDÚCLAIMED)r%   r)   Ú
player_lvlÚ
q_progresss       r&   Úcheck_endgame_eligibilityz,EndGameAtlasEngine.check_endgame_eligibility5   so   € ð Ô&Ô5×9Ò9¸)ÀQÑGÔGˆ
ØÕ5Ò5Ð5Ø�5ð Ô&×7Ò7¸	ÕC_Ñ`Ô`ˆ
ØÐØ�5àÔ ¥[Ô%:½KÔ<OÐ$PÐPÐPr(   r
   c                óº   — | j                              |¦  «        }|r|j        rt          j        S |                      |¦  «        rt          j        S t          j        S )z6Returns the current Endgame Phase status for a player.)r$   r/   Úis_endgame_unlockedr
   ÚUNLOCKEDr8   ÚELIGIBLEÚLOCKED)r%   r)   Ústates      r&   Úget_endgame_statusz%EndGameAtlasEngine.get_endgame_statusC   s[   € àÔ$×(Ò(¨Ñ3Ô3ˆØð 	*�UÔ.ð 	*Ý Ô)Ð)à×)Ò)¨)Ñ4Ô4ð 	*Ý Ô)Ð)åÔ#Ð#r(   úOptional[AtlasWorldState]c                ó6   — | j                              |¦  «        S r#   )r$   r/   )r%   r)   s     r&   Úget_atlas_statez"EndGameAtlasEngine.get_atlas_stateN   s   € ØÔ#×'Ò'¨	Ñ2Ô2Ð2r(   NÚseedúOptional[int]r   c                ó  — |€&t          t          j        ¦   «         dz  ¦  «        dz  }t          |d|ddi ddt          t          j        ¦   «         dz  ¦  «        ¬¦	  «	        }|                      |¦  «         || j        |<   |S )zNUnlocks the Endgame Infinite World Map and generates the initial node cluster.Néè  i@B TÚ
node_d0_b0r   )	r)   r:   Ú
world_seedÚcurrent_origin_node_idÚunlocked_depthÚnodesÚtotal_maps_clearedÚatlas_passive_pointsÚcreated_timestamp_ms)ÚintÚtimer   Ú_generate_initial_clusterr$   )r%   r)   rC   Úatlas_states       r&   Úunlock_endgamez!EndGameAtlasEngine.unlock_endgameQ   s�   € àˆ<Ý•t”y‘{”{ TÑ)Ñ*Ô*¨YÑ6ˆDå%ØØ $ØØ#/ØØØ Ø!"Ý!$¥T¤Y¡[¤[°4Ñ%7Ñ!8Ô!8ð

ñ 

ô 

ˆð 	×&Ò& {Ñ3Ô3Ð3Ø*5ˆÔ˜YÑ'ØÐr(   Únode_idúDict[str, Any]c                ó2  — | j                              |¦  «        }|r|j        sdddœS |j                             |¦  «        }|sdddœS |j        t
          j        t
          j        fvrdd|j        j        › �dœS t          |j
        |j        t          d|j        ¦  «        |j        j                             ¦   «         |j        |j        |j        |j        |j        ¬¦	  «	        }| j                             ||¦  «        \  }}}|sd|dœS | j                             |¦  «        }	|j        t
          j        k    r*|                      |t
          j        ¦  «        }
|
|j        |<   ||_        d|t7          |¦  «        |	j        j        d	„ |j        D ¦   «         d
œS )zSActivates a map node, opening exactly 6 portals on the player's Hideout Map Device.FÚENDGAME_NOT_UNLOCKED©ÚsuccessÚerrorÚNODE_NOT_FOUNDÚNODE_NOT_ACCESSIBLE_é   )	Úmap_idÚnameÚtierÚzone_template_idÚitem_quantity_bonus_pctÚitem_rarity_bonus_pctÚmonster_pack_size_pctÚ	boss_nameÚaffixesTc                ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úto_dict)Ú.0Úcs     r&   ú
<listcomp>z8EndGameAtlasEngine.activate_map_node.<locals>.<listcomp>’   s    € Ð<Ð<Ð<¨˜Ÿš™œÐ<Ð<Ð<r(   )rY   rT   Úportals_openedÚinstance_idÚcontents)r$   r/   r:   rK   r3   r   Ú
ACCESSIBLEÚCLEAREDÚvaluer   rT   r_   Úminr`   ÚbiomeÚlowerrb   rc   Úpack_size_bonus_pctre   rf   r   Úactivate_map_deviceÚget_or_create_hideoutÚ_copy_node_with_statusÚIN_PROGRESSÚactive_node_idÚlenÚ
map_deviceÚactive_instance_idro   )r%   r)   rT   r>   ÚnodeÚ
astral_maprY   ÚmsgÚportalsÚhideoutÚupdated_nodes              r&   Úactivate_map_nodez$EndGameAtlasEngine.activate_map_nodeg   s¿  € àÔ$×(Ò(¨Ñ3Ô3ˆØð 	G˜EÔ5ð 	GØ$Ð/EÐFÐFÐFàŒ{�Š˜wÑ'Ô'ˆØð 	AØ$Ð/?Ð@Ð@Ð@àŒ;�}Ô7½Ô9NÐOÐOÐOØ$Ð/YÀdÄkÔFWÐ/YÐ/YÐZÐZÐZõ Ø”<Ø”Ý�R˜œÑ#Ô#Ø!œZÔ-×3Ò3Ñ5Ô5Ø$(Ô$@Ø"&Ô"<Ø"&Ô":Ø”nØ”Lð

ñ 

ô 

ˆ
ð !%Ô 3× GÒ GÈ	ÐS]Ñ ^Ô ^Ñˆ��gØð 	4Ø$¨sÐ3Ð3Ð3àÔ%×;Ò;¸IÑFÔFˆð Œ;�-Ô/Ò/Ð/Ø×6Ò6°t½]Ô=VÑWÔWˆLØ#/ˆEŒK˜Ñ à&ˆÔàØÝ! '™lœlØ"Ô-Ô@Ø<Ð<¨d¬mÐ<Ñ<Ô<ð
ð 
ð 	
r(   c                ó  — | j                              |¦  «        }|r|j        sdddœS |j                             |¦  «        }|sdddœS |j        t
          j        k    }|�s|                      |t
          j        t          t          j	        ¦   «         dz  ¦  «        ¬¦  «        |j        |<   |xj
        dz  c_
        |xj        dz  c_        t          |j        |j        dz   ¦  «        |_        |j        D ]e}|j                             |¦  «        }|rG|j        t
          j        t
          j        fv r(|                      |t
          j        ¦  «        |j        |<   Œf|                      ||¦  «         d|_        d	||rd
nd|j        |j
        dœS )zNMarks a map node as cleared, awards points, and expands the infinite frontier.FrW   rX   r[   rF   )Úcompleted_tsr-   NTr   )rY   rT   Úatlas_points_awardedrJ   Útotal_cleared)r$   r/   r:   rK   r3   r   rq   ry   rO   rP   rL   rM   ÚmaxrJ   ÚdepthÚconnected_node_idsÚUNREACHABLEÚ
DISCOVEREDrp   Ú_expand_infinite_frontierr{   )r%   r)   rT   r>   r   Úwas_already_clearedÚchild_idÚchilds           r&   Úcomplete_map_nodez$EndGameAtlasEngine.complete_map_node•   s·  € àÔ$×(Ò(¨Ñ3Ô3ˆØð 	G˜EÔ5ð 	GØ$Ð/EÐFÐFÐFàŒ{�Š˜wÑ'Ô'ˆØð 	AØ$Ð/?Ð@Ð@Ð@à#œ{­mÔ.CÒCÐØ"ñ 	8Ø#'×#>Ò#>Ø•mÔ+½#½d¼i¹k¼kÈDÑ>PÑ:QÔ:Qð $?ñ $ô $ˆEŒK˜Ñ ð Ð$Ô$¨Ñ)Ð$Ô$ØÐ&Ô&¨!Ñ+Ð&Ô&Ý#& uÔ';¸T¼ZÈ!¹^Ñ#LÔ#LˆEÔ ð !Ô3ð ið i�ØœŸš¨Ñ1Ô1�Øð i˜Uœ\­mÔ.GÍÔIaÐ-bÐbÐbØ,0×,GÒ,GÈÍ}ÔOgÑ,hÔ,h�E”K Ñ)øð ×*Ò*¨5°$Ñ7Ô7Ð7à#ˆÔàØØ)<Ð$C A AÀ!Ø#Ô2Ø"Ô5ð
ð 
ð 	
r(   r>   c                ó¤  — t          j        |j        ¦  «        }|j        }d„ t	          d¦  «        D ¦   «         }|                      |dddddt          |¦  «        t          j        |¬¦	  «	        }||j	        |<   g }t          |¦  «        D ]­\  }}d|dz  › �d|dz  dz   › �f}	|                     |	¦  «         |                      |d||dz
  dt          j        |j        |z   ¦  «                             dd¦  «        |	t          j        t          j        |j        |dz  z   ¦  «        ¬¦	  «	        }
|
|j	        |<   Œ®t          |¦  «        D ]ˆ\  }}|                      |d||dz
  dt          j        |j        |d	z  z   ¦  «                             dd¦  «        d
t          j        t          j        |j        |dz  z   ¦  «        ¬¦	  «	        }||j	        |<   Œ‰dS )zHSynthesizes the initial cluster: Depth 0 (Origin), Depth 1, and Depth 2.c                ó   — g | ]}d |› �‘ŒS )Ú	node_d1_brh   )rj   Úbs     r&   rl   z@EndGameAtlasEngine._generate_initial_cluster.<locals>.<listcomp>Ã   s   € Ð9Ð9Ð9¨1� 1��Ð9Ð9Ð9r(   é   r   r-   ©	rT   r‹   Úbranch_indexÚgrid_xÚgrid_yr`   Úconnected_idsr3   ÚrngÚ	node_d2_bé   é   é   rh   é   N)ÚrandomÚRandomrH   rI   ÚrangeÚ_create_procedural_nodeÚtupler   rp   rK   Ú	enumerateÚextendÚrandintrŽ   r�   )r%   r>   rž   Ú	origin_idÚdepth_1_idsÚorigin_nodeÚdepth_2_all_idsÚb_idxÚd1_idÚ	child_idsÚd1_nodeÚd2_idxÚd2_idÚd2_nodes                 r&   rQ   z,EndGameAtlasEngine._generate_initial_cluster½   s  € åŒm˜EÔ,Ñ-Ô-ˆð Ô0ˆ	Ø9Ð9µ°a±´Ð9Ñ9Ô9ˆà×2Ò2ØØØØØØÝ Ñ,Ô,Ý Ô+Øð 3ñ 

ô 

ˆð "-ˆŒ�IÑð &(ˆÝ% kÑ2Ô2ð 	)ð 	)‰LˆE�5Ø0 U¨Q¡YÐ0Ð0Ð2M¸eÀa¹iÈ!¹mÐ2MÐ2MÐNˆIØ×"Ò" 9Ñ-Ô-Ð-à×2Ò2ØØØ"Ø˜q‘yØÝ”] 5Ô#3°eÑ#;Ñ<Ô<×DÒDÀQÈÑJÔJØ'Ý$Ô/Ý”M %Ô"2°U¸R±ZÑ"?Ñ@Ô@ð 3ñ 
ô 
ˆGð ")ˆEŒK˜ÑÐõ ' Ñ7Ô7ð 	)ð 	)‰MˆF�EØ×2Ò2ØØØ#Ø ™
ØÝ”] 5Ô#3°f¸r±kÑ#AÑBÔB×JÒJÈ1ÈaÑPÔPØ Ý$Ô0Ý”M %Ô"2°V¸b±[Ñ"@ÑAÔAð 3ñ 
ô 
ˆGð ")ˆEŒK˜ÑÐð	)ð 	)r(   Úcleared_noder   c                ó„  ‡‡— |j         dz   }|j        D �]ª}|j                             |¦  «        Š‰�rŠ‰j        �s‚|dz   Šˆˆfd„t	          d¦  «        D ¦   «         }t          di d‰j        “d‰j         “d‰j        “d‰j        “d‰j	        “d	‰j
        “d
‰j        “d‰j        “d‰j        “dt          |¦  «        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “Ž|j        |<   t/          |¦  «        D ]§\  }}||j        vr™|j        ‰dz  z   |z   }t3          j        |¦  «        }	t7          dt9          d‰|	                     dd¦  «        z   ¦  «        ¦  «        }
|                      |‰|‰j        |dz  dz
  z   ‰|
dt>          j         |	¬¦	  «	        }||j        |<   Œ¨�Œ¬dS )z@Procedurally expands nodes at cleared_node.depth + 1 and beyond.r-   c                ó6   •— g | ]}d ‰› d‰j         dz  |z   › �‘ŒS )Únode_dÚ_br    )rš   )rj   Úir’   Údeeper_depths     €€r&   rl   z@EndGameAtlasEngine._expand_infinite_frontier.<locals>.<listcomp>ü   sD   ø€ ð "ð "ð "ØNOÐI˜\ÐIÐI¨UÔ-?À!Ñ-CÀaÑ-GÐIÐIð"ð "ð "r(   r    rT   r‹   rš   r›   rœ   r`   rt   r_   r3   rŒ   Úmonster_levelrb   rc   rv   rf   re   ro   Úcompleted_timestamp_mséd   r]   r   rh   r™   N)!r‹   rŒ   rK   r/   r¦   r   rT   rš   r›   rœ   r`   rt   r_   r3   r¨   r¾   rb   rc   rv   rf   re   ro   r¿   r©   rH   r¤   r¥   rs   rŠ   r«   r§   r   r�   )r%   r>   r·   Ú
next_depthr‘   Úgrandchild_idsÚgc_idxÚgc_idÚgc_seedÚgc_rngÚcalculated_tierÚgc_noder’   r½   s               @@r&   r�   z,EndGameAtlasEngine._expand_infinite_frontierô   s�  øø€ à!Ô'¨!Ñ+ˆ
Ø$Ô7ð 1	5ñ 1	5ˆHØ”K—O’O HÑ-Ô-ˆEØñ /5˜UÔ5ñ /5à)¨A™~�ð"ð "ð "ð "ð "ÝSXÐYZÑS[ÔS[ð"ñ "ô "�õ
 )0ð )ð )ð )Ø!œM˜Mð)àœ+˜+ð)ð "'Ô!3Ð!3ð)ð !œ<˜<ð	)ð
 !œ<˜<ð)ð œ˜ð)ð  œ+˜+ð)ð œ˜ð)ð !œ<˜<ð)õ (-¨^Ñ'<Ô'<Ð'<ð)ð #(Ô"5Ð"5ð)ð -2Ô,IÐ,Ið)ð +0Ô*EÐ*Eð)ð ).Ô(AÐ(Að)ð "œM˜Mð)ð  $œo˜oð!)ð" #œ^˜^ð#)ð$ ,1Ô+GÐ+Gð%)�”˜HÑ%õ, &/¨~Ñ%>Ô%>ð 5ð 5‘M�F˜EØ E¤KÐ/Ð/Ø"'Ô"2°\ÀCÑ5GÑ"GÈ&Ñ"P˜Ý!'¤¨wÑ!7Ô!7˜Ý*-¨bµ#°a¸ÈÏÊÐWXÐZ[ÑH\ÔH\Ñ9\Ñ2]Ô2]Ñ*^Ô*^˜à"&×">Ò">Ø$)Ø".Ø)/Ø#(¤<°6¸A±:À±>Ñ#BØ#/Ø!0Ø*,Ý#0Ô#<Ø &ð #?ñ 
#ô 
#˜ð .5˜œ EÑ*øùðc1	5ð 1	5r(   r‹   rO   rš   r›   rœ   r`   r�   úTuple[str, ...]r3   r   rž   úrandom.Randomc
                ó"  — t          t          ¦  «        }
|	                     |
¦  «        }t          |         }d|dz  z   |	                     dd¦  «        z   }d|dz  z   |	                     dd¦  «        z   }d|dz  z   |	                     dd	¦  «        z   }|d	k    rd
n|dk    rdn	|dk    rdnd}t
          |         }t          t          |¦  «        t          d|dz  dz   ¦  «        ¦  «        }t          |	 
                    ||¦  «        ¦  «        }d}|	                     |¦  «        › d|d         › d|› d�}|                      ||	¦  «        }t          d'i d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“dd|z   “d |“d!|“d"|“d#|“d$|d%         “d&|“ŽS )(zSSynthesizes a single deterministic MapNode with biome, affixes, boss, and contents.é   é   r   r   é   r˜   é   r    é   ÚlowÚmidÚhighÚuberr-   )zHoang Vuu
   KhÃ´ Cá»‘tu   Dá»‹ Biáº¿nu   Háº¯c Ngá»¥cu   Huyáº¿t KhÃ­u   Cuá»“ng Ná»™u    Â· Úname_viz (Tú)rT   r‹   rš   r›   rœ   r`   rt   r_   r3   rŒ   r¾   éC   rb   rc   rv   rf   re   Únative_bossro   rh   )Úlistr   Úchoicer   r«   r   rs   r|   rŠ   r¨   ÚsampleÚ_roll_node_contentsr   )r%   rT   r‹   rš   r›   rœ   r`   r�   r3   rž   Ú
biome_listrt   Ú
biome_metaÚqtyÚrarityÚ	pack_sizeÚtier_categoryÚ
affix_poolÚaffix_countÚchosen_affixesÚprefixesr_   ro   s                          r&   r§   z*EndGameAtlasEngine._create_procedural_node*  sA  € õ �,Ñ'Ô'ˆ
Ø—
’
˜:Ñ&Ô&ˆÝ# EÔ*ˆ
ð �4˜!‘8‰m˜cŸkšk¨!¨RÑ0Ô0Ñ0ˆØ�d˜Q‘h‘ §¢¨Q°Ñ!2Ô!2Ñ2ˆØ˜ ™‘M C§K¢K°°1Ñ$5Ô$5Ñ5ˆ	ð "&¨¢ ˜˜¸$À"º*¸*°°ÐUYÐ]_ÒU_ÐU_È6È6ÐekˆÝ'¨Ô6ˆ
Ý�#˜j™/œ/­3¨q°$¸!±)¸a±-Ñ+@Ô+@ÑAÔAˆÝ˜sŸzšz¨*°kÑBÔBÑCÔCˆð mˆØ—*’*˜XÑ&Ô&ÐMÐM¨J°yÔ,AÐMÐMÀdÐMÐMÐMˆð ×+Ò+¨D°#Ñ6Ô6ˆåð 
ð 
ð 
Ø�Gð
à�%ð
ð &˜ð
ð �6ð	
ð
 �6ð
ð �ð
ð �%ð
ð �ð
ð �6ð
ð  -˜}ð
ð ˜t™)˜)ð
ð %( Cð
ð #) &ð
ð !* 	ð
ð #�Nð
ð  ! Ô/Ð/ð!
ð" �Xð#
ð 	
r(   úTuple[MapContent, ...]c                ó  ‡‡— t          |¦  «        \  }}|                     ||¦  «        }t          t          ¦  «        }d„ |D ¦   «         Šg Št	          t          |t          |¦  «        ¦  «        ¦  «        D ]�}t          ˆˆfd„t          |¦  «        D ¦   «         ¦  «        }|dk    r n[| 	                    d|¦  «        }	d}
t          |¦  «        D ]2\  }}|‰v rŒ
|
‰|         z  }
|
|	k    r‰ 
                    |¦  «          nŒ3ŒŽg }t          ‰¦  «        D ]Û\  }}t          |         }| 	                    dd¦  «        | 	                    dd¦  «        f}| 
                    t          d|j                             ¦   «         › d|› d|                     d	d
¦  «        › �||d         |d         t          dt          d|d         |dk    rdndz   ¦  «        ¦  «        |d         |d¬¦  «        ¦  «         ŒÜt!          |¦  «        S )zHRolls a random count (1 to 5) and distinct types of savage map contents.c                ó4   — g | ]}t           |         d          ‘ŒS )Úweight)r   )rj   Úcts     r&   rl   z:EndGameAtlasEngine._roll_node_contents.<locals>.<listcomp>h  s#   € ÐLÐLÐL¸Õ& rÔ*¨8Ô4ÐLÐLÐLr(   c              3  ó6   •K  — | ]\  }}|‰v¯	‰|         V — Œd S r#   rh   )rj   r¼   rë   Úselected_typesÚweightss      €€r&   ú	<genexpr>z9EndGameAtlasEngine._roll_node_contents.<locals>.<genexpr>m  s6   øè è € ÐfÐf©¨¨BÈRÐWeÐMeÐMe˜' !œ*ÐMeÐMeÐMeÐMeÐfÐfr(   r   g        g      >Àg      >@Úmc_Ú_rÀ   iç  r_   ÚdescriptionrÐ   r-   Úbase_difficultyr   Úreward_typeF)Ú
content_idÚcontent_typer_   rò   Údifficulty_ratingrô   Úspawn_coordÚis_completed)r   r«   rÙ   r   r¦   rs   r|   Úsumr©   ÚuniformÚappendr   r   rr   ru   rŠ   r¨   )r%   r`   rž   Úmin_cÚmax_cÚcountÚcontent_poolrñ   Útotal_wÚpick_valÚcurrr¼   rë   ro   ÚidxÚmetaÚcoordrí   rî   s                    @@r&   rÜ   z&EndGameAtlasEngine._roll_node_contentsa  sD  øø€ å7¸Ñ=Ô=‰ˆˆuØ—’˜E 5Ñ)Ô)ˆõ Õ-Ñ.Ô.ˆØLÐL¸|ÐLÑLÔLˆð -/ˆÝ•s˜5¥# lÑ"3Ô"3Ñ4Ô4Ñ5Ô5ð 	ð 	ˆAÝÐfÐfÐfÐfÐfµ)¸LÑ2IÔ2IÐfÑfÔfÑfÔfˆGØ˜!Š|ˆ|Ø�Ø—{’{ 1 gÑ.Ô.ˆHØˆDÝ" <Ñ0Ô0ð ð ‘��2Ø˜Ð'Ð'ØØ˜ œ
Ñ"�Ø˜8Ò#Ð#Ø"×)Ò)¨"Ñ-Ô-Ð-Ø�Eð $øð
 &(ˆÝ  Ñ0Ô0ð 	ð 	‰GˆC�Ý& rÔ*ˆDØ—[’[ ¨Ñ-Ô-¨s¯{ª{¸5À$Ñ/GÔ/GÐHˆEØ�OŠOÝØU R¤X§^¢^Ñ%5Ô%5ÐUÐU¸ÐUÐU¸c¿kºkÈ#ÈsÑ>SÔ>SÐUÐUØ!#Ø˜fœØ $ ]Ô 3Ý&)¨!­S°°DÐ9JÔ4KÐTXÐ[]ÒT]ÐT]ÈqÈqÐcdÑ4eÑ-fÔ-fÑ&gÔ&gØ $ ]Ô 3Ø %Ø!&ð	ñ 	ô 	ñô ð ð õ �X‰ŒÐr(   r   Ú
new_statusr‡   c                ó0  — t          di d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d	|“d
|j	        “d|j
        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|p|j        “ŽS )zAHelper to create an updated copy of MapNode with modified status.rT   r‹   rš   r›   rœ   r`   rt   r_   r3   rŒ   r¾   rb   rc   rv   rf   re   ro   r¿   rh   )r   rT   r‹   rš   r›   rœ   r`   rt   r_   rŒ   r¾   rb   rc   rv   rf   re   ro   r¿   )r%   r   r  r‡   s       r&   ry   z)EndGameAtlasEngine._copy_node_with_statusŽ  s"  € õ ð 
ð 
ð 
Ø”L�Lð
à”*�*ð
ð Ô*Ð*ð
ð ”;�;ð	
ð
 ”;�;ð
ð ”�ð
ð ”*�*ð
ð ”�ð
ð �:ð
ð  $Ô6Ð6ð
ð Ô,Ð,ð
ð %)Ô$@Ð$@ð
ð #'Ô"<Ð"<ð
ð !%Ô 8Ð 8ð
ð ”L�Lð
ð  ”n�nð!
ð" ”]�]ð#
ð$ $0Ð#N°4Ô3Nøð%
ð 	
r(   )r   r   r   r   r    r!   )r)   r*   r    r+   )r)   r*   r    r
   )r)   r*   r    r@   r#   )r)   r*   rC   rD   r    r   )r)   r*   rT   r*   r    rU   )r>   r   r    r!   )r>   r   r·   r   r    r!   )rT   r*   r‹   rO   rš   rO   r›   rO   rœ   rO   r`   rO   r�   rÉ   r3   r   rž   rÊ   r    r   )r`   rO   rž   rÊ   r    rç   )r   r   r  r   r‡   rD   r    r   )Ú__name__Ú
__module__Ú__qualname__r'   r8   r?   rB   rS   r…   r“   rQ   r�   r§   rÜ   ry   rh   r(   r&   r   r   *   s  € € € € € ð>ð >ð >ð >ðQð Qð Qð Qð	$ð 	$ð 	$ð 	$ð3ð 3ð 3ð 3ðð ð ð ð ð,,
ð ,
ð ,
ð ,
ð\#
ð #
ð #
ð #
ðP5)ð 5)ð 5)ð 5)ðn45ð 45ð 45ð 45ðl5
ð 5
ð 5
ð 5
ðn+ð +ð +ð +ðb '+ð	
ð 
ð 
ð 
ð 
ð 
ð 
r(   r   )$Ú__doc__Ú
__future__r   Úmathr¤   rP   Útypingr   r   r   r   r   r	   Úserver.world.endgame_typesr
   r   r   r   r   r   r   Ú$server.world.endgame_content_catalogr   r   r   r   r   Úserver.world.hideout_enginer   r   Úserver.world.quest_enginer   r   r0   r2   r   rh   r(   r&   ú<module>r     s‹  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð AÐ @Ð @Ð @Ð @Ð @Ð @Ð @Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >ð !#Ð ØCÐ ð~
ð ~
ð ~
ð ~
ð ~
ñ ~
ô ~
ð ~
ð ~
ð ~
r(   