§
    ¿þ¾j¨8  ã                  óÜ   — 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mZmZ ddlmZmZ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 erddlmZ ddl m!Z! dd	l"m#Z#  G d
„ d¦  «        Z$dS )uø   
FreeExile Server-Authoritative Meridian Passive Service (Huyáº¿t Cá»‘t Ma Ä�á»“).
Enforces topological pathing, point deduction, anti-cheat validation,
stat aggregation, Jewel socketing, and synchronization with Combat Engine & Level Progression.
é    )ÚannotationsN)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTYPE_CHECKING)	ÚJewelItemDefÚMeridianNodeDefÚMeridianNodeTypeÚMeridianResetResultÚMeridianSocketResultÚMeridianStatBonusÚMeridianUnlockResultÚMeridianUnsocketResultÚPlayerMeridianState)ÚCANONICAL_MERIDIAN_NODESÚget_canonical_jewelÚget_meridian_nodeÚget_node_neighbors)ÚCombatActor)ÚLevelUpEvent)ÚQuestEnginec                  ó¤   — e Zd ZU dZdZded<   	 	 d2d3d„Zd4d5d„Zd4d6d„Zd7d„Z	d8d„Z
d9d„Zd:d„Zd;d„Zd<d#„Zd=d%„Zd>d'„Zd?d)„Zd@d,„ZdAd.„ZdBd1„ZdS )CÚMeridianServicez]Server-authoritative controller for meridian passive trees, jewels, and character attributes.é   ÚintÚDEFAULT_INITIAL_POINTSNÚdb_pathúOptional[str]Úquest_engineúOptional[QuestEngine]ÚreturnÚNonec                ój   — || _         || _        i | _        | j         r|                      ¦   «          d S d S ©N)Ú_db_pathÚ_quest_engineÚ_playersÚ_init_db)Úselfr!   r#   s      ú6C:\Projects\FreeExile\server\world\meridian_service.pyÚ__init__zMeridianService.__init__*   s?   € ð
  ˆŒØ)ˆÔØ8:ˆŒØŒ=ð 	Ø�MŠM‰OŒOˆOˆOˆOð	ð 	ó    © ÚqueryÚstrÚparamsúTuple[Any, ...]c                ó  — | j         sd S t          j        | j         ¦  «        }	 |5  |                     ||¦  «         d d d ¦  «         n# 1 swxY w Y   |                     ¦   «          d S # |                     ¦   «          w xY wr(   )r)   Úsqlite3ÚconnectÚexecuteÚclose)r-   r2   r4   Úconns       r.   Ú_execute_sqlzMeridianService._execute_sql5   s»   € ØŒ}ð 	ØˆFÝŒ˜tœ}Ñ-Ô-ˆð	Øð ,ð ,Ø—’˜U FÑ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð �JŠJ‰LŒLˆLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs-   ¤A* ¦A	½A* Á	AÁA* ÁAÁA* Á*B úOptional[Tuple[Any, ...]]c                ó  — | j         sd S t          j        | j         ¦  «        }	 |                     ¦   «         }|                     ||¦  «         |                     ¦   «         |                     ¦   «          S # |                     ¦   «          w xY wr(   )r)   r7   r8   Úcursorr9   Úfetchoner:   )r-   r2   r4   r;   Úcurs        r.   Ú
