§
    —¿jJY  ã                  ó€  — d Z ddlmZ ddlZddlZddlZddlm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 ddlmZmZmZ ddlmZ dd	lmZ  ed
d
¬¦  «         G d„ d¦  «        ¦   «         Z ed
d
¬¦  «         G d„ d¦  «        ¦   «         Z ed
d
¬¦  «         G d„ d¦  «        ¦   «         Z  ed
d
¬¦  «         G d„ d¦  «        ¦   «         Z!d-d„Z"d.d„Z#d/d„Z$d0d„Z% G d„ d¦  «        Z&d1d"„Z'e(d#k    rÆ e)ej*        ¦  «        d$k    rej*        d$         nd%Z+ e&¦   «         Z,e+d&k    r# e-d'e, .                    d
¬(¦  «        › �¦  «         nZe, /                    ¦   «         Z0 e-d)e0j1        rd*nd+› �¦  «         e0j2        r(e0j2        D ]Z3 e-d,e3› �¦  «         Œ ej4        d$¦  «         e, 5                    ¦   «          dS dS )2z¼
Game Design Matrix Service for FreeExile.
Central Relational Truth Engine managing cross-cutting dependencies,
integrity validation, DAG topological cycle checks, and analytical queries.
é    )ÚannotationsN)Úcontextmanager)ÚAnyÚDictÚListÚOptionalÚSetÚTuple)ÚStoryActRowÚZoneRowÚNpcRowÚQuestRowÚProgressionBenchmarkRowÚDesignIntegrityReport)ÚSQL_PRAGMA_SETUPÚSQL_CREATE_TABLESÚSQL_CREATE_VIEWS)Úseed_all_canonical_data)Ú	dataclassT)ÚslotsÚfrozenc                  ó`   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   dS )ÚPartyScalingRowÚintÚ
party_sizeÚfloatÚhp_multiplierÚexp_bonus_pctÚitem_quantity_bonus_pctÚcurrency_quantity_bonus_pctÚrarity_bonus_pctÚnearby_radiusÚstrÚdescriptionN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú@C:\Projects\FreeExile\server\world\game_design_matrix_service.pyr   r      so   € € € € € € à€O€O�OØÐÐÑØÐÐÑØ"Ð"Ð"Ñ"Ø&Ð&Ð&Ñ&ØÐÐÑØÐÐÑØÐÐÑÐÐr+   r   c                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	S )
ÚLootAllocationRowr#   Úmode_idÚnamer   Útimeout_secondsÚboolÚis_permanentr$   Nr%   r*   r+   r,   r.   r.   *   sH   € € € € € € à€L€L�LØ€I€I�IØÐÐÑØÐÐÑØÐÐÑÐÐr+   r.   c                  óL   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )ÚTeleportConfigRowr#   Úaction_typer   Úcast_time_secondsÚcooldown_secondsr2   Úcancel_on_movementÚcancel_on_damager$   Nr%   r*   r+   r,   r5   r5   2   sZ   € € € € € € àÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr+   r5   c                  óL   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )ÚPortalQuarantineRowr#   Úrule_idÚ	zone_typer2   Úboss_lockoutÚsecret_chamber_lockoutr   Úmax_portalsr$   Nr%   r*   r+   r,   r<   r<   ;   sT   € € € € € € à€L€L�LØ€N€N�NØÐÐÑØ Ð Ð Ñ ØÐÐÑØÐÐÑÐÐr+   r<   Úrúsqlite3.RowÚreturnc                óŽ   — t          | d         | d         | d         | d         | d         | d         | d         | d         ¦  «        S )	Nr   r   r   r   r    r!   r"   r$   )r   ©rB   s    r,   Ú_row_to_party_scalingrG   E   s„   € Ý˜1˜\œ?¨A¨oÔ,>ÀÀ/Ô@RÐTUÐVoÔTpÐrsð  uRô  sSð  UVð  Wiô  Ujð  lmð  n}ô  l~ð  @Að  BOô  @Pñ  Qô  Qð  Qr+   c           	     ó~   — t          | d         | d         | d         t          | d         ¦  «        | d         ¦  «        S )Nr/   r0   r1   r3   r$   )r.   r2   rF   s    r,   Ú_row_to_loot_allocationrI   I   s<   € Ý˜Q˜yœ\¨1¨V¬9°aÐ8IÔ6JÍDÐQRÐSaÔQbÑLcÔLcÐefÐgtÔeuÑvÔvÐvr+   c           
     ó¦   — t          | d         | d         | d         t          | d         ¦  «        t          | d         ¦  «        | d         ¦  «        S )Nr6   r7   r8   r9   r:   r$   )r5   r2   rF   s    r,   Ú_row_to_teleport_configrK   M   s   € Ý˜Q˜}Ô-¨qÐ1DÔ/EÀqÐI[ÔG\Õ^bÐcdÐeyÔczÑ^{Ô^{õ  ~Bð  CDð  EWô  CXñ  ~Yô  ~Yð  [\ð  ]jô  [kñ  lô  lð  lr+   c           	     ó¦   — t          | d         | d         t          | d         ¦  «        t          | d         ¦  «        | d         | d         ¦  «        S )Nr=   r>   r?   r@   rA   r$   )r<   r2   rF   s    r,   Ú_row_to_portal_quarantinerM   Q   sj   € Ý˜q œ|¨Q¨{¬^½TÀ!ÀNÔBSÑ=TÔ=TÕVZÐ[\Ð]uÔ[vÑVwÔVwÐyzð  |Iô  zJð  LMð  N[ô  L\ñ  ]ô  ]ð  ]r+   c                  óÚ   — e Zd ZdZd>d?d„Zed„ ¦   «         Zd@d	„ZdAd„ZdAd„Z	dBdCd„Z
dDd„ZdEd„ZdFd„ZdGd„ZdHd „ZdIdJd$„ZdKd'„ZdLd)„ZdMd,„ZdNd.„ZdOdPd2„ZdQd4„ZdRdSd8„ZdTd:„ZdUd<„ZdUd=„ZdS )VÚGameDesignMatrixServicezRAuthoritative Service for querying and validating game design cross-relationships.NÚdb_pathúOptional[str]c                ó„  — |s—t           j                             t           j                             t           j                             t
          ¦  «        ddd¦  «        ¦  «        }t          j        |d¬¦  «         t           j                             |d¦  «        }|| _        d | _        | j        dk    rKt          j
        d¦  «        | _        t          j        | j        _        |                      | j        ¦  «         d S |                      ¦   «         5 }|                      |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz..ÚdataT)Úexist_okzgame_design_matrix.dbz:memory:)ÚosÚpathÚabspathÚjoinÚdirnameÚ__file__ÚmakedirsrP   Ú_memory_connÚsqlite3ÚconnectÚRowÚrow_factoryÚ_init_databaseÚ_get_connection)ÚselfrP   Úbase_dirÚconns       r,   Ú__init__z GameDesignMatrixService.__init__X   sL  € Øð 	FÝ”w—’¥r¤w§|¢|µB´G·O²OÅHÑ4MÔ4MÈtÐUYÐ[aÑ'bÔ'bÑcÔcˆHÝŒK˜¨4Ð0Ñ0Ô0Ð0Ý”g—l’l 8Ð-DÑEÔEˆGØˆŒØ:>ˆÔØŒ<˜:Ò%Ð%Ý '¤°
Ñ ;Ô ;ˆDÔÝ,3¬KˆDÔÔ)Ø×Ò Ô 1Ñ2Ô2Ð2Ð2Ð2à×%Ò%Ñ'Ô'ð *¨4Ø×#Ò# DÑ)Ô)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð *ð *s   ÄD5Ä5D9Ä<D9c              #  ó¾  K  — | j         �$| j         V — | j                              ¦   «          d S t          j        | j        ¦  «        }t          j        |_        |                     t          ¦  «         	 |V — |                     ¦   «          n## t          $ r | 
                    ¦   «          ‚ w xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w©N)r\   Úcommitr]   r^   rP   r_   r`   Úexecutescriptr   Ú	ExceptionÚrollbackÚclose©rc   re   s     r,   rb   z'GameDesignMatrixService._get_connectiong   sÛ   è è € àÔÐ(ØÔ#Ð#Ð#Ð#ØÔ×$Ò$Ñ&Ô&Ð&Ð&Ð&å”? 4¤<Ñ0Ô0ˆDÝ&œ{ˆDÔØ×ÒÕ/Ñ0Ô0Ð0ðØ�
