§
    3ÙÀjj  ã                  óp   — d Z ddlmZ ddlZddlmZmZmZ ddlm	Z	m
Z
mZmZmZmZmZ  G d„ d¦  «        ZdS )zà
Monster & Boss Scaling Engine for FreeExile (PoE2 Spirit).
Calculates level-based power curves (Level 1..100), rank multipliers (Common, Magic, Rare, Boss),
Boss Stagger/Poise thresholds, and Boss Enrage phase transitions.
é    )ÚannotationsN)ÚDictÚListÚOptional)Ú	BossPhaseÚBossStaggerStateÚCombatantTypeÚDamageChannelÚDamagePacketÚDamageVectorÚDefenseSheetc                  óp   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Z	 ddd„Z	 ddd„Z	d d„Z
d!d„Zej        fd"d„ZdS )#ÚMonsterScalingEnginezLServer-authoritative mathematical formulas for monster and boss stat curves.ÚlevelÚintÚreturnÚfloatc                ó†   — t          d|¦  «        }t          dt          j        d|dz  z   d¦  «        z  d|z  z   d¦  «        S )z-Level 1..100 exponential life baseline curve.é   g      I@ç      ð?g      $@çÍÌÌÌÌÌü?ç      >@©ÚmaxÚroundÚmathÚpow©Úselfr   Úlvls      ú6C:\Projects\FreeExile\server\combat\monster_scaling.pyÚcalculate_base_lifez(MonsterScalingEngine.calculate_base_life   sB   € å�!�U‰mŒmˆÝ�T�DœH S¨C°$©JÑ%7¸Ñ=Ô=Ñ=ÀÈÁÑLÈaÑPÔPÐPó    c                ó–   — t          d|¦  «        }|dk    rdS t          dt          j        d|dz  z   d¦  «        z  d|z  z   d¦  «        S )zVLevel 1..100 exponential damage baseline curve (calibrated for level 1 survivability).r   g      @g       @r   g      (@çš™™™™™ù?g      @r   r   s      r!   Úcalculate_base_damagez*MonsterScalingEngine.calculate_base_damage   sP   € å�!�U‰mŒmˆØ�!Š8ˆ8Ø�3Ý�S�4œ8 C¨3°©:Ñ$6¸Ñ<Ô<Ñ<ÀÀcÁ	ÑJÈAÑNÔNÐNr#   c                ón   — t          d|¦  «        }t          dt          j        |d¦  «        z  d¦  «        S )zLevel 1..100 armour curve.r   g      .@g333333ó?r   r   s      r!   Úcalculate_base_armourz*MonsterScalingEngine.calculate_base_armour%   s0   € å�!�U‰mŒmˆÝ�T�DœH S¨#Ñ.Ô.Ñ.°Ñ2Ô2Ð2r#   c                ón   — t          d|¦  «        }t          dt          j        |d¦  «        z  d¦  «        S )zLevel 1..100 evasion curve.r   ç      4@gffffffò?r   r   s      r!   Úcalculate_base_evasionz+MonsterScalingEngine.calculate_base_evasion*   s0   € å�!�U‰mŒmˆÝ�T�DœH S¨$Ñ/Ô/Ñ/°Ñ3Ô3Ð3r#   r   Úrankr	   Ú
party_sizer   c                óö  — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }t          j        dt          j        dt          j        dt          j        di}d}|t          j	        k    rd}	d}
n€|t          j
        k    rd}	d}
|D ]}d||<   Œna|t          j        k    rd}	d}
|D ]}d||<   ŒnBd	}	d
}
d|t          j        <   d|t          j        <   d|t          j        <   d|t          j        <   d}t          d|dz
  ¦  «        }|t          j        k    r	dd|z  z   }n!|t          j        k    r	dd|z  z   }ndd|z  z   }dd|z  z   }d|z  }t          ||	z  |z  d¦  «        }t          ||