_fetch_onezMeridianService._fetch_one?   st   € ØŒ}ð 	Ø�4ÝŒ˜tœ}Ñ-Ô-ˆð	Ø—+’+‘-”-ˆCØ�KŠK˜˜vÑ&Ô&Ð&Ø—<’<‘>”>à�JŠJ‰LŒLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs   ¤=A6 Á6Bc                ó~   — |                       d¦  «         	 |                       d¦  «         d S # t          $ r Y d S w xY w)Na¡  
            CREATE TABLE IF NOT EXISTS character_meridians (
                player_id TEXT PRIMARY KEY,
                available_points INTEGER NOT NULL DEFAULT 5,
                spent_points INTEGER NOT NULL DEFAULT 0,
                unlocked_nodes_json TEXT NOT NULL DEFAULT '[]',
                socketed_jewels_json TEXT NOT NULL DEFAULT '{}',
                updated_at REAL NOT NULL
            );
        z[ALTER TABLE character_meridians ADD COLUMN socketed_jewels_json TEXT NOT NULL DEFAULT '{}';)r<   Ú	Exception)r-   s    r.   r,   zMeridianService._init_dbJ   sa   € Ø×Òð 	ñ 		ô 		ð 		ð	Ø×ÒÐ{Ñ|Ô|Ð|Ð|Ð|øÝð 	ð 	ð 	ØˆDˆDð	øøøs   —. ®
<»<Ú	player_idr   c           	     óÞ  — || j         v r| j         |         S | j        rù	 |                      d|f¦  «        }|rÎt          t	          j        |d         ¦  «        ¦  «        }t          |¦  «        dk    r"|d         rt	          j        |d         ¦  «        ni }i }|                     ¦   «         D ]\  }}t          |¦  «        }|r|||<   Œt          ||d         |d         ||t          j
        ¦   «         ¬¦  «        }	|	| j         |<   |	S n# t          $ r Y nw xY wt          || j        dt          ¦   «         i t          j
        ¦   «         ¬¦  «        }	|	| j         |<   |                      |	¦  «         |	S )zJRetrieves in-memory or persists state with authoritative 5 initial points.z}SELECT available_points, spent_points, unlocked_nodes_json, socketed_jewels_json FROM character_meridians WHERE player_id = ?é   é   r   é   )rE   Úavailable_pointsÚspent_pointsÚunlocked_nodesÚsocketed_jewelsÚlast_updated_at)r+   r)   rB   ÚsetÚjsonÚloadsÚlenÚitemsr   r   ÚtimerD   r    Ú_save_player)
r-   rE   ÚrowÚunlockedÚ
raw_jewelsÚsocketedÚs_idÚj_idÚj_defÚstates
             r.   Úget_or_create_playerz$MeridianService.get_or_create_playerZ   sª  € à˜œÐ%Ð%Ø”= Ô+Ð+àŒ=ð 	ðØ—o’oð TØ�Lñô �ð ð !Ý"¥4¤:¨c°!¬fÑ#5Ô#5Ñ6Ô6�HÝ7:¸3±x´xÀ!²|°|ÈÈAÌ°|¥¤¨C°¬FÑ!3Ô!3Ð!3ÐTV�JØ8:�HØ&0×&6Ò&6Ñ&8Ô&8ð 3ð 3™
˜˜dÝ 3°DÑ 9Ô 9˜Ø ð 3Ø-2˜H T™Nøå/Ø"+Ø),¨Q¬Ø%(¨¤VØ'/Ø(0Ý(,¬	©¬ðñ ô �Eð 05�D”M )Ñ,Ø �Lð%!øõ& ð ð ð Ø�ðøøøõ $ØØ!Ô8ØÝ™5œ5ØÝ œI™KœKð
ñ 
ô 
ˆð $)ˆŒ�iÑ Ø×Ò˜%Ñ Ô Ð Øˆs   ŸC&D Ä
DÄDr]   c                óh  — | j         sd S 	 d„ |j                             ¦   «         D ¦   «         }|                      d|j        |j        |j        t          j        t          t          |j        ¦  «        ¦  «        ¦  «        t          j        |¦  «        |j        f¦  «         d S # t          $ r Y d S w xY w)Nc                ó$   — i | ]\  }}||j         “ŒS r1   )Újewel_id)Ú.0rZ   Újs      r.   ú
<dictcomp>z0MeridianService._save_player.<locals>.<dictcomp>‹   s    € ÐXÐXÐX©w¨t°Q˜$ ¤
ÐXÐXÐXr0   aF  
                INSERT INTO character_meridians (player_id, available_points, spent_points, unlocked_nodes_json, socketed_jewels_json, updated_at)
                VALUES (?, ?, ?, ?, ?, ?)
                ON CONFLICT(player_id) DO UPDATE SET
                    available_points = excluded.available_points,
                    spent_points = excluded.spent_points,
                    unlocked_nodes_json = excluded.unlocked_nodes_json,
                    socketed_jewels_json = excluded.socketed_jewels_json,
                    updated_at = excluded.updated_at
                )r)   rM   rS   r<   rE   rJ   rK   rP   ÚdumpsÚsortedÚlistrL   rN   rD   )r-   r]   Ú