�
�
Ø—’‘”��øÝð ð ð Ø—’‘”�Øðøøøð ð
 —
’
‘”���ø�—
’
‘”��øøøs   Á3B ÂC Â B,Â,C ÃCrD   ÚNonec                óX   — | j         �"| j                              ¦   «          d | _         d S d S rh   )r\   rm   ©rc   s    r,   rm   zGameDesignMatrixService.closey   s6   € ØÔÐ(ØÔ×#Ò#Ñ%Ô%Ð%Ø $ˆDÔÐÐð )Ð(r+   re   úsqlite3.Connectionc                óÌ   — |                      t          ¦  «         |                      |¦  «         |                      t          ¦  «         |                      t          ¦  «         dS )u+   Táº¡o báº£ng vÃ  view chuáº©n trong SQLite.N)rj   r   Ú_check_and_migrate_schemar   r   rn   s     r,   ra   z&GameDesignMatrixService._init_database~   s[   € à×ÒÕ+Ñ,Ô,Ð,Ø×&Ò& tÑ,Ô,Ð,Ø×ÒÕ,Ñ-Ô-Ð-Ø×ÒÕ+Ñ,Ô,Ð,Ð,Ð,r+   c                ó&  — |                      ¦   «         }|                     d¦  «         |                     ¦   «         sdS |                     d¦  «         t          |                     ¦   «         ¦  «        dk     r|                     d¦  «         dS dS )ub   Kiá»ƒm tra vÃ  nÃ¢ng cáº¥p báº£ng progression_benchmarks náº¿u phÃ¡t hiá»‡n schema cÅ© < 13 cá»™t.zSSELECT name FROM sqlite_master WHERE type='table' AND name='progression_benchmarks'Nz)PRAGMA table_info(progression_benchmarks)é   z+DROP TABLE IF EXISTS progression_benchmarks)ÚcursorÚexecuteÚfetchoneÚlenÚfetchall)rc   re   Úcurs      r,   rt   z1GameDesignMatrixService._check_and_migrate_schema…   s†   € à�kŠk‰mŒmˆØ�ŠÐiÑjÔjÐjØ�|Š|‰~Œ~ð 	ØˆFØ�ŠÐ?Ñ@Ô@Ð@Ýˆs�|Š|‰~Œ~ÑÔ Ò#Ð#Ø�KŠKÐEÑFÔFÐFÐFÐFð $Ð#r+   FÚforcer2   úDict[str, Any]c                ó  — |                       ¦   «         5 }|                     ¦   «         }|s²|                     d¦  «                             ¦   «         pdgd         }|                     d¦  «                             ¦   «         pdgd         }|                     d¦  «                             ¦   «         pdgd         }|dk    r|dk    r|dk    rddicd	d	d	¦  «         S t	          |¦  «        cd	d	d	¦  «         S # 1 swxY w Y   d	S )
u=   Náº¡p dá»¯ liá»‡u háº¡t giá»‘ng chuáº©n vÃ o matrix database.zSELECT COUNT(*) FROM story_actsr   z+SELECT COUNT(*) FROM progression_benchmarksz)SELECT COUNT(*) FROM party_scaling_matrixéd   é   ÚstatusÚalready_seededN)rb   rw   rx   ry   r   )rc   r}   re   r|   Ús_cntÚb_cntÚp_cnts          r,   Úseed_canonical_dataz+GameDesignMatrixService.seed_canonical_data�   sh  € à×!Ò!Ñ#Ô#ð 	1 tØ—+’+‘-”-ˆCØð 8ØŸšÐ%FÑGÔG×PÒPÑRÔRÐYÐWXÐVYÐ[\Ô]�ØŸšÐ%RÑSÔS×\Ò\Ñ^Ô^ÐeÐcdÐbeÐghÔi�ØŸšÐ%PÑQÔQ×ZÒZÑ\Ô\ÐcÐabÐ`cÐefÔg�Ø˜1’9�9 ¨#¢ °%¸1²*°*Ø$Ð&6Ð7ð	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1õ +¨4Ñ0Ô0ð	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s   •B<C9ÃC9Ã9C=Ä C=Úact_idr#   úOptional[Dict[str, Any]]c                óâ  — |                       ¦   «         5 }|                     ¦   «         }|                     d|f¦  «                             ¦   «         }|s	 ddd¦  «         dS t	          |¦  «        d„ |                     d|f¦  «                             ¦   «         D ¦   «         d„ |                     d|f¦  «                             ¦   «         D ¦   «         dœcddd¦  «         S # 1 swxY w Y   dS )uV   Láº¥y toÃ n bá»™ bá»‘i cáº£nh cá»‘t truyá»‡n, vÃ¹ng Ä‘áº¥t vÃ  boss cá»§a má»™t Há»“i.z)SELECT * FROM story_acts WHERE act_id = ?Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r*   ©Údict©Ú.0rB   s     r,   ú
<listcomp>zEGameDesignMatrixService.get_act_narrative_context.<locals>.<listcomp>§   s   € ÐuÐuÐu a�$˜q™'œ'ÐuÐuÐur+   z$SELECT * FROM zones WHERE act_id = ?c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   rŒ   rŽ   s     r,   r�   zEGameDesignMatrixService.get_act_narrative_context.<locals>.<listcomp>¨   s0   € ð  Vð  Vð  V q�4 ™7œ7ð  Vð  Vð  Vr+   zCSELECT quest_id, title, required_level FROM quests WHERE act_id = ?)ÚactÚzonesÚquests©rb   rw   rx   ry   r�   r{   )rc   rˆ   re   r|   Úact_rows        r,   Úget_act_narrative_contextz1GameDesignMatrixService.get_act_narrative_contextž   sv  € à×!Ò!Ñ#Ô#ð 		 tØ—+’+‘-”-ˆCØ—k’kÐ"MÐPVÈyÑYÔY×bÒbÑdÔdˆGØð Øð			ð 		ð 		ñ 		ô 		ð 		ð 		ð 		õ ˜G‘}”}ØuÐu¨3¯;ª;Ð7]Ð`fÐ_hÑ+iÔ+i×+rÒ+rÑ+tÔ+tÐuÑuÔuð Vð  V¨C¯KªKÐ8}ð  AGð  @Iñ  -Jô  -J÷  -Sò  -Sñ  -Uô  -Uð  Vñ  Vô  Vðð ð		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		ó   •AC$Á#A4C$Ã$C(Ã+C(Úzone_idc                óâ  — |                       ¦   «         5 }|                     ¦   «         }|                     d|f¦  «                             ¦   «         }|s	 ddd¦  «         dS t	          |¦  «        d„ |                     d|f¦  «                             ¦   «         D ¦   «         d„ |                     d|f¦  «                             ¦   «         D ¦   «         dœcddd¦  «         S # 1 swxY w Y   dS )uG   Láº¥y há»‡ sinh thÃ¡i toÃ n diá»‡n cá»§a má»™t Zone (NPC, Quest, Boss).z%SELECT * FROM zones WHERE zone_id = ?Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r*   rŒ   rŽ   s     r,   r�   z>GameDesignMatrixService.get_zone_ecosystem.<locals>.<listcomp>´   s   € ÐuÐuÐu Q�˜a™œÐuÐuÐur+   z$SELECT * FROM npcs WHERE zone_id = ?c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   rŒ   rŽ   s     r,   r�   z>GameDesignMatrixService.get_zone_ecosystem.<locals>.<listcomp>µ   s   € ÐyÐyÐy q�4 ™7œ7ÐyÐyÐyr+   z&SELECT * FROM quests WHERE zone_id = ?)ÚzoneÚnpcsr”   r•   )rc   r™   re   r|   Úzone_rows        r,   Úget_zone_ecosystemz*GameDesignMatrixService.get_zone_ecosystem«   sL  € à×!Ò!Ñ#Ô#ð 		 tØ—+’+‘-”-ˆCØ—{’{Ð#JÈWÈJÑWÔW×`Ò`ÑbÔbˆHØð Øð			ð 		ð 		ñ 		ô 		ð 		ð 		ð 		õ ˜X™œØuÐu¨#¯+ª+Ð6\Ð_fÐ^hÑ*iÔ*i×*rÒ*rÑ*tÔ*tÐuÑuÔuØyÐy¨C¯KªKÐ8`ÐcjÐblÑ,mÔ,m×,vÒ,vÑ,xÔ,xÐyÑyÔyðð ð		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		r˜   Úquest_idc                ó  — |                       ¦   «         5 }|                     ¦   «         }|                     d|f¦  «         |                     ¦   «         }|rt	          |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )uI   Láº¥y thÃ´ng tin Ä‘a chiá»�u cá»§a má»™t Quest tá»« View há»‡ sinh thÃ¡i.z2SELECT * FROM v_quest_ecosystem WHERE quest_id = ?N)rb   rw   rx   ry   r�   )rc   r¡   re   r|   Úrows        r,   Úget_quest_contextz)GameDesignMatrixService.get_quest_context¸   s¸   € à×!Ò!Ñ#Ô#ð 	. tØ—+’+‘-”-ˆCØ�KŠKÐLÈxÈkÑZÔZÐZØ—,’,‘.”.ˆCØ #Ð-•4˜‘9”9�9¨ð		.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   •AA4Á4A8Á;A8ú	List[str]c                ó˜  — g }t          ¦   «         }|}|                      ¦   «         5 }|                     ¦   «         }|ru||vrq|                     |¦  «         |                     d|f¦  «         |                     ¦   «         }|r(|d         r |d         }|                     |¦  «         |}nn|r||v°qddd¦  «         n# 1 swxY w Y   |S )uQ   DÃ² ngÆ°á»£c toÃ n bá»™ chuá»—i nhiá»‡m vá»¥ tiá»�n nhiá»‡m (Prerequisite Chain).z;SELECT prerequisite_quest_id FROM quests WHERE quest_id = ?Úprerequisite_quest_idN)Úsetrb   rw   Úaddrx   ry   Úappend)	rc   r¡   ÚchainÚvisitedÚcurrre   r|   r£   Úprereqs	            r,   Úget_quest_dependency_chainz2GameDesignMatrixService.get_quest_dependency_chainÀ   s'  € àˆÝ™EœEˆØˆà×!Ò!Ñ#Ô#ð 	 tØ—+’+‘-”-ˆCØð 	˜4 wÐ.Ð.Ø—’˜DÑ!Ô!Ð!Ø—’ÐYÐ\`Ð[bÑcÔcÐcØ—l’l‘n”n�Øð ˜3Ð6Ô7ð Ø Ð!8Ô9�FØ—L’L Ñ(Ô(Ð(Ø!�D�Dàð ð 	˜4 wÐ.Ð.ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ˆs   §BB?Â?CÃCÚlevelr   ú!Optional[ProgressionBenchmarkRow]c                óL  — |                       ¦   «         5 }|                     ¦   «         }|                     d|f¦  «         |                     ¦   «         }|s	 ddd¦  «         dS |                     ¦   «         }t          |d         |d         d|v r|d         ndd|v r|d         n|d         |d         |d	         |d
         |d         |d         d|v r|d         ndd|v r|d         ndd|v r|d         ndd|v r|d         nd¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )uI   Truy xuáº¥t má»‘c chuáº©n toÃ¡n há»�c cá»§a má»™t cáº¥p Ä‘á»™ cá»¥ thá»ƒ.z4SELECT * FROM progression_benchmarks WHERE level = ?Nr°   Ú
