§
    þ¨½ja   ã                   ób  — U d Z ddlmZmZmZmZ 	 ddlmZ ddlm	Z	m
Z
mZ n# e$ r ddlmZ ddlm	Z	m
Z
mZ Y nw xY wddddd	d
ddd
ddœ
dddddddddddœ
dddddddddddœ
d d!d"d#d$d%d&d'd%d(dœ
d)d*d+d,d-d.d/d0d.d1dœ
d2d3d4d5d6d7d8dd7d9dœ
d:d;d<d=dd>d?d%d>d@dœ
dAdBdCdDdEdFdGdHdFdIdœ
dJdKdLdMd
dNdOdPdNdQdœ
dRdSdTddUdVdWdXdVdYdœ
dZd[d\dOd]d^d_d`d^dadœ
dbdcdddedPdfdgdVdfdhdœ
didjdkdldmdndodpdndqdœ
drdRdsdtdudvdwdxdydzdœ
d{dd|dwdnd}d~dydvddœ
gZeeeef                  ed€<   e
j        d�e
j        d‚e
j        dƒe
j        d„e
j        d…e
j        d†iZee
ef         ed‡<   dˆed‰efdŠ„Zd‹eeef         d‰ee	         fdŒ„Zd�„ eD ¦   «         Zeeee	         f         edŽ<   dˆed�ed�ed‰ee	d‘f         fd’„Zd“ed”ed•ed–ee	d‘f         d‰eeeef         f
d—„Zd˜S )™z¡
Procedural 15-Tier Affix Catalog for FreeExile Monsters.
Defines T1 (Apex) to T15 (Novice) affixes across survival, offensive,
elemental, and speed categories.
é    )ÚDictÚListÚOptionalÚTuple)ÚFiveElements)ÚMonsterAffixÚMonsterAffixCategoryÚMonsterRanké   éU   é   gš™™™™™@g      ø?gÍÌÌÌÌÌÜ?gš™™™™™ý?g      è?gffffffÖ¿)
ÚtierÚmin_lvlÚweightÚhp_mÚarm_mÚres_mÚdmg_mÚelem_mÚspd_mÚwup_mé   éP   é-   gffffff @gÍÌÌÌÌÌô?gš™™™™™Ù?g      ü?gÍÌÌÌÌÌä?g{®GázÔ¿é   éK   g¸…ëQ¸þ?gffffffò?gffffffÖ?gffffffú?gìQ¸…ëá?gìQ¸…ëÑ¿é   éF   én   gÍÌÌÌÌÌü?ç      ð?g333333Ó?gö(\�Âõø?g¸…ëQ¸Þ?g      Ð¿é   éA   é    g333333û?g)\�Âõ(ì?g¤p=
×£Ð?g®Gáz®÷?g=
×£p=Ú?g)\�Âõ(Ì¿é   é<   éÜ   gš™™™™™ù?gR¸…ëQè?g)\�Âõ(Ì?g�Âõ(\�ö?gR¸…ëQÈ¿é   é6   i"  gR¸…ëQø?gR¸…ëQÈ?gš™™™™™õ?g{®GázÄ¿é   é0   ir  g
×£p=
÷?gš™™™™™á?g{®GázÄ?g¤p=
×£ô?g      Ð?gìQ¸…ëÁ¿é	   é*   iÌ  gìQ¸…ëõ?g¤p=
×£À?g×£p=
×ó?gáz®GáÊ?g¸…ëQ¸¾¿é
   é$   i0  g
×£p=
×?g)\�Âõ(¼?g333333ó?gÃõ(\�ÂÅ?gš™™™™™¹¿é   é   iž  gìQ¸…ëÑ?g
×£p=
·?g�Âõ(\�ò?gìQ¸…ëÁ?g{®Gáz´¿é   é   i  g
×£p=
ó?gìQ¸…ë±?gìQ¸…ëñ?g¸…ëQ¸®¿é   é   i˜  g=
×£p=ò?g333333Ã?gš™™™™™©?gq=
×£pñ?g{®Gáz´?gš™™™™™©¿é   i  gš™™™™™ñ?gš™™™™™¹?g¸…ëQ¸ž?gö(\�Âõð?g¸…ëQ¸®?g{®Gáz¤?g{®Gáz¤¿é   i°  g{®Gáz”?g¤p=
×£ð?g¸…ëQ¸ž¿Ú
TIER_SPECSu   Thiáº¿t Cá»‘tzKim Cangu   Cuá»“ng Báº¡ou   Liá»‡t Diá»…mu   LÃ´i Ä�Ã¬nhu   Táº­t PhongÚTIER_NAME_PREFIXESÚlevelÚreturnc                 óz   — t           D ]2}| t          |d         ¦  «        k    rt          |d         ¦  «        c S Œ3dS )zDReturns the highest eligible affix tier (1 to 15) for a given level.r   r   r6   )r7   Úint)r9   Úspecs     ú;C:\Projects\FreeExile\server\world\monster_affix_catalog.pyÚget_tier_for_levelr?   4   sJ   € åð %ð %ˆØ•C˜˜YœÑ(Ô(Ò(Ð(Ý�t˜F”|Ñ$Ô$Ð$Ð$Ð$ð )àˆ2ó    r=   c                 óê  — t          | d         ¦  «        }t          | d         ¦  «        }t          d|› �t          t          j                 › d|› �t          j        ||d| d         i¬¦  «        t          d|› �t          t          j                 › d|› �t          j        ||d	| d
         z   d	| d         z   dœ¬¦  «        t          d|› �t          t          j                 › d|› �t          j        ||d| d         i¬¦  «        t          d|› �t          t          j                 › d|› �t          j        ||dd	| d         z   it          j	        ¬¦  «        t          d|› �t          t          j
                 › d|› �t          j
        ||dd	| d         z   it          j        ¬¦  «        t          d|› �t          t          j                 › d|› �t          j        ||d	| d         z   d	| d         z   dœ¬¦  «        gS )z>Builds the 6 standard affixes for a single tier specification.r   r   Ú
affix_hp_tz TÚhp_multr   )Úaffix_idÚnameÚcategoryr   Ú	min_levelÚstat_multipliersÚaffix_def_tr    r   r   )Ú
armor_multÚres_multÚaffix_dmg_tÚdmg_multr   Úaffix_fire_tÚelem_dmg_multr   )rD   rE   rF   r   rG   rH   ÚelementÚaffix_lightning_tÚaffix_spd_tr   r   )Ú
speed_multÚwindup_mult)r<   r   r8   r	   ÚSURVIVAL_HPÚSURVIVAL_DEFENSEÚOFFENSIVE_DAMAGEÚELEMENTAL_FIREr   ÚHOAÚELEMENTAL_LIGHTNINGÚKIMÚTACTICAL_SPEED)r=   ÚtÚlvls      r>   Ú_build_tier_affixesr_   <   sU  € åˆD�ŒLÑÔ€AÝ
ˆd�9ŒoÑ
Ô
€CåØ% !Ð%Ð%Ý&Õ';Ô'GÔHÐOÐOÈAÐOÐOÝ)Ô5ØØØ'¨¨f¬Ð6ð	
ñ 	
ô 	
õ 	Ø& 1Ð&Ð&Ý&Õ';Ô'LÔMÐTÐTÐQRÐTÐTÝ)Ô:ØØØ,/°$°w´-Ñ,?ÈSÐSWÐX_ÔS`ÑM`ÐaÐað	
ñ 	
ô 	
õ 	Ø& 1Ð&Ð&Ý&Õ';Ô'LÔMÐTÐTÐQRÐTÐTÝ)Ô:ØØØ(¨$¨w¬-Ð8ð	
ñ 	
ô 	
õ 	Ø' AÐ'Ð'Ý&Õ';Ô'JÔKÐRÐRÈqÐRÐRÝ)Ô8ØØØ-¨s°T¸(´^Ñ/CÐDÝ Ô$ð	
ñ 	
ô 	
õ 	Ø,¨Ð,Ð,Ý&Õ';Ô'OÔPÐWÐWÐTUÐWÐWÝ)Ô=ØØØ-¨s°T¸(´^Ñ/CÐDÝ Ô$ð	
ñ 	
ô 	
õ 	Ø& 1Ð&Ð&Ý&Õ';Ô'JÔKÐRÐRÈqÐRÐRÝ)Ô8ØØØ,/°$°w´-Ñ,?ÐPSÐVZÐ[bÔVcÑPcÐdÐdð	
ñ 	
ô 	
ðW3ð 3r@   c                 óT   — i | ]%}t          |d          ¦  «        t          |¦  «        “Œ&S )r   )r<   r_   )Ú.0r=   s     r>   ú
<dictcomp>rb   v   s<   € ð 8ð 8ð 8Ø59…CˆˆVŒÑÔÕ*¨4Ñ0Ô0ð8ð 8ð 8r@   ÚMONSTER_AFFIX_CATALOGÚrankÚseed.c                 óš  ‡— |t           j        k    r|dz  dk    rdnd}n:|t           j        k    r	d|dz  z   }n!|t           j        k    r	d|dz  z   }nd|dz  z   }|dk    rdS t	          | ¦  «        }g }t          ¦   «         Št          |¦  «        D ]­}||dz   z  |dz  z   dz  }t          d||z   ¦  «        }t           	                    |t          d         ¦  «        }	ˆfd	„|	D ¦   «         }
|
s|	}
||d
z  z   t          |
¦  «        z  }|
|         }|                     |¦  «         ‰                     |j        ¦  «         Œ®t          |¦  «        S )z¥
    Rolls procedural affixes deterministically according to monster rank and level.
    Higher ranks roll more affixes. Apex tiers (T1-T5) require level >= 65.
    r   r   r   r   r   © r'   r6   c                 ó&   •— g | ]}|j         ‰v¯|‘ŒS rg   )rF   )ra   ÚaÚused_categoriess     €r>   ú
<listcomp>z(roll_monster_affixes.<locals>.<listcomp>—   s%   ø€ ÐJÐJÐJ˜1¨¬
¸/Ð(IÐ(I�QÐ(IÐ(IÐ(Ir@   é   )r
   ÚCOMMONÚMAGICÚRAREr?   ÚsetÚrangeÚminrc   ÚgetÚlenÚappendÚaddrF   Útuple)r9   rd   re   Úaffix_countÚ	base_tierÚchosenÚidxÚtier_offsetÚactual_tierÚpoolÚ	availableÚ
choice_idxÚaffixrj   s                @r>   Úroll_monster_affixesr‚   {   s€  ø€ ð
 �{Ô!Ò!Ð!Ø  1™H¨šM˜M�a�a°ˆˆØ	•Ô"Ò	"Ð	"Ø˜4 !™8‘nˆˆØ	•Ô!Ò	!Ð	!Ø˜4 !™8‘nˆˆà˜4 !™8‘nˆà�aÒÐØˆrå" 5Ñ)Ô)€Ià!#€FÝ™5œ5€Oå�[Ñ!Ô!ð ,ð ,ˆØ  a¡Ñ(¨3°©7Ñ2°aÑ7ˆÝ˜"˜i¨+Ñ5Ñ6Ô6ˆÝ$×(Ò(¨Õ6KÈBÔ6OÑPÔPˆð KÐJÐJÐJ ÐJÑJÔJˆ	Øð 	ØˆIØ˜S 2™X‘o­¨Y©¬Ñ7ˆ
Ø˜*Ô%ˆØ�Š�eÑÔÐØ×Ò˜EœNÑ+Ô+Ð+Ð+å�‰=Œ=Ðr@   Úbase_hpÚbase_damageÚ
base_armorÚaffixesc                 ó  — d}d}d}|D ]M}d|j         v r||j         d         z  }d|j         v r||j         d         z  }d|j         v r||j         d         z  }ŒNt          | |z  d¦  «        t          ||z  d¦  «        t          ||z  d¦  «        fS )zEAggregates affix stat multipliers and applies them to baseline stats.r    rC   rM   rJ   r   )rH   Úround)rƒ   r„   r…   r†   rC   rM   Úarm_multr�   s           r>   Úapply_affixes_to_statsrŠ   ¢   sÅ   € ð €GØ€HØ€Hàð =ð =ˆØ˜Ô.Ð.Ð.Ø�uÔ-¨iÔ8Ñ8ˆGØ˜Ô/Ð/Ð/Ø˜Ô.¨zÔ:Ñ:ˆHØ˜5Ô1Ð1Ð1Ø˜Ô.¨|Ô<Ñ<ˆHøõ 	ˆg˜Ñ Ñ#Ô#Ýˆk˜HÑ$ aÑ(Ô(Ýˆj˜8Ñ# QÑ'Ô'ðð r@   N) Ú__doc__Útypingr   r   r   r   Úserver.world.martial_matrixr   Úserver.world.monster_typesr   r	   r
   ÚImportErrorÚworld.martial_matrixÚworld.monster_typesr7   ÚstrÚfloatÚ__annotations__rU   rV   rW   rX   rZ   r\   r8   r<   r?   r_   rc   r‚   rŠ   rg   r@   r>   ú<module>r•      sS  ððð ð ð /Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .ðØ8Ð8Ð8Ð8Ð8Ð8ðð ð ð ð ð ð ð ð ð ð øð
 ð ð ð Ø1Ð1Ð1Ð1Ð1Ð1ðð ð ð ð ð ð ð ð ð ð ð ðøøøð ˜2¨°TÀDÐSWÐbfÐrvð  BFð  QVð  Wð  WØ˜2¨°TÀDÐSWÐbfÐrvð  BFð  QVð  Wð  WØ˜2¨°TÀDÐSWÐbfÐrvð  BFð  QVð  Wð  WØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜2¨°dÀTÐTXÐcgÐswð  CGð  RWð  Xð  XØ˜B¨#°tÀdÐUYÐdhÐtxð  DHð  SXð  Yð  YØ˜B¨#°tÀdÐUYÐdhÐtxð  DHð  SXð  Yð  YØ˜B¨#°tÀdÐUYÐdhÐtxð  DHð  SXð  Yð  YØ˜B¨#°tÀdÐUYÐdhÐtxð  DHð  SXð  Yð  YØ˜B¨$¸ÀtÐVZÐeiÐuyð  EIð  TYð  Zð  ZØ˜A¨°tÀdÐUYÐdhÐtxð  DHð  SXð  Yð  Yð&€
ˆD��c˜5�jÔ!Ô"ð ð ñ ð& Ô$ oØÔ)¨:ØÔ)¨?ØÔ'¨ØÔ,¨mØÔ'¨ð7Ð �DÐ-¨sÐ2Ô3ð ð ñ ð˜cð  cð ð ð ð ð7˜d 3¨ :Ô.ð 7°4¸Ô3Eð 7ð 7ð 7ð 7ðt8ð 8Ø=Gð8ñ 8ô 8Ð �t˜C  lÔ!3Ð3Ô4ð ð ñ ð
$ ð $¨;ð $¸cð $ÀeÈLÐZ]ÐL]ÔF^ð $ð $ð $ð $ðNØðàðð ðð �< Ð$Ô%ð	ð
 ˆ5�%˜ÐÔðð ð ð ð ð s   ‘" ¢:¹: