§
    Ú¿j‘<  ã                  óô   — d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ d/d0d„Zd1d„Zd2d„Z d3d„Z!d4d!„Z"d5d$„Z#d6d&„Z$d7d.„Z%dS )8z©
Game Design Matrix Seeder for FreeExile.
Pulls canonical data from all game catalogs and populates the SQLite central matrix.
Strictly decoupled from engine execution.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)Úget_canonical_acts)Ú
ZoneEngine)Úcreate_canonical_npcs)Úcreate_default_quest_engine)ÚCORE_GENUS_SPECSÚSUB_SPECIES_CATALOG)Úget_base_weapon_catalog)Úcreate_standard_active_skills)ÚCANONICAL_AFFIX_DEFINITIONSÚSTANDARD_ILVLS)Úcalculate_piecewise_exp_curveFÚconnúOptional[sqlite3.Connection]ÚforceÚboolÚreturnúDict[str, Any]c                ó>  — | €$ddl m}  |¦   «                              |¬¦  «        S |                      ¦   «         }|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S n# t          j        $ r Y nw xY wt          | ¦  «        }|  	                    ¦   «          |S )u^   Náº¡p dá»¯ liá»‡u háº¡t giá»‘ng chuáº©n cÃ³ kiá»ƒm tra tráº¡ng thÃ¡i báº£ng náº¿u force=False.Nr   )ÚGameDesignMatrixService)r   zSELECT COUNT(*) FROM story_actsz+SELECT COUNT(*) FROM progression_benchmarksz)SELECT COUNT(*) FROM party_scaling_matrixéd   é   ÚstatusÚalready_seeded)
Ú'server.world.game_design_matrix_servicer   Úseed_canonical_dataÚcursorÚexecuteÚfetchoneÚsqlite3ÚOperationalErrorÚseed_all_canonical_dataÚcommit)r   r   r   ÚcurÚs_cntÚb_cntÚp_cntÚress           ú?C:\Projects\FreeExile\server\world\game_design_matrix_seeder.pyr    r       sB  € à€|ØSÐSÐSÐSÐSÐSØ&Ð&Ñ(Ô(×<Ò<À5Ð<ÑIÔIÐIØ
�+Š+‰-Œ-€CØð ð	Ø—[’[Ð!BÑCÔC×LÒLÑNÔNÐUÐSTÐRUÐWXÔYˆEØ—[’[Ð!NÑOÔO×XÒXÑZÔZÐaÐ_`Ð^aÐcdÔeˆEØ—[’[Ð!LÑMÔM×VÒVÑXÔXÐ_Ð]^Ð\_ÐabÔcˆEØ�qŠyˆy˜U cš\˜\¨e°qªj¨jØ Ð"2Ð3Ð3øøÝÔ'ð 	ð 	ð 	ØˆDð	øøøå1°$Ñ7Ô7€CØ‡K‚K�M„M€MØ€Js   ¾B%C% Ã%C7Ã6C7úsqlite3.ConnectionúDict[str, int]c                óF  — i }|                       ¦   «         }|                     d¦  «         dD ]}|                     d|› �¦  «         Œt          ¦   «         }|                     ¦   «         D ]{\  }}t	          |j        ¦  «        \  }}|                     d|j        j        t          |j        j        ¦  «        |j	        |j
        |||j        |j        |j        |j        f
¦  «         Œ|t          |¦  «        |d<   t!          ¦   «         }	|	j                             ¦   «         D ]t\  }
}t%          |
¦  «        }|                     d|j        ||j        |j        j        |j        j        |j        |j        dz   |j        |j        |j        |j        f¦  «         Œut          |	j        ¦  «        |d<   t9          ¦   «         }|D ]M}|                     d	|j        |j        |j	        |j        j        |j        |j        |j         |j!        f¦  «         ŒNt          |¦  «        |d
<   d}tE          j        ¦   «         D ]�\  }\  }}}}}tG          j$        |g ¦  «        }|D ]j\  }}d|j         %                    ¦   «         › d| %                    ¦   «         › �}|                     d||j        ||› d|› d�||||j        df	¦  «         |dz  }ŒkŒŽ||d<   tM          ¦   «         }|j'                             ¦   «         D ]è\  }}d}d}|j(        r$|j(        d         j)        }|j(        d         j*        }|j+        r|j+        d         nd}d„ |j,        j-        D ¦   «         } t]          ||j/        ¦  «        }!|                     d|j0        |j/        |j	        |j1        j        |j2        |!||||j,        j3        |j,        j4        |j,        j	        tk          j6        | d¬¦  «        f¦  «         Œét          |j'        ¦  «        |d<   to          ¦   «         }"|"                     ¦   «         D ]�\  }#}$|                     d|$j8        |$j9        |$j:        |$j;        j        |$j<        j        |$j=        j        |$j>        j        |$j?        j        |$j@        j        |$j2        |$jA        |$jB        |$jC        |$jD        f¦  «         ŒŽt          |"¦  «        |d<   t‹          ¦   «         }%|%                     ¦   «         D ]‹\  }&}'tk          j6        d„ |'jF        D ¦   «         d¬¦  «        }(|                     d|'jG        |'jH        |'j@        j        |'jI        j        |'jJ        j        |'jK        |'jL        |'jM        |'jN        j        |(f
¦  «         ŒŒt          |%¦  «        |d<   d})tž          D ]v}*tk          j6        d„ |*jP        D ¦   «         ¦  «        }+|                     d|*jQ        |*jR        |*jS        j        |*jT        |*jU        |*jV        |*jW        |*jX        |+f	¦  «         |)dz  })Œw|)|d <   t³          ¦   «         },tµ          dd!¦  «        D ]Ã}-|,|-         }.t·          d"|-dz
  d#z  z   d¦  «        }/t·          d$d%|-dz
  z  z  d¦  «        }0t·          d&d'|-dz
  z  z  d¦  «        }1t·          d(d)|-dz
  z  z  d¦  «        }2t¹          |-¦  «        }3|                     d*|-|.j]        |.j^        |.j_        |/|0|1|2|3|.j`        |.ja        |.jb        |.jc        f¦  «         ŒÄd+|d,<   tÉ          |||	||¦  «        }4|4|d-<   g d.¢}5| e                    d/|5¦  «         t          |5¦  «        |d0<   g d1¢}6| e                    d2|6¦  «         t          |6¦  «        |d3<   g d4¢}7| e                    d5|7¦  «         t          |7¦  «        |d6<   g d7¢}8| e                    d8|8¦  «         t          |8¦  «        |d9<   |S ):uS   Náº¡p toÃ n bá»™ dá»¯ liá»‡u háº¡t giá»‘ng tá»« cÃ¡c Catalog chuáº©n vÃ o Database.z.UPDATE quests SET prerequisite_quest_id = NULL)Úportal_quarantine_rulesÚteleport_configsÚloot_allocation_modesÚparty_scaling_matrixÚcross_relationshipsÚprogression_benchmarksÚaffix_tiersÚskillsÚweapon_basesÚquestsÚmonster_archetypesÚnpcsÚzonesÚ