jewels_maps      r.   rU   zMeridianService._save_player‡   sÎ   € ØŒ}ð 	ØˆFð	ØXÐX¸%Ô:O×:UÒ:UÑ:WÔ:WÐXÑXÔXˆJØ×Òð	ð ”OØÔ*ØÔ&Ý”J�v¥d¨5Ô+?Ñ&@Ô&@ÑAÔAÑBÔBÝ”J˜zÑ*Ô*ØÔ)ðñô ð ð ð øõ( ð 	ð 	ð 	ØˆDˆDð	øøøs   ‹BB# Â#
B1Â0B1Únode_idúTuple[bool, str]c                óh  ‡— t          |¦  «        }|sdd|› d�fS |                      |¦  «        Š|‰j        v rdd|j        › d�fS ‰j        dk    rdd‰j        › d�fS |j        t          j        k    s|d	v rd
S t          |¦  «        }t          ˆfd„|D ¦   «         ¦  «        }|sdd|j        › d�fS d
S )z4Validates topological pathing and point sufficiency.Fõ   Huyá»‡t vá»‹ 'u$   ' khÃ´ng tá»“n táº¡i trÃªn Ma Ä�á»“.u   Huyá»‡t vá»‹ u)    Ä‘Ã£ Ä‘Æ°á»£c khai thÃ´ng tá»« trÆ°á»›c.r   u+   KhÃ´ng Ä‘á»§ Ä�iá»ƒm Ma Ä�á»“ (Hiá»‡n cÃ³: u   , Cáº§n: 1).)Úm_c1Úm1)Tu   Há»£p lá»‡ Ä‘á»ƒ khai thÃ´ng.c              3  ó*   •K  — | ]}|‰j         v V — Œd S r(   )rL   )rb   Únr]   s     €r.   ú	<genexpr>z2MeridianService.can_unlock_node.<locals>.<genexpr>¶   s+   øè è € Ð#QÐ#QÀ! A¨Ô)=Ð$=Ð#QÐ#QÐ#QÐ#QÐ#QÐ#Qr0   u   ChÆ°a thá»ƒ khai thÃ´ng uL   . Báº¯t buá»™c pháº£i Ä‘áº£ thÃ´ng Ã­t nháº¥t 1 huyá»‡t káº¿ cáº­n trÆ°á»›c.)
r   r^   rL   ÚnamerJ   Ú	node_typer   ÚORIGINr   Úany)r-   rE   ri   ÚnodeÚ	neighborsÚconnected_to_unlockedr]   s         @r.   Úcan_unlock_nodezMeridianService.can_unlock_node£   s!  ø€ å  Ñ)Ô)ˆØð 	YØÐX¨7ÐXÐXÐXÐXÐXà×)Ò)¨)Ñ4Ô4ˆØ�eÔ*Ð*Ð*ØÐ^¨$¬)Ð^Ð^Ð^Ð^Ð^àÔ! QÒ&Ð&ØÐlÈÔH^ÐlÐlÐlÐlÐlð Œ>Õ-Ô4Ò4Ð4¸À>Ð8QÐ8QØ8Ð8õ ' wÑ/Ô/ˆ	Ý #Ð#QÐ#QÐ#QÐ#QÀyÐ#QÑ#QÔ#QÑ QÔ QÐØ$ð 	MØð  M°T´Yð  Mð  Mð  Mð  Mð  Mà4Ð4r0   r   c                ó  — |                       ||¦  «        \  }}|                      |¦  «        }t          |¦  «        }|r|sLt          d|||j        t          t          |j        ¦  «        ¦  «        |                      |¦  «        ¬¦  «        S |xj        dz  c_        |xj	        dz  c_	        |j         
                    |¦  «         t          j        ¦   «         |_        |                      |¦  «         | j        r-	 | j                             ||¦  «         n# t           $ r Y nw xY w|                      |¦  «        }t          d|d|j        › d|j        › d�|j        t          t          |j        ¦  «        ¦  «        |¬¦  «        S )zCAuthoritatively spends 1 point and unlocks the designated acupoint.F)Úsuccessri   ÚmessagerJ   rL   Úaggregated_statsrI   Tu   Khai thÃ´ng thÃ nh cÃ´ng z (z)!)ry   r^   r   r   rJ   Útuplerf   rL   Úcompute_total_statsrK   ÚaddrT   rN   rU   r*   Úrecord_meridian_unlockrD   rr   Útitle)r-   rE   ri   ÚeligibleÚreasonr]   rv   Útotal_statss           r.   Úunlock_nodezMeridianService.unlock_node¼   s²  € à×/Ò/°	¸7ÑCÔCÑˆ�&Ø×)Ò)¨)Ñ4Ô4ˆÝ  Ñ)Ô)ˆàð 	˜tð 	Ý'ØØØØ!&Ô!7Ý$¥V¨EÔ,@Ñ%AÔ%AÑBÔBØ!%×!9Ò!9¸)Ñ!DÔ!Dðñ ô ð ð 	ÐÔ !Ñ#ÐÔØÐÔ˜aÑÐÔØÔ× Ò  Ñ)Ô)Ð)Ý $¤	¡¤ˆÔØ×Ò˜%Ñ Ô Ð àÔð 	ðØÔ"×9Ò9¸)ÀWÑMÔMÐMÐMøÝð ð ð Ø�ðøøøð ×.Ò.¨yÑ9Ô9ˆÝ#ØØØK°´	ÐKÐK¸T¼ZÐKÐKÐKØ"Ô3Ý ¥¨Ô(<Ñ!=Ô!=Ñ>Ô>Ø(ð