target_expÚexp_to_next_levelr   Úcumulative_expÚplayer_base_hpÚplayer_benchmark_dpsÚmonster_base_hpÚmonster_base_dpsÚmax_affix_tier_allowedÚdeath_penalty_ratioç        Úlevel_gap_safe_rangeé   Úlevel_gap_penalty_expg333333ã?Úmonster_benchmark_expé   )r°   r³   r´   rµ   r¶   r·   r¸   r¹   rº   r»   r½   r¿   rÀ   )rb   rw   rx   ry   Úkeysr   )rc   r°   re   r|   r£   Úks         r,   Úget_level_progression_benchmarkz7GameDesignMatrixService.get_level_progression_benchmarkÔ   sÖ  € à×!Ò!Ñ#Ô#ð 	 tØ—+’+‘-”-ˆCØ�KŠKÐNÐQVÐPXÑYÔYÐYØ—,’,‘.”.ˆCØð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð —’‘
”
ˆAÝ*Ø˜'”l¨s°<Ô/@Ø>QÐUVÐ>VÐ>V #Ð&9Ô":Ð":Ð\]Ø8HÈAÐ8MÐ8M˜sÐ#3Ô4Ð4ÐSVÐWcÔSdØ"Ð#3Ô4È3ÐOeÔKfØ #Ð$5Ô 6ÈÐM_ÔI`Ø'*Ð+CÔ'DØBWÐ[\ÐB\ÐB\ CÐ(=Ô$>Ð$>ÐbeØDZÐ^_ÐD_ÐD_ SÐ)?Ô%@Ð%@ÐefØF]ÐabÐFbÐFb cÐ*AÔ&BÐ&BÐhlØF]ÐabÐFbÐFb cÐ*AÔ&BÐ&BÐhjðñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   •ADÁ%B'DÄDÄ DÚsource_typeÚ	source_idúList[Dict[str, Any]]c                óZ  — |                       ¦   «         5 }|                     ¦   «         }|r|r|                     d||f¦  «         n/|r|                     d|f¦  «         n|                     d¦  «         d„ |                     ¦   «         D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u3   Truy váº¥n Ä‘á»“ thá»‹ quan há»‡ chÃ©o Ä‘a chiá»�u.zISELECT * FROM cross_relationships WHERE source_type = ? AND source_id = ?z7SELECT * FROM cross_relationships WHERE source_type = ?z!SELECT * FROM cross_relationshipsc                ó,   — g | ]}t          |¦  «        ‘ŒS r*   rŒ   rŽ   s     r,   r�   zAGameDesignMatrixService.query_cross_relations.<locals>.<listcomp>ô   s   € Ð4Ð4Ð4 •D˜‘G”GÐ4Ð4Ð4r+   N)rb   rw   rx   r{   )rc   rÅ   rÆ   re   r|   s        r,   Úquery_cross_relationsz-GameDesignMatrixService.query_cross_relationsê   s  € à×!Ò!Ñ#Ô#ð 	5 tØ—+’+‘-”-ˆCØð A˜yð AØ—’ÐgÐjuð  xAð  jBñ  Cô  Cð  Cð  CØð AØ—’ÐUÐXcÐWeÑfÔfÐfÐfà—’Ð?Ñ@Ô@Ð@Ø4Ð4 S§\¢\¡^¤^Ð4Ñ4Ô4ð	5ð 	5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5ð 	5ð 	5s   •A>B Â B$Â'B$r   úOptional[PartyScalingRow]c                óú   — |                       ¦   «         5 }|                     ¦   «                              d|f¦  «                             ¦   «         }|rt	          |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )uk   Truy xuáº¥t cáº¥u hÃ¬nh tá»· lá»‡ mÃ¡u quÃ¡i, exp, rÆ¡i Ä‘á»“ theo sá»‘ lÆ°á»£ng thÃ nh viÃªn party (1..6).z7SELECT * FROM party_scaling_matrix WHERE party_size = ?N)rb   rw   rx   ry   rG   )rc   r   re   rB   s       r,   Úget_party_scalingz)GameDesignMatrixService.get_party_scalingù   s¹   € à×!Ò!Ñ#Ô#ð 	; tØ—’‘”×%Ò%Ð&_ÐblÐanÑoÔo×xÒxÑzÔzˆAØ/0Ð:Õ(¨Ñ+Ô+Ð+°dð	;ð 	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;s   •AA0Á0A4Á7A4úList[PartyScalingRow]c                óÀ   — |                       ¦   «         5 }d„ |                     ¦   «                              d¦  «        D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )uI   Truy xuáº¥t toÃ n bá»™ danh sÃ¡ch scaling tá»« 1 Ä‘áº¿n 6 ngÆ°á»�i chÆ¡i.c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   )rG   rŽ   s     r,   r�   zBGameDesignMatrixService.get_all_party_scalings.<locals>.<listcomp>  s3   € ð  Kð  Kð  K°Õ)¨!Ñ,Ô,ð  Kð  Kð  Kr+   ú:SELECT * FROM party_scaling_matrix ORDER BY party_size ASCN©rb   rw   rx   rn   s     r,   Úget_all_party_scalingsz.GameDesignMatrixService.get_all_party_scalingsÿ   sÉ   € à×!Ò!Ñ#Ô#ð 	K tð Kð  K°d·k²k±m´m×6KÒ6Kð  MIñ  7Jô  7Jð  Kñ  Kô  Kð	Kð 	Kð 	Kð 	Kñ 	Kô 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Køøøð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kó   •1AÁAÁAr/   úOptional[LootAllocationRow]c                ó  — |                       ¦   «         5 }|                     ¦   «                              d|                     ¦   «         f¦  «                             ¦   «         }|rt          |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )ug   Láº¥y thÃ´ng tin cáº¥u hÃ¬nh cháº¿ Ä‘á»™ phÃ¢n bá»• váº­t pháº©m rÆ¡i (PERMANENT, SHORT, FREE_FOR_ALL).z5SELECT * FROM loot_allocation_modes WHERE mode_id = ?N)rb   rw   rx   Úupperry   rI   )rc   r/   re   rB   s       r,   Úget_loot_allocation_modez0GameDesignMatrixService.get_loot_allocation_mode  sÅ   € à×!Ò!Ñ#Ô#ð 	= tØ—’‘”×%Ò%Ð&]Ð`g×`mÒ`mÑ`oÔ`oÐ_qÑrÔr×{Ò{Ñ}Ô}ˆAØ12Ð<Õ*¨1Ñ-Ô-Ð-¸ð	=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ó   •A BÂBÂ	BúList[LootAllocationRow]c                óÀ   — |                       ¦   «         5 }d„ |                     ¦   «                              d¦  «        D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u:   Láº¥y toÃ n bá»™ cÃ¡c cháº¿ Ä‘á»™ phÃ¢n bá»• váº­t pháº©m.c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   )rI   rŽ   s     r,   r�   zIGameDesignMatrixService.get_all_loot_allocation_modes.<locals>.<listcomp>  s!   € ÐuÐuÐu°1Õ+¨AÑ.Ô.ÐuÐuÐur+   z#SELECT * FROM loot_allocation_modesNrÒ   rn   s     r,   Úget_all_loot_allocation_modesz5GameDesignMatrixService.get_all_loot_allocation_modes
  s°   € à×!Ò!Ñ#Ô#ð 	v tØuÐu¸¿º¹¼×8MÒ8MÐNsÑ8tÔ8tÐuÑuÔuð	vð 	vð 	vð 	vñ 	vô 	vð 	vð 	vð 	vð 	vð 	vð 	vøøøð 	vð 	vð 	vð 	vð 	vð 	vrÔ   ÚPARTY_MEMBERr6   úOptional[TeleportConfigRow]c                ó  — |                       ¦   «         5 }|                     ¦   «                              d|                     ¦   «         f¦  «                             ¦   «         }|rt          |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )uo   Láº¥y cáº¥u hÃ¬nh thá»�i gian niá»‡m, há»“i chiÃªu vÃ  Ä‘iá»�u kiá»‡n há»§y cá»§a dá»‹ch chuyá»ƒn tá»©c thá»�i.z4SELECT * FROM teleport_configs WHERE action_type = ?N)rb   rw   rx   r×   ry   rK   )rc   r6   re   rB   s       r,   Úget_teleport_configz+GameDesignMatrixService.get_teleport_config  sË   € à×!Ò!Ñ#Ô#ð 	= tØ—’‘”×%Ò%Ð&\Ð_j×_pÒ_pÑ_rÔ_rÐ^tÑuÔu×~Ò~ñ  Aô  AˆAØ12Ð<Õ*¨1Ñ-Ô-Ð-¸ð	=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=rÙ   úList[TeleportConfigRow]c                óÀ   — |                       ¦   «         5 }d„ |                     ¦   «                              d¦  «        D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u:   Láº¥y toÃ n bá»™ cáº¥u hÃ¬nh dá»‹ch chuyá»ƒn tá»©c thá»�i.c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   )rK   rŽ   s     r,   r�   zDGameDesignMatrixService.get_all_teleport_configs.<locals>.<listcomp>  s!   € ÐpÐpÐp°1Õ+¨AÑ.Ô.ÐpÐpÐpr+   zSELECT * FROM teleport_configsNrÒ   rn   s     r,   Úget_all_teleport_configsz0GameDesignMatrixService.get_all_teleport_configs  s°   € à×!Ò!Ñ#Ô#ð 	q tØpÐp¸¿º¹¼×8MÒ8MÐNnÑ8oÔ8oÐpÑpÔpð	qð 	qð 	qð 	qñ 	qô 	qð 	qð 	qð 	qð 	qð 	qð 	qøøøð 	qð 	qð 	qð 	qð 	qð 	qrÔ   Ú