story_actszDELETE FROM zñ
            INSERT OR REPLACE INTO story_acts 
            (act_id, act_order, title, subtitle, level_min, level_max, primary_zone_id, climax_boss_id, climax_boss_name, description)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r>   zø
            INSERT OR REPLACE INTO zones
            (zone_id, act_id, name, zone_type, environment, min_level, max_level, bounds_width, bounds_height, default_spawn_x, default_spawn_y)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        é
   r=   z¦
            INSERT OR REPLACE INTO npcs
            (npc_id, name, title, role, zone_id, x, y, dialogue_tree_id)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        r<   r   Úmob_Ú_zò
                INSERT OR REPLACE INTO monster_archetypes
                (archetype_id, genus, sub_species_code, name, base_hp, base_dmg, base_scale, native_element, min_level)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            z (ú)é   r;   Nc                ó8   — g | ]}|j         |j        |j        d œ‘ŒS ))Úitem_idÚnameÚcount)rE   rF   Úquantity)Ú.0Úrs     r-   ú
<listcomp>z+seed_all_canonical_data.<locals>.<listcomp>z   s8   € ð 
ð 
ð 
àð œ	¨1¬6¸A¼JÐGÐGð
ð 
ð 
ó    aC  
            INSERT OR REPLACE INTO quests
            (quest_id, act_id, title, quest_type, required_level, zone_id, prerequisite_quest_id,
             target_monster_id, target_count, reward_exp, reward_meridian_points, reward_title, reward_items_json)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        F)Úensure_asciir:   a5  
            INSERT OR REPLACE INTO weapon_bases
            (weapon_id, name_vi, name_en, weapon_class, weapon_category, grip_style, sect, clan, element,
             required_level, base_dmg_min, base_dmg_max, attack_speed, crit_chance)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r9   c                ó   — g | ]	}|j         ‘Œ