z  |z  d¦  «        }|D ]}t          d||         |z   ¦  «        ||<   Œt!          d||||dd|||t          j        dt          j        dt          j        dt          j        di|¬¦  «        S )z_Constructs a fully scaled DefenseSheet for a monster, factoring in level, rank, and party size.ç        r   gš™™™™™@çÍÌÌÌÌÌô?ç333333Ã?g      @r   g333333Ó?r*   ç      @çš™™™™™Ù?ç      Ð?r   r   gffffffæ?g      à?çš™™™™™¹?g{®Gáz”?g      è?)Údefender_idÚcombatant_typeÚdefender_levelÚmax_lifeÚcurrent_lifeÚmax_wardÚcurrent_wardÚarmourÚevasion_ratingÚresistancesÚmax_resistance_capsÚaoe_damage_reduction_pct)r"   r(   r+   r
   ÚFIREÚCOLDÚ	LIGHTNINGÚCHAOSr	   ÚMONSTER_COMMONÚMONSTER_MAGICÚMONSTER_RAREr   ÚBOSSr   Úminr   )r   r   r,   r-   Úbase_hpÚbase_armourÚbase_evasionr?   Úaoe_reductionÚhp_multÚarmour_multÚchÚextraÚhp_party_multÚarmour_party_multÚres_party_bonusÚfinal_hpÚfinal_armours                     r!   Úcreate_monster_defensez+MonsterScalingEngine.create_monster_defense/   sr  € ð ×*Ò*¨5Ñ1Ô1ˆØ×0Ò0°Ñ7Ô7ˆØ×2Ò2°5Ñ9Ô9ˆõ Ô ÝÔ ÝÔ# SÝÔ ð	3
ˆð ˆà•=Ô/Ò/Ð/ØˆGØˆKˆKØ•]Ô0Ò0Ð0ØˆGØˆKØ!ð 'ð '�Ø"&�˜B‘�ð'à•]Ô/Ò/Ð/ØˆGØˆKØ!ð 'ð '�Ø"&�˜B‘�ð'ð ˆGØˆKØ.2ˆK�Ô*Ñ+Ø.2ˆK�Ô*Ñ+Ø37ˆK�Ô/Ñ0Ø/3ˆK�Ô+Ñ,Ø ˆMõ �A�z A‘~Ñ&Ô&ˆØ•=Ô%Ò%Ð%Ø $¨¡,Ñ.ˆMˆMØ•]Ô/Ò/Ð/Ø $¨¡,Ñ.ˆMˆMà $¨¡,Ñ.ˆMà $¨¡,Ñ.ÐØ ™,ˆå˜ 7Ñ*¨]Ñ:¸AÑ>Ô>ˆÝ˜[¨;Ñ6Ð9JÑJÈAÑNÔNˆØð 	Kð 	KˆBÝ! $¨°B¬¸/Ñ(IÑJÔJˆK˜‰OˆOåØØØ ØØ!ØØØØ'Ø#åÔ" DÝÔ" DÝÔ'¨ÝÔ# Tð	!ð &3ð#
ñ 
ô 
ð 	
r#   c                ó2   — |                       |||¬¦  «        S )zDAlias for create_monster_defense with explicit party_size parameter.)r   r,   r-   )rX   )r   r   r,   r-   s       r!   Úcalculate_party_scaled_defensez3MonsterScalingEngine.calculate_party_scaled_defensez   s   € ð ×*Ò*°¸TÈjÐ*ÑYÔYÐYr#   Úboss_max_lifer   c                ój   — t          |dz  d¦  «        }t          t          d|¦  «        ddd¬¦  «        S )zŽ
        Creates PoE2 Stagger Poise meter:
        Capacity is 15% of Boss Max Life, ensuring deliberate heavy combo hits are needed.
        r1   r   g      Y@r/   Fr0   )Úmax_stagger_poiseÚcurrent_staggerÚis_staggeredÚstagger_damage_amplification)r   r   r   )r   r[   r   Ústagger_poises       r!   Úcreate_boss_stagger_statez.MonsterScalingEngine.create_boss_stagger_state€   sE   € õ
 ˜m¨dÑ2°AÑ6Ô6ˆÝÝ! %¨Ñ7Ô7ØØØ)-ð	