WILDERNESSr>   úOptional[PortalQuarantineRow]c                ó  — |                       ¦   «         5 }|                     ¦   «                              d|                     ¦   «         f¦  «                             ¦   «         }|rt          |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )um   Láº¥y quy táº¯c cÃ¡ch ly vÃ  khÃ³a cá»•ng theo loáº¡i zone (WILDERNESS, DUNGEON, SECRET_CHAMBER, SAFE_HAVEN).z9SELECT * FROM portal_quarantine_rules WHERE zone_type = ?N)rb   rw   rx   r×   ry   rM   )rc   r>   re   rB   s       r,   Úget_portal_quarantine_rulez2GameDesignMatrixService.get_portal_quarantine_rule  sÑ   € à×!Ò!Ñ#Ô#ð 	? tØ—’‘”×%Ò%Ð&aÐdm×dsÒdsÑduÔduÐcwÑxÔx÷  Bò  Bñ  Dô  DˆAØ34Ð>Õ,¨QÑ/Ô/Ð/¸$ð	?ð 	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?rÙ   úList[PortalQuarantineRow]c                óÀ   — |                       ¦   «         5 }d„ |                     ¦   «                              d¦  «        D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u+   Láº¥y toÃ n bá»™ quy táº¯c cÃ¡ch ly cá»•ng.c                ó,   — g | ]}t          |¦  «        ‘ŒS r*   )rM   rŽ   s     r,   r�   zKGameDesignMatrixService.get_all_portal_quarantine_rules.<locals>.<listcomp>#  s!   € ÐyÐyÐy°QÕ-¨aÑ0Ô0ÐyÐyÐyr+   z%SELECT * FROM portal_quarantine_rulesNrÒ   rn   s     r,   Úget_all_portal_quarantine_rulesz7GameDesignMatrixService.get_all_portal_quarantine_rules   s°   € à×!Ò!Ñ#Ô#ð 	z tØyÐy¸$¿+º+¹-¼-×:OÒ:OÐPwÑ:xÔ:xÐyÑyÔyð	zð 	zð 	zð 	zñ 	zô 	zð 	zð 	zð 	zð 	zð 	zð 	zøøøð 	zð 	zð 	zð 	zð 	zð 	zrÔ   r   c                ó  — g }g }|                       ¦   «         5 }|                     ¦   «         }i }dD ]7}|                     d|› �¦  «         |                     ¦   «         d         ||<   Œ8|                     d¦  «         |                     ¦   «         }d„ |D ¦   «         }i }	|D ]]}
|
d         }|
d         }|rI||vr|                     d|› d	|› d
�¦  «         |	                     |g ¦  «                             |¦  «         Œ^t          ||	¦  «        \  }}|r|                     d|› d
�¦  «         |                     d¦  «         |                     ¦   «         D ]o}
|
d         |
d         dz
  k     s|