S © ©rF   )rI   Úts     r-   rK   z+seed_all_canonical_data.<locals>.<listcomp>µ   s   € Ð6Ð6Ð6¨!˜qœvÐ6Ð6Ð6rL   zé
            INSERT OR REPLACE INTO skills
            (skill_id, skill_name, element, sect, weapon_requirement, base_damage, energy_cost, cooldown_ms, combo_role, tags_json)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r8   c                ó   — g | ]	}|j         ‘Œ
S rO   rP   )rI   Úslots     r-   rK   z+seed_all_canonical_data.<locals>.<listcomp>Ë   s   € ÐJÐJÐJ¨d ¤	ÐJÐJÐJrL   zÕ
            INSERT OR REPLACE INTO affix_tiers
            (mod_id, name, affix_type, tier, required_ilvl, min_value, max_value, weight, allowed_slots_json)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
        r7   ée   ç      Y@g      <@g      4@gìQ¸…ëñ?g      T@gš™™™™™ñ?g      (@gq=
×£pñ?a•  
            INSERT OR REPLACE INTO progression_benchmarks
            (level, target_exp, exp_to_next_level, 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_exp, monster_benchmark_exp)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r   r6   r5   ))rC   g      ð?ç        rV   rV   rV   ç      .@z'Solo: Base 1.0x HP, +0% EXP/Loot/Rarity)é   g      ø?ç      >@ç      I@rZ   rY   rW   z-Party 2: HP+50%, EXP+30%, Qty+50%, Rarity+30%)é   g       @ç      N@rU   rU   r\   rW   z/Party 3: HP+100%, EXP+60%, Qty+100%, Rarity+60%)é   g      @ç     €V@ç     Àb@r_   r^   rW   z/Party 4: HP+150%, EXP+90%, Qty+150%, Rarity+90%)é   g      @ç      ^@ç      i@rb   ra   rW   z1Party 5: HP+200%, EXP+120%, Qty+200%, Rarity+120%)r   ç      @r_   ç     @o@rd   r_   rW   z1Party 6: HP+250%, EXP+150%, Qty+250%, Rarity+150%zDINSERT OR REPLACE INTO party_scaling_matrix VALUES (?,?,?,?,?,?,?,?)r4   ))Ú	PERMANENTzPermanent AllocationrV   rC   z(Permanent item lock for allocated player)ÚSHORTzShort Allocationg      @r   z&5.0s temporary lock, then free for all)ÚFREE_FOR_ALLzFree-For-AllrV   r   z)Instant free pickup for all party membersz?INSERT OR REPLACE INTO loot_allocation_modes VALUES (?,?,?,?,?)r3   ))ÚPARTY_MEMBERrc   ç      $@rC   rC   zCTeleport to party member (cast 3.5s, cd 10s, cancel on move/damage))ÚFRIENDrc   ri   rC   rC   z=Teleport to friend (cast 3.5s, cd 10s, cancel on move/damage))Ú	GUILDMATErc   ri   rC   rC   z@Teleport to guildmate (cast 3.5s, cd 10s, cancel on move/damage))ÚTOWN_PORTALrc   ri   rC   rC   zATeleport via Town Portal to Hideout/Sanctuary (cast 3.5s, cd 10s)z<INSERT OR REPLACE INTO teleport_configs VALUES (?,?,?,?,?,?)r2   ))ÚRULE_OPEN_WORLDÚ