ñ 
ô 
ð 	
r#   Ú
current_hpÚmax_hpr   c                ó�   — |dk    rt           j        S ||z  }|dk    rt           j        S |dk    rt           j        S t           j        S )z<Determines Boss Enrage phase based on current HP percentage.r/   g…ëQ¸Õ?g…ëQ¸å?)r   ÚPHASE_1_NORMALÚPHASE_3_SAVAGE_FRENZYÚPHASE_2_ENRAGED)r   rc   rd   Úratios       r!   Úevaluate_boss_phasez(MonsterScalingEngine.evaluate_boss_phase�   sK   € à�SŠ=ˆ=ÝÔ+Ð+Ø˜VÑ#ˆØ�DŠ=ˆ=ÝÔ2Ð2Ø�dŠ]ˆ]ÝÔ,Ð,ÝÔ'Ð'r#   Úboss_idÚphaser   c                óJ  — |                       |¦  «        dz  }t          dt          j        |d¦  «        z  d¦  «        }i }g }d}|t          j        k    rnz|t          j        k    r%|                     d¦  «         d|t          j	        <   nE|t          j
        k    r5|                     d¦  «         d	|t          j	        <   d
|t          j        <   d}t          |t          j        |t          t          |dz  d¦  «        t          |dz  d¦  «        ¬¦  «        |dd|||d¬¦  «        S )zGConstructs an escalated outgoing attack packet according to Boss Phase.r2   r   gš™™™™™ñ?r   Fg      ô?r5   g      ø?r4   gš™™™™™É?Tg333333ã?r3   )ÚphysicalÚfirer%   r/   )Úattacker_idr7   Úattacker_levelÚdamage_vectorÚaccuracyÚcrit_chanceÚcrit_multiplierÚelemental_penetrationÚmore_damage_multipliersÚis_aoeÚstagger_impact)r&   r   r   r   r   rf   rh   Úappendr
   rB   rg   ÚPHYSICALr   r	   rI   r   )	r   rk   r   rl   Úbase_dmgrs   ÚpenetrationsÚ
more_multsrx   s	            r!   Úcreate_boss_attack_packetz.MonsterScalingEngine.create_boss_attack_packet˜   s=  € ð ×-Ò-¨eÑ4Ô4°sÑ:ˆÝ˜¥¤¨°Ñ 4Ô 4Ñ4°aÑ8Ô8ˆà35ˆØ"$ˆ
Øˆà•IÔ,Ò,Ð,ØØ•iÔ/Ò/Ð/Ø×Ò˜dÑ#Ô#Ð#Ø/3ˆL�Ô+Ñ,Ð,Ø•iÔ5Ò5Ð5Ø×Ò˜dÑ#Ô#Ð#Ø/3ˆL�Ô+Ñ,Ø37ˆL�Ô/Ñ0ØˆFåØÝ(Ô-Ø Ý&Ý˜x¨$™°Ñ2Ô2Ý˜8 d™?¨AÑ.Ô.ðñ ô ð ØØ Ø".Ø$.ØØð
ñ 
ô 
ð 	
r#   N)r   r   r   r   )r   )r   r   r,   r	   r-   r   r   r   )r[   r   r   r   r   r   )rc   r   rd   r   r   r   )rk   r   r   r   rl   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r&   r(   r+   rX   rZ   rb   rj   r   rf   r   © r#   r!   r   r      s  € € € € € ØVÐVðQð Qð Qð Qð
Oð Oð Oð Oð3ð 3ð 3ð 3ð
4ð 4ð 4ð 4ð BCðI
ð I
ð I
ð I
ð I
ðX BCðZð Zð Zð Zð Zð
ð 
ð 
ð 
ð	(ð 	(ð 	(ð 	(ð <EÔ;Sð%
ð %
ð %
ð %
ð %
ð %
ð %
r#   r   )rƒ   Ú
__future__r   r   Útypingr   r   r   Úcombat.combat_typesr   r   r	   r
   r   r   r   r   r„   r#   r!   ú<module>rˆ      sà   ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðg
ð g
ð g
ð g
ð g
ñ g
ô g
ð g
ð g
ð g
r#   