d         |
d         dz   k    rC|                     d|
d         › d|
d         › d|
d         › d|
d         › d|
d         › d�¦  «         Œp|                     d¦  «         dx}}|                     ¦   «         D ]–}
|
d         |k    r+|                     d|
d         › d|
d         › d|› d�¦  «         |
d         }d |
                     ¦   «         v r?|
d          |k    r+|                     d!|
d         › d|
d          › d|› d�¦  «         |
d          }Œ—|                     d"¦  «         |                     ¦   «         }t          |¦  «        d#k    r&|                     d$t          |¦  «        › d�¦  «         d%x}x}x}x}}|D �]c}|d&         |k     r*|                     d'|d(         › d)|d&         › d*|› �¦  «         |d+         |k     r*|                     d,|d(         › d)|d+         › d*|› �¦  «         |d-         |k     r*|                     d.|d(         › d)|d-         › d*|› �¦  «         |d/         |k     r*|                     d0|d(         › d)|d/         › d*|› �¦  «         |d1         |k     r*|                     d2|d(         › d)|d1         › d*|› �¦  «         |d3         d4k    r|                     d5|d3         › �¦  «         |d&         |d+         |d-         }}}|d/         |d1         }}�Œe|                     d6¦  «         d7„ |                     ¦   «         D ¦   «         }d8D ]}||vr|                     d9|› d
�¦  «         Œ | 
                    d:d;¦  «        d<k    r,|                     d=| 
                    d:¦  «        › d>�¦  «         |                     d?¦  «         |                     ¦   «         D ]O}|d@         dAk    s|dB         r|dC         s1|                     dD|dE         › dF|d@         › dG|dB         › dH�¦  «         ŒP|                     dI¦  «         |                     ¦   «         D ]N}|dJ         r|dK         r|dL         d#k    r0|                     dM|dN         › dO|dJ         › dP|dL         › �¦  «         ŒOt          |¦  «        dQk    }t          ||dR         |dS         |dT         |dU         |dV         |dW         |dX         |dY         |dZ         t          |¦  «        t          |¦  «        ¬[¦  «        cd\d\d\¦  «         S # 1 swxY w Y   d\S )]uQ   Kiá»ƒm tra toÃ n diá»‡n 100% tÃ­nh toÃ n váº¹n quan há»‡ chÃ©o vÃ  chá»‘ng Drift.)Ú