WILDERNESSrC   rC   r   z4Wilderness: 6 portals, boss & secret lockout enabled)ÚRULE_DUNGEONÚDUNGEONrC   rC   r   z1Dungeon: 6 portals, boss & secret lockout enabled)ÚRULE_SECRET_CHAMBERÚSECRET_CHAMBERrC   rC   r   z*Secret chamber: 0 portals, lockout enabled)ÚRULE_SAFE_HAVENÚ
SAFE_HAVENr   r   r   z!Safe haven: 6 portals, no lockoutzCINSERT OR REPLACE INTO portal_quarantine_rules VALUES (?,?,?,?,?,?)r1   )fr!   r"   r   ÚitemsÚ_parse_level_rangeÚrecommended_level_rangeÚactÚvalueÚ
_act_orderÚtitleÚsubtitleÚprimary_zone_idÚclimax_boss_idÚclimax_boss_nameÚdescriptionÚlenr	   r=   Ú_resolve_zone_actÚzone_idrF   Ú	zone_typeÚenvironmentÚ	min_levelÚbounds_widthÚbounds_heightÚdefault_spawn_xÚdefault_spawn_yr
   Únpc_idÚroleÚxÚyÚdialogue_tree_idr   r   ÚgetÚlowerr   Ú_quest_registryÚ
objectivesÚ	target_idÚtarget_countÚprerequisite_quest_idsÚrewardÚspirit_stonesÚ_resolve_quest_zoneÚact_idÚquest_idÚ
quest_typeÚrequired_levelÚexpÚmeridian_pointsÚjsonÚdumpsr   Ú	weapon_idÚname_viÚname_enÚweapon_classÚcategoryÚ
grip_styleÚsect_affinityÚclan_affinityÚelementÚ
min_damageÚ
max_damageÚattacks_per_secondÚbase_crit_chancer   ÚtagsÚskill_idÚ
skill_nameÚsectÚweapon_requirementÚbase_damageÚenergy_costÚcooldown_msÚ
combo_roler   Úallowed_slotsÚmod_idÚmod_nameÚ
affix_typeÚtierÚrequired_ilvlÚmin_valÚmax_valÚweightr   ÚrangeÚroundÚ_resolve_max_affix_tierÚ
target_expÚexp_to_next_levelÚcumulative_expÚdeath_penalty_ratioÚlevel_gap_safe_rangeÚlevel_gap_penalty_expÚmonster_benchmark_expÚ_seed_cross_relationshipsÚexecutemany)9r   Ústatsr(   ÚtblÚactsÚact_enumÚact_defÚlvl_minÚlvl_maxÚzone_enginerƒ   Úzone_defrš   r<   ÚnpcÚmonster_countÚgenusÚ	base_nameÚbase_hpÚbase_dmgÚ
base_scaleÚnative_elemÚsub_listÚsub_codeÚsub_nameÚarch_idÚquest_engineÚq_idÚq_defÚ
target_mobÚ
target_cntÚprereqÚreward_itemsÚq_zoneÚweaponsÚwidÚwr8   ÚsidÚsÚtags_strÚaffix_countÚaffixÚ	slots_strÚexp_benchmarksÚlvlÚbenchÚp_hpÚp_dpsÚm_hpÚm_dpsÚmax_tierÚ	rel_countÚp_dataÚl_dataÚt_dataÚq_datas9                                                            r-   r&   r&   +   sÂ  € à€EØ
�+Š+‰-Œ-€Cð ‡K‚KÐ@ÑAÔAÐAðð *ð *ˆð
 	�ŠÐ( 3Ð(Ð(Ñ)Ô)Ð)Ð)õ ÑÔ€DØ!ŸZšZ™\œ\ð 
ð 
Ñˆ�'Ý-¨gÔ.MÑNÔNÑˆ�Ø�Šð ð
 ŒKÔ�z¨'¬+Ô*;Ñ<Ô<¸g¼mÈWÔM]Ø�W˜gÔ5°wÔ7MØÔ$ gÔ&9ð