ñ 
ô 
ð 	
s   Ã=D Ä
D&Ä%D&Ú	socket_idra   r   c           
     ó–  — t          |¦  «        }|r|j        t          j        k    r+t	          d||d|› d�|                      |¦  «        ¬¦  «        S |                      |¦  «        }||j        vr0t	          d||d|j        › d�|                      |¦  «        ¬¦  «        S t          |¦  «        }|s+t	          d||d|› d�|                      |¦  «        ¬¦  «        S ||j
        |<   t          j        ¦   «         |_        |                      |¦  «         t	          d	||d
|j        › d|j        › d�|                      |¦  «        ¬¦  «        S )uB   Sockets a Linh Tháº¡ch (Jewel) into an unlocked Jewel Socket node.Frl   u,   ' khÃ´ng pháº£i lÃ  Linh Cá»‘t Kháº£m Tá»�a.)r{   r‡   ra   r|   r}   u   Kháº£m tá»�a u+    chÆ°a Ä‘Æ°á»£c khai thÃ´ng trÃªn Ma Ä�á»“.u   Linh Tháº¡ch 'u   ' khÃ´ng tá»“n táº¡i.Tu   Kháº£m náº¡p thÃ nh cÃ´ng u    vÃ o ú!)r   rs   r   ÚJEWEL_SOCKETr   r   r^   rL   rr   r   rM   rT   rN   rU   )r-   rE   r‡   ra   rv   r]   Újewels          r.   Úsocket_jewelzMeridianService.socket_jewelâ   sœ  € å  Ñ+Ô+ˆØð 	�t”~Õ)9Ô)FÒFÐFÝ'ØØ#Ø!Ø`¨Ð`Ð`Ð`Ø!%×!9Ò!9¸)Ñ!DÔ!Dðñ ô ð ð ×)Ò)¨)Ñ4Ô4ˆØ˜EÔ0Ð0Ð0Ý'ØØ#Ø!Ø^¨¬	Ð^Ð^Ð^Ø!%×!9Ò!9¸)Ñ!DÔ!Dðñ ô ð õ $ HÑ-Ô-ˆØð 	Ý'ØØ#Ø!ØH¨ÐHÐHÐHØ!%×!9Ò!9¸)Ñ!DÔ!Dðñ ô ð ð ,1ˆÔ˜iÑ(Ý $¤	¡¤ˆÔØ×Ò˜%Ñ Ô Ð å#ØØØØO°´ÐOÐOÀ4Ä9ÐOÐOÐOØ!×5Ò5°iÑ@Ô@ð
ñ 
ô 
ð 	
r0   r   c           	     ó„  — |                       |¦  «        }||j        vr't          d|dd|                      |¦  «        ¬¦  «        S |j                             |¦  «        }t          j        ¦   «         |_        |                      |¦  «         t          d||j        d|j	        › d�|                      |¦  «        ¬¦  «        S )u7   Removes a Linh Tháº¡ch (Jewel) from an acupoint socket.FÚ u9   Kháº£m tá»�a nÃ y chÆ°a Ä‘Æ°á»£c cáº¯m Linh Tháº¡ch nÃ o.)r{   r‡   Úremoved_jewel_idr|   r}   Tu   Ä�Ã£ thÃ¡o gá»¡ u    khá»�i kháº£m tá»�a!)
r^   rM   r   r   ÚpoprT   rN   rU   ra   rr   )r-   rE   r‡   r]   Úremoveds        r.   Úunsocket_jewelzMeridianService.unsocket_jewel  sÕ   € à×)Ò)¨)Ñ4Ô4ˆØ˜EÔ1Ð1Ð1Ý)ØØ#Ø!#ØSØ!%×!9Ò!9¸)Ñ!DÔ!Dðñ ô ð ð Ô'×+Ò+¨IÑ6Ô6ˆÝ $¤	¡¤ˆÔØ×Ò˜%Ñ Ô Ð å%ØØØ$Ô-ØJ w¤|ÐJÐJÐJØ!×5Ò5°iÑ@Ô@ð
ñ 
ô 
ð 	
r0   r   c                ó^  — |                       |¦  «        }|j        }|xj        |z  c_        d|_        |j                             ¦   «          |j                             ¦   «          t          j        ¦   «         |_        |                      |¦  «         t          d||j        d|› d�¬¦  «        S )zIRefunds 100% of spent points, unsockets all jewels, and reverts the tree.r   Tu4   Táº©y Tá»§y hoÃ n Ä‘iá»ƒm thÃ nh cÃ´ng! HoÃ n tráº£ u4    Ä�iá»ƒm Ma Ä�á»“ vÃ  thÃ¡o toÃ n bá»™ Linh Tháº¡ch.)r{   Úrefunded_pointsrJ   r|   )
r^   rK   rJ   rL   ÚclearrM   rT   rN   rU   r   )r-   rE   r]   Úrefundeds       r.   Úreset_meridianzMeridianService.reset_meridian&  sÂ   € à×)Ò)¨)Ñ4Ô4ˆØÔ%ˆØÐÔ (Ñ*ÐÔØˆÔØÔ×"Ò"Ñ$Ô$Ð$ØÔ×#Ò#Ñ%Ô%Ð%Ý $¤	¡¤ˆÔØ×Ò˜%Ñ Ô Ð å"ØØ$Ø"Ô3ð JÈ8ð  Jð  Jð  Jð	
ñ 
ô 
ð 	
r0   Údeltac                óô   — |dk    r|                       |¦  «        j        S |                       |¦  «        }|xj        |z  c_        t          j        ¦   «         |_        |                      |¦  «         |j        S )zOAuthoritatively increments available meridian points (level up / quest reward).r   )r^   rJ   rT   rN   rU   )r-   rE   r˜   r]   s       r.   Ú
add_pointszMeridianService.add_points8  st   € à�AŠ:ˆ:Ø×,Ò,¨YÑ7Ô7ÔHÐHØ×)Ò)¨)Ñ4Ô4ˆØÐÔ %Ñ'ÐÔÝ $¤	¡¤ˆÔØ×Ò˜%Ñ Ô Ð ØÔ%Ð%r0   Úeventr   c                ó†   — t          d|j        |j        z
  ¦  «        }|dk    r|                      |j        |¦  «         dS dS )zHHandler for level progression service events granting 1 point per level.r   N)ÚmaxÚ	new_levelÚ	old_levelrš   rE   )r-   r›   Úlevels_gaineds      r.   Úon_level_upzMeridianService.on_level_upB  sI   € å˜A˜uœ°´Ñ@ÑAÔAˆØ˜1ÒÐØ�OŠO˜EœO¨]Ñ;Ô;Ð;Ð;Ð;ð Ðr0   r   c                ó"  — |                       |¦  «        }t          ¦   «         }|j        D ]-}t          |¦  «        }|r|                     |j        ¦  «        }Œ.|j                             ¦   «         D ]}|                     |j        ¦  «        }Œ|S )zVComputes aggregated attribute bonuses from all unlocked acupoints and socketed jewels.)r^   r   rL   r   ÚcombineÚstatsrM   Úvalues)r-   rE   r]   Úaccumulatedri   rv   r‹   s          r.   r   z#MeridianService.compute_total_statsH  s˜   € à×)Ò)¨)Ñ4Ô4ˆÝ'Ñ)Ô)ˆØÔ+ð 	>ð 	>ˆGÝ$ WÑ-Ô-ˆDØð >Ø)×1Ò1°$´*Ñ=Ô=�øØÔ*×1Ò1Ñ3Ô3ð 	;ð 	;ˆEØ%×-Ò-¨e¬kÑ:Ô:ˆKˆKØÐr0   Úactorr   c                óÂ  — |                       |¦  «        }|j        }||j        z   |_        |j        dk    r't	          |j        |j        |j        z   ¦  «        |_        t          |j        |j        z   d|j        z   z  d¦  «        |_        t	          dt          |j	        |j
        z   d¦  «        ¦  «        |_	        t          |j        |j        z   d¦  «        |_        t          |d¦  «        rnt          |j        t           ¦  «        rVt#          |j                             ¦   «         ¦  «        D ]1}t          |j        |         |j        z   d¦  «        |j        |<   Œ.dS dS dS )zKInjects authoritative meridian attributes directly into server CombatActor.r   g      ð?rG   é   ÚresistancesN)r   Úmax_hpÚhpÚ