story_actsr“   rž   r”   Úmonster_archetypesÚskillsÚweapon_basesÚaffix_tiersÚcross_relationshipsÚparty_scaling_matrixÚloot_allocation_modesÚteleport_configsÚportal_quarantine_ruleszSELECT COUNT(*) as cnt FROM ÚcntzJSELECT quest_id, prerequisite_quest_id, required_level, act_id FROM questsc                ó   — h | ]
}|d          ’ŒS )r¡   r*   rŽ   s     r,   ú	<setcomp>zIGameDesignMatrixService.validate_game_design_integrity.<locals>.<setcomp>=  s   € Ð;Ð;Ð;¨1˜˜:œÐ;Ð;Ð;r+   r¡   r§   zBroken Quest Prerequisite: z references missing quest 'z'.z2Circular Dependency in Quest DAG involving quest 'z¾
                SELECT q.quest_id, q.required_level, a.act_id, a.level_min, a.level_max 
                FROM quests q 
                JOIN story_acts a ON q.act_id = a.act_id
            Úrequired_levelÚ	level_minr¾   Ú	level_maxzPacing Mismatch: Quest 'z' requires lvl z, outside Act 'rˆ   z	' range [z, z].z7SELECT * FROM progression_benchmarks ORDER BY level ASCéÿÿÿÿr³   z)Progression Curve non-monotonic at level r°   z: XP z <= ú.rµ   z1Progression Cumulative XP non-monotonic at level rÑ   r�   z.Party Scaling: expected 6 sizes (1..6), found g      ð¿r   z'Party Scaling HP non-monotonic at size r   z: z < r   z(Party Scaling EXP non-monotonic at size r   z-Party Scaling Item Qty non-monotonic at size r    z1Party Scaling Currency Qty non-monotonic at size r!   z+Party Scaling Rarity non-monotonic at size r"   g      .@z1Party Scaling nearby_radius expected 15.0, found z:SELECT mode_id, timeout_seconds FROM loot_allocation_modesc                ó,   — i | ]}|d          |d         “ŒS )r/   r1   r*   rŽ   s     r,   ú