ñ		ô 	ð 	ð 	õ ˜d™)œ)€Eˆ,Ñõ ‘,”,€KØ(Ô.×4Ò4Ñ6Ô6ð 
ð 
Ñˆ�Ý" 7Ñ+Ô+ˆØ�Šð ð
 Ô˜f h¤m°XÔ5GÔ5LÈhÔNbÔNgØÔ Ô 2°RÑ 7¸Ô9NØÔ" HÔ$<¸hÔ>Vð
ñ		ô 	ð 	ð 	õ ˜Ô*Ñ+Ô+€Eˆ'�Nõ !Ñ"Ô"€DØð pð pˆØ�Šð ð Œj˜#œ( C¤I¨s¬x¬}¸c¼kÈ3Ì5ÐRUÔRWÐY\ÔYmÐnñ		pô 	pð 	pð 	põ
 ˜‘I”I€Eˆ&�Mð €MÝJZÔJ`ÑJbÔJbð 	ð 	ÑFˆÑF�	˜7 H¨j¸+Ý&Ô*¨5°"Ñ5Ô5ˆØ"*ð 	ð 	ÑˆH�hØD˜UœZ×-Ò-Ñ/Ô/ÐDÐD°(·.².Ñ2BÔ2BÐDÐDˆGØ�KŠKð ð ˜5œ: x°IÐ1LÐ1LÀÐ1LÐ1LÐ1LÈgÐW_ÐakÐmxÔm}ð  @Að  Bñ	Cô Cð Cð
 ˜QÑˆMˆMð	ð #0€EÐ
Ñõ /Ñ0Ô0€LØ#Ô3×9Ò9Ñ;Ô;ð $ð $‰ˆˆeàˆ
Øˆ
ØÔð 	:ØÔ)¨!Ô,Ô6ˆJØÔ)¨!Ô,Ô9ˆJà49Ô4PÐZ�Ô-¨aÔ0Ð0ÐVZˆð
ð 
à”\Ô/ð
ñ 
ô 
ˆõ % T¨5¬<Ñ8Ô8ˆà�Šð ð ŒNØŒLØŒKØÔÔ!ØÔ ØØØØØŒLÔØŒLÔ(ØŒLÔÝŒJ�|°%Ð8Ñ8Ô8ð
ñ	ô 	ð 	ð 	õ( ˜,Ô6Ñ7Ô7€Eˆ(�Oõ &Ñ'Ô'€GØ—-’-‘/”/ð ð ‰ˆˆQØ�Šð ð ŒKØŒIØŒIØŒNÔØŒJŒOØŒLÔØŒOÔ ØŒOÔ ØŒIŒNØÔØŒLØŒLØÔ ØÔð
ñ	ô 	ð 	ð 	õ*   ™LœL€Eˆ.Ñõ +Ñ,Ô,€FØ—,’,‘.”.ð ð ‰ˆˆQÝ”:Ð6Ð6¨q¬vÐ6Ñ6Ô6ÀUÐKÑKÔKˆØ�Šð ð
 ŒJØŒLØŒIŒNØŒFŒKØÔ Ô%ØŒMØŒMØŒMØŒLÔØð
ñ		ô 	ð 	ð 	õ  ˜&‘k”k€Eˆ(�Oð €KÝ,ð ð ˆÝ”JÐJÐJ°eÔ6IÐJÑJÔJÑKÔKˆ	Ø�Šð ð
 ŒLØŒNØÔÔ!ØŒJØÔØŒMØŒMØŒLØð

ñ		ô 	ð 	ð 	�qÑˆˆØ&€Eˆ-Ñõ 3Ñ4Ô4€NÝ�Q˜‰}Œ}ð ð ˆØ˜sÔ#ˆÝ�U˜c A™g¨Ñ-Ñ-¨qÑ1Ô1ˆÝ�d˜d s¨Q¡wÑ/Ñ0°!Ñ4Ô4ˆÝ�T˜T c¨A¡gÑ.Ñ/°Ñ3Ô3ˆÝ�d˜d s¨Q¡wÑ/Ñ0°!Ñ4Ô4ˆÝ*¨3Ñ/Ô/ˆà�Šð ð �Ô! 5Ô#:¸EÔ<PØ�%˜˜u hØÔ% uÔ'AØÔ'¨Ô)Dð	
ñ	ô 	ð 	ð 	ð '*€EÐ
"Ñ#õ *¨#¨t°[À$ÈÑUÔU€IØ#,€EÐ
Ñ ðð ð €Fð ‡O‚OÐZÐ\bÑcÔcÐcÝ$'¨¡K¤K€EÐ
 Ñ!ðð ð €Fð
 ‡O‚OÐUÐW]Ñ^Ô^Ð^Ý%(¨¡[¤[€EÐ
!Ñ"ðð ð €Fð ‡O‚OÐRÐTZÑ[Ô[Ð[Ý # F¡¤€EÐ
Ñðð ð €Fð ‡O‚OÐYÐ[aÑbÔbÐbÝ'*¨6¡{¤{€EÐ
#Ñ$à€LrL   rš   ÚstrÚintc                ó>   — ddddddœ}|                      | d¦  «        S )NrC   rX   r[   r]   r`   )ÚACT_I_HUNGERÚACT_II_MIASMAÚACT_III_CRUCIBLEÚACT_IV_TITAN_HUNTÚACT_V_SOVEREIGNéc   ©r�   )rš   Ú	order_maps     r-   rz   rz   &  s+   € Ø!"°QÈAÐdeÐz{Ð|Ð|€IØ�=Š=˜ Ñ$Ô$Ð$rL   Ú	range_strútuple[int, int]c                ó–  — |                       dd¦  «                              dd¦  «                              dd¦  «                             ¦   «         }d|v rt|                     d¦  «        }	 t          |d                              ¦   «         ¦  «        t          |d                              ¦   «         ¦  «        fS # t          $ r Y nw xY wdS )	Nu   Cáº¥pÚ ÚLevelú+ú-r   rC   )rC   r?   )ÚreplaceÚstripÚsplitr  Ú
ValueError)r  ÚcleanÚpartss      r-   rv   rv   +  s¾   € Ø×Ò˜g rÑ*Ô*×2Ò2°7¸BÑ?Ô?×GÒGÈÈRÑPÔP×VÒVÑXÔX€EØ
ˆe€|€|Ø—’˜CÑ Ô ˆð	Ý�u˜Q”x—~’~Ñ'Ô'Ñ(Ô(­#¨e°A¬h¯nªnÑ.>Ô.>Ñ*?Ô*?Ð?Ð?øÝð 	ð 	ð 	ØˆDð	øøøàˆ5s   Á+AB9 Â9
CÃCrƒ   c                ó>   — ddddddœ}|                      | d¦  «        S )Nr  r  r  )Úzone_boundless_sanctuaryÚzone_player_hideoutÚzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormr	  )rƒ   Úzone_act_maps     r-   r‚   r‚   6  s3   € à$2È>Ø-ÈOØ$6ðð €Lð
 ×Ò˜G ^Ñ4Ô4Ð4rL   r›   úOptional[str]c                óF   — d| v s|dk    rdS d| v s|dk    rdS |dk    rdnd	S )