current_hpÚminÚroundÚbase_attackÚdpsÚdps_multÚcrit_chanceÚ	crit_rateÚcrit_multiplierÚcrit_dmgÚhasattrÚ
isinstancerª   Údictrg   ÚkeysÚresist)r-   rE   r§   r¤   Ú
old_max_hpÚelems         r.   Úapply_to_combat_actorz%MeridianService.apply_to_combat_actorT  s`  € à×(Ò(¨Ñ3Ô3ˆØ”\ˆ
Ø! E¤HÑ,ˆŒØÔ˜aÒÐÝ" 5¤<°Ô1AÀEÄHÑ1LÑMÔMˆEÔå! 5Ô#4°u´yÑ#@ÀSÈ5Ì>ÑEYÑ"ZÐ\]Ñ^Ô^ˆÔÝ ¥U¨5Ô+<¸u¼Ñ+NÐPQÑ%RÔ%RÑSÔSˆÔÝ % eÔ&;¸e¼nÑ&LÈaÑ PÔ PˆÔå�5˜-Ñ(Ô(ð 	[­Z¸Ô8IÍ4Ñ-PÔ-Pð 	[Ý˜UÔ.×3Ò3Ñ5Ô5Ñ6Ô6ð [ð [�Ý*/°Ô0AÀ$Ô0GÈ%Ì,Ñ0VÐXYÑ*ZÔ*Z�Ô! $Ñ'Ð'ð	[ð 	[ð 	[ð 	[ð[ð [r0   )NN)r!   r"   r#   r$   r%   r&   )r1   )r2   r3   r4   r5   r%   r&   )r2   r3   r4   r5   r%   r=   )r%   r&   )rE   r3   r%   r   )r]   r   r%   r&   )rE   r3   ri   r3   r%   rj   )rE   r3   ri   r3   r%   r   )rE   r3   r‡   r3   ra   r3   r%   r   )rE   r3   r‡   r3   r%   r   )rE   r3   r%   r   )rE   r3   r˜   r   r%   r   )r›   r   r%   r&   )rE   r3   r%   r   )rE   r3   r§   r   r%   r&   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Ú__annotations__r/   r<   rB   r,   r^   rU   ry   r†   rŒ   r’   r—   rš   r¡   r   r¾   r1   r0   r.   r   r   %   sz  € € € € € € ØgÐgà"#ÐÐ#Ð#Ð#Ñ#ð "&Ø.2ð	ð 	ð 	ð 	ð 	ðð ð ð ð ð	ð 	ð 	ð 	ð 	ðð ð ð ð +ð +ð +ð +ðZð ð ð ð85ð 5ð 5ð 5ð2$
ð $
ð $
ð $
ðL*
ð *
ð *
ð *
ðX
ð 
ð 
ð 
ð0
ð 
ð 
ð 
ð$&ð &ð &ð &ð<ð <ð <ð <ð
ð 
ð 
ð 
ð[ð [ð [ð [ð [ð [r0   r   )%rÂ   Ú
__future__r   rP   r7   rT   Útypingr   r   r   r   r   r	   r
   r   Úserver.world.meridian_typesr   r   r   r   r   r   r   r   r   Úserver.world.meridian_catalogr   r   r   r   Úserver.world.combat_enginer   Ú$server.world.level_progression_typesr   Úserver.world.quest_enginer   r   r1   r0   r.   ú<module>rË      sª  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ðð ð ð ð ð ð ð ð ð ð ð ð ð 6Ø6Ð6Ð6Ð6Ð6Ð6ØAÐAÐAÐAÐAÐAØ5Ð5Ð5Ð5Ð5Ð5ð}[ð }[ð }[ð }[ð }[ñ }[ô }[ð }[ð }[ð }[r0   