<dictcomp>zJGameDesignMatrixService.validate_game_design_integrity.<locals>.<dictcomp>~  s$   € ÐQÐQÐQ¸Q�a˜	”l AÐ&7Ô$8ÐQÐQÐQr+   )Ú	PERMANENTÚSHORTÚFREE_FOR_ALLzLoot Allocation: missing mode 'r  r¼   g      @z3Loot Allocation SHORT timeout expected 5.0s, found zs.zaSELECT action_type, cast_time_seconds, cancel_on_movement, cancel_on_damage FROM teleport_configsr7   g      @r9   r:   zTeleport Config 'r6   z' invalid (cast=z, cancel_move=ú)z�SELECT zone_type, boss_lockout, secret_chamber_lockout, max_portals FROM portal_quarantine_rules WHERE zone_type IN ('WILDERNESS', 'DUNGEON')r?   r@   rA   zQuarantine rule for 'r>   z' invalid: boss_lock=z, max=r   rï   r“   rž   r”   rð   rñ   rò   ró   rô   )Úis_validÚ
total_actsÚtotal_zonesÚ
total_npcsÚtotal_questsÚtotal_monstersÚtotal_skillsÚtotal_weaponsÚtotal_affixesÚtotal_relationsÚ
violationsÚwarningsN)rb   rw   rx   ry   r{   rª   Ú
setdefaultÚ_detect_dag_cyclerÂ   rz   Úgetr   Útuple)rc   r  r  re   r|   ÚcountsÚtblÚ
quest_rowsÚ	quest_idsÚadjrB   Úqidr®   Ú	has_cycleÚ
cycle_nodeÚprev_xpÚprev_cumÚ
party_rowsÚp_hpÚp_expÚp_qtyÚp_currÚp_rarÚprÚlmodesÚreq_mÚtcÚqrr  s                                r,   Úvalidate_game_design_integrityz6GameDesignMatrixService.validate_game_design_integrity(  s
  € à "ˆ
Ø ˆà×!Ò!Ñ#Ô#ð r	 tØ—+’+‘-”-ˆCð ˆFðð 4ð 4�ð
 —’Ð@¸3Ð@Ð@ÑAÔAÐAØ!Ÿlšl™nœn¨UÔ3��s‘�ð �KŠKÐdÑeÔeÐeØŸš™œˆJØ;Ð;°
Ð;Ñ;Ô;ˆIØ(*ˆCàð ;ð ;�Ø˜
”m�ØÐ2Ô3�Øð ;Ø YÐ.Ð.Ø"×)Ò)Ð*rÈÐ*rÐ*rÐhnÐ*rÐ*rÐ*rÑsÔsÐsØ—N’N 6¨2Ñ.Ô.×5Ò5°cÑ:Ô:Ð:øõ %6°iÀÑ$EÔ$EÑ!ˆI�zØð gØ×!Ò!Ð"eÐWaÐ"eÐ"eÐ"eÑfÔfÐfð �KŠKð ñ ô ð ð
 —\’\‘^”^ð ð �ØÐ%Ô&¨¨;¬¸!Ñ);Ò;Ð;¸qÐAQÔ?RÐUVÐWbÔUcÐfgÑUgÒ?gÐ?gØ—O’Oðc°1°Z´=ð cð cÐQRÐScÔQdð cð cØ()¨(¬ðcð cØ>?À¼nðcð cØPQÐR]ÔP^ðcð cð cñô ð øð �KŠKÐQÑRÔRÐRØ!#Ð#ˆG�hØ—\’\‘^”^ð 3ð 3�Ø�\”? gÒ-Ð-Ø×%Ò%ð  'CÐRSÐT[ÔR\ð  'Cð  'CÐcdÐeqÔcrð  'Cð  'CÐxð  'Cð  'Cð  'Cñ  Dô  Dð  DØ˜Lœ/�Ø# q§v¢v¡x¤xÐ/Ð/ØÐ)Ô*¨hÒ6Ð6Ø"×)Ò)ð  +TÐ^_Ð`gÔ^hð  +Tð  +TÐopð  rBô  pCð  +Tð  +Tð  IQð  +Tð  +Tð  +Tñ  Uô  Uð  UØ Ð!1Ô2�Høð �KŠKÐTÑUÔUÐUØŸš™œˆJÝ�:‰Œ !Ò#Ð#Ø×!Ò!Ð"eÕSVÐWaÑSbÔSbÐ"eÐ"eÐ"eÑfÔfÐfØ48Ð8ˆDÐ8�5Ð8˜5Ð8 6¨EØ ð Zñ Z�Ø�oÔ&¨Ò-Ð-Ø×%Ò%ð  'CÐPRÐS_ÔP`ð  'Cð  'CÐdfÐgvÔdwð  'Cð  'Cð  }Að  'Cð  'Cñ  Dô  Dð  DØ�oÔ&¨Ò.Ð.Ø×%Ò%ð  'EÐQSÐT`ÔQað  'Eð  'EÐegÐhwÔexð  'Eð  'Eð  ~Cð  'Eð  'Eñ  Fô  Fð  FØÐ/Ô0°5Ò8Ð8Ø×%Ò%ð  'TÐVXÐYeÔVfð  'Tð  'TÐjlð  nGô  kHð  'Tð  'Tð  MRð  'Tð  'Tñ  Uô  Uð  UØÐ3Ô4°vÒ=Ð=Ø×%Ò%ð  ']ÐZ\Ð]iÔZjð  ']ð  ']Ðnpð  rOô  oPð  ']ð  ']ð  U[ð  ']ð  ']ñ  ^ô  ^ð  ^ØÐ(Ô)¨EÒ1Ð1Ø×%Ò%ð  'KÐTVÐWcÔTdð  'Kð  'KÐhjÐk}Ôh~ð  'Kð  'Kð  DIð  'Kð  'Kñ  Lô  Lð  LØ�oÔ&¨$Ò.Ð.Ø×%Ò%Ð&oÐZ\Ð]lÔZmÐ&oÐ&oÑpÔpÐpØ%'¨Ô%8¸"¸_Ô:MÈrÐRkÔOl˜U�e�Ø "Ð#@Ô AÀ2ÐFXÔCY˜�‘ð �KŠKÐTÑUÔUÐUØQÐQÀ#Ç,Â,Á.Ä.ÐQÑQÔQˆFØ?ð Sð S�Ø Ð&Ð&Ø×%Ò%Ð&QÈÐ&QÐ&QÐ&QÑRÔRÐRøØ�zŠz˜' 3Ñ'Ô'¨3Ò.Ð.Ø×!Ò!Ð"oÐX^×XbÒXbÐcjÑXkÔXkÐ"oÐ"oÐ"oÑpÔpÐpð �KŠKÐ{Ñ|Ô|Ð|Ø—l’l‘n”nð að a�ØÐ)Ô*¨cÒ1Ð1¸Ð<PÔ9QÐ1ÐY[Ð\nÔYoÐ1Ø×%Ò%ð  '`¸"¸]Ô:Kð  '`ð  '`Ð]_Ð`sÔ]tð  '`ð  '`ð  EGð  H\ô  E]ð  '`ð  '`ð  '`ñ  aô  að  aøà�KŠKð  hñ  iô  ið  iØ—l’l‘n”nð Sð S�Ø˜.Ô)ð S°Ð4LÔ1Mð SÐQSÐTaÔQbÐfgÒQgÐQgØ×%Ò%ð  'R¸bÀ¼oð  'Rð  'RÐdfÐguÔdvð  'Rð  'Rð  Að  BOô  Pð  'Rð  'Rñ  Sô  Sð  Søå˜:‘”¨!Ò+ˆHå(Ø!Ø! ,Ô/Ø" 7œOØ! &œ>Ø# HÔ-Ø%Ð&:Ô;Ø# HÔ-Ø$ ^Ô4Ø$ ]Ô3Ø &Ð'<Ô =Ý  Ñ,Ô,Ý˜x™œðñ ô ðKr	ð r	ð r	ð r	ñ r	ô r	ð r	ð r	ð r	ð r	ð r	ð r	øøøð r	ð r	ð r	ð r	ð r	ð r	s   ™YY5Ù5Y9Ù<Y9c                ó*   — |                       ¦   «         S )zFAlias for validate_game_design_integrity providing uniform API naming.)r,  rq   s    r,   Úverify_matrix_integrityz/GameDesignMatrixService.verify_matrix_integrity¡  s   € à×2Ò2Ñ4Ô4Ð4r+   rh   )rP   rQ   )rD   ro   )re   rr   rD   ro   )F)r}   r2   rD   r~   )rˆ   r#   rD   r‰   )r™   r#   rD   r‰   )r¡   r#   rD   r‰   )r¡   r#   rD   r¥   )r°   r   rD   r±   )NN)rÅ   rQ   rÆ   rQ   rD   rÇ   )r   r   rD   rË   )rD   rÎ   )r/   r#   rD   rÕ   )rD   rÚ   )rÞ   )r6   r#   rD   rß   )rD   râ   )ræ   )r>   r#   rD   rç   )rD   rê   )rD   r   )r&   r'   r(   Ú__doc__rf   r   rb   rm   ra   rt   r‡   r—   r    r¤   r¯   rÄ   rÊ   rÍ   rÓ   rØ   rÝ   rá   rå   ré   rí   r,  r.  r*   r+   r,   rO   rO   U   s  € € € € € Ø\Ð\ð*ð *ð *ð *ð *ð ðð ñ „^ðð"%ð %ð %ð %ð
-ð -ð -ð -ðGð Gð Gð Gð
1ð 
1ð 
1ð 
1ð 
1ðð ð ð ðð ð ð ð.ð .ð .ð .ðð ð ð ð(ð ð ð ð,
5ð 
5ð 
5ð 
5ð 
5ð;ð ;ð ;ð ;ðKð Kð Kð Kð
=ð =ð =ð =ðvð vð vð vð
=ð =ð =ð =ð =ðqð qð qð qð
?ð ?ð ?ð ?ð ?ðzð zð zð zðwð wð wð wðr5ð 5ð 5ð 5ð 5ð 5r+   rO   Ú	all_nodesúSet[str]r  úDict[str, List[str]]úTuple[bool, Optional[str]]c                ó|   ‡‡‡— d„ | D ¦   «         Šd
ˆˆˆfd„Š| D ]!}‰|         dk    r ‰|¦  «        }|rd|fc S Œ"d	S )z<DFS-based cycle detection returning (has_cycle, cycle_root).c                ó   — i | ]}|d “ŒS )r   r*   )r�   Únodes     r,   r  z%_detect_dag_cycle.<locals>.<dictcomp>¨  s   € Ð=Ð=Ð=¨4˜t QÐ=Ð=Ð=r+   Úur#   rD   rQ   c                óà   •— d‰| <   ‰                      | g ¦  «        D ]K}‰                      |d¦  «        dk    r|c S ‰                      |d¦  «        dk    r ‰|¦  «        }|r|c S ŒLd‰| <   d S )Né   r   é   )r  )r7  ÚvÚcycle_foundr  Údfsr¬   s      €€€r,   r=  z_detect_dag_cycle.<locals>.dfsª  s’   ø€ Øˆ�‰
Ø—’˜˜B‘”ð 	'ð 	'ˆAØ�{Š{˜1˜aÑ Ô  AÒ%Ð%Ø���Ø�{Š{˜1˜aÑ Ô  AÒ%Ð%Ø!˜c !™fœf�Øð 'Ø&Ð&Ð&Ð&øØˆ�‰
Øˆtr+   r   T)FN)r7  r#   rD   rQ   r*   )r0  r  r6  Úcycler=  r¬   s    `  @@r,   r  r  ¦  s‹   øøø€ à=Ð=°9Ð=Ñ=Ô=€Gð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ð #ð #ˆØ�4Œ=˜AÒÐØ�C˜‘I”IˆEØð #Ø˜U�{Ð"Ð"Ð"øØˆ;r+   Ú__main__r9  ÚvalidateÚseedz[GameDesignMatrix] Seeded: )r}   z[GameDesignMatrix] Integrity: ÚPASSÚFAILz - )rB   rC   rD   r   )rB   rC   rD   r.   )rB   rC   rD   r5   )rB   rC   rD   r<   )r0  r1  r  r2  rD   r3  )6r/  Ú
__future__r   rU   r]   ÚsysÚ
contextlibr   Útypingr   r   r   r   r	   r
   Ú%server.world.game_design_matrix_typesr   r   r   r   r   r   Ú&server.world.game_design_matrix_schemar   r   r   Ú&server.world.game_design_matrix_seederr   Údataclassesr   r   r.   r5   r<   rG   rI   rK   rM   rO   r  r&   rz   ÚargvÚactionÚserviceÚprintr‡   r,  Úreportr  r  r;  Úexitrm   r*   r+   r,   ú<module>rR     sç  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø %Ð %Ð %Ð %Ð %Ð %Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
 KÐ JÐ JÐ JÐ JÐ JØ !Ð !Ð !Ð !Ð !Ð !ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ððQð Qð Qð Qðwð wð wð wðlð lð lð lð]ð ]ð ]ð ]ðN5ð N5ð N5ð N5ð N5ñ N5ô N5ð N5ðb
ð ð ð ð0 ˆzÒÐØ˜C ¤™MœM¨AÒ-Ð-ˆSŒX�aŒ[ˆ[°:€FØ%Ð%Ñ'Ô'€GØ�ÒÐØˆÐU¨G×,GÒ,GÈdÐ,GÑ,SÔ,SÐUÐUÑVÔVÐVÐVà×7Ò7Ñ9Ô9ˆØˆÐV¸¼Ð/T¨v¨vÈfÐVÐVÑWÔWÐWØÔð 	ØÔ&ð !ð !�Ø��i˜A�i�iÑ Ô Ð Ð ØˆCŒH�Q‰KŒKˆKØ‡M‚M�O„O€O€O€Oð Ðr+   