NÚ	tang_kiemr  r  Úancientr  r  r  r  r  rO   )r›   rš   s     r-   r™   r™   ?  sP   € Ø�hÐÐ &¨NÒ":Ð":Ø$Ð$Ø�HÐÐ ¨/Ò 9Ð 9Ø*Ð*Ø)/Ð3EÒ)EÐ)EÐ%Ð%ÐKeÐerL   rô   c                óT   — t          t          ¦  «        D ]\  }}| |k    r|dz   c S ŒdS )NrC   é   )Ú	enumerater   )rô   ÚidxÚilvls      r-   rÃ   rÃ   G  s=   € Ý�~Ñ.Ô.ð ð ‰	ˆˆTØ�$Š;ˆ;Ø˜‘7ˆNˆNˆNð àˆ2rL   r(   úsqlite3.CursorrÏ   r   rÔ   r<   râ   c                ó(  — d„ |                      ¦   «         D ¦   «         d„ |                      ¦   «         D ¦   «         z   d„ |D ¦   «         z   d„ |j                             ¦   «         D ¦   «         z   }|                      d|¦  «         t	          |¦  «        S )Nc                óV   — g | ]&}d |j         j        › �d|j         j        dd|j        f‘Œ'S )Úrel_act_zone_ÚACTÚACT_CONTAINS_ZONEÚZONE)rx   ry   r}   ©rI   Úas     r-   rK   z-_seed_cross_relationships.<locals>.<listcomp>O  sI   € ð ð ð ØpqÐ	&˜œœÐ	&Ð	&¨¨q¬u¬{Ð<OÐQWÐYZÔYjÐkðð ð rL   c                óV   — g | ]&}d |j         j        › �d|j         j        dd|j        f‘Œ'S )Úrel_act_boss_r,  ÚBOSS_CLIMAX_FOR_ACTÚBOSS)rx   ry   r~   r/  s     r-   rK   z-_seed_cross_relationships.<locals>.<listcomp>Q  sI   € ð 	ð 	ð 	ØqrÐ	&˜œœÐ	&Ð	&¨¨q¬u¬{Ð<QÐSYÐ[\Ô[kÐlð	ð 	ð 	rL   c                óB   — g | ]}d |j         › �d|j        dd|j         f‘ŒS )Úrel_zone_npc_r.  ÚZONE_HOUSES_NPCÚNPC)r‹   rƒ   )rI   Úns     r-   rK   z-_seed_cross_relationships.<locals>.<listcomp>S  sD   € ð 	ð 	ð 	Ø`aÐ	#˜œÐ	#Ð	# V¨Q¬YÐ8IÈ5ÐRSÔRZÐ[ð	ð 	ð 	rL   c           	     óH   — g | ]\  }}|j         pg D ]}d |› d|› �d|dd|f‘ŒŒ S )Úrel_quest_prereq_rA   ÚQUESTÚQUEST_REQUIRES_PREREQUISITE)r–   )rI   ÚqidÚqÚpres       r-   rK   z-_seed_cross_relationships.<locals>.<listcomp>U  si   € ð 	ð 	ð 	áˆC�ÀqÔG_ÐGeÐceð	ð 	à?Bð 
)˜SÐ	(Ð	( 3Ð	(Ð	(¨'°3Ð8UÐW^Ð`cÐdð	ð 	ð 	ð 	rL   z‘INSERT OR REPLACE INTO cross_relationships (relation_id, source_type, source_id, relation_type, target_type, target_id) VALUES (?, ?, ?, ?, ?, ?))Úvaluesr’   ru   rÌ   r�   )r(   rÏ   rÔ   r<   râ   Ú	relationss         r-   rË   rË   N  sù   € ðð Øuy÷  vAò  vAñ  vCô  vCðñ ô ð	ð 	Øvz÷  wBò  wBñ  wDô  wDð	ñ 	ô 	ñð	ð 	Øeið	ñ 	ô 	ñ	ð	ð 	à"Ô2×8Ò8Ñ:Ô:ð	ñ 	ô 	ñ	€Ið ‡O‚Oð 	\Øñô ð õ ˆy‰>Œ>ÐrL   )NF)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  r   r   )rô   r  r   r  )r(   r(  rÏ   r   rÔ   r   r<   r   râ   r   r   r  )&Ú__doc__Ú
__future__r   r    r$   Útypingr   r   r   r   Úserver.world.storyline_catalogr   Úserver.world.zone_enginer	   Úserver.world.npc_catalogr
   Úserver.world.quest_enginer   Ú&server.world.monster_archetype_catalogr   r   Úserver.world.weapon_catalogr   Úserver.world.martial_catalogr   Úserver.world.item_affix_catalogr   r   Ú$server.world.level_progression_curver   r    r&   rz   rv   r‚   r™   rÃ   rË   rO   rL   r-   ú<module>rO     s¿  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à =Ð =Ð =Ð =Ð =Ð =Ø /Ð /Ð /Ð /Ð /Ð /Ø :Ð :Ð :Ð :Ð :Ð :Ø AÐ AÐ AÐ AÐ AÐ AØ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø FÐ FÐ FÐ FÐ FÐ FØ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ NÐ NÐ NÐ NÐ NÐ Nðð ð ð ð ð(xð xð xð xðv%ð %ð %ð %ð
ð ð ð ð5ð 5ð 5ð 5ðfð fð fð fðð ð ð ðð ð ð ð ð rL   