§
    7½»jß  ã                  ó6  — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZ  G d„ dee¦  «        Z G d„ d	ee¦  «        Z G d
„ dee¦  «        Z G d„ dee¦  «        Z edd¬¦  «         G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         Z edd¬¦  «         G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         ZdS )z¶
Combat Types, Enums and Data Models for FreeExile.
Defines DamageChannels, Combatant Types, Boss Stagger & Enrage States,
Ailments, Damage Packets, Defense Sheets, and Hit Results.
é    )Úannotations)Ú	dataclassÚfield)ÚEnum)ÚDictÚListÚOptionalc                  ó&   — e Zd ZdZdZdZdZdZdZdS )ÚDamageChannelz"Core damage channels in FreeExile.ÚPHYSICALÚFIREÚCOLDÚ	LIGHTNINGÚCHAOSN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   © ó    ú3C:\Projects\FreeExile\server\combat\combat_types.pyr   r      s-   € € € € € Ø,Ð,Ø€HØ€DØ€DØ€IØ€E€E€Er   r   c                  ó*   — e Zd ZdZdZdZdZdZdZdZ	dS )	ÚCombatantTypez"Categorization of combat entities.ÚPLAYERÚMINIONÚMONSTER_COMMONÚMONSTER_MAGICÚMONSTER_RAREÚBOSSN)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s2   € € € € € Ø,Ð,Ø€FØ€FØ%€NØ#€MØ!€LØ€D€D€Dr   r   c                  ó*   — e Zd ZdZdZdZdZdZdZdZ	dS )	ÚAilmentTypez Elemental and physical ailments.ÚIGNITEÚCHILLÚFREEZEÚSHOCKÚBLEEDÚPOISONN)
r   r   r   r   r"   r#   r$   r%   r&   r'   r   r   r   r!   r!       s2   € € € € € Ø*Ð*Ø€FØ€EØ€FØ€EØ€EØ€F€F€Fr   r!   c                  ó"   — e Zd ZdZdZdZdZdZdS )Ú	BossPhasez=Multi-phase enrage stages for Map Bosses and Pinnacle Bosses.ÚPHASE_1_NORMALÚPHASE_2_ENRAGEDÚPHASE_3_SAVAGE_FRENZYÚ	STAGGEREDN)r   r   r   r   r*   r+   r,   r-   r   r   r   r)   r)   *   s)   € € € € € ØGÐGØ%€NØ'€OØ3ÐØ€I€I€Ir   r)   T)ÚslotsÚfrozenc                  ój   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	ded<   dd
„Z
dd„ZdS )ÚDamageVectorz=Multi-channel raw damage values for a single attack or spell.ç        ÚfloatÚphysicalÚfireÚcoldÚ	lightningÚchaosÚreturnc                óP   — | j         | j        z   | j        z   | j        z   | j        z   S )N)r4   r5   r6   r7   r8   )Úselfs    r   Ú	total_rawzDamageVector.total_raw;   s&   € ØŒ}˜tœyÑ(¨4¬9Ñ4°t´~ÑEÈÌ
ÑRÐRr   Úchannelr   c                óì   — |t           j        k    r| j        S |t           j        k    r| j        S |t           j        k    r| j        S |t           j        k    r| j        S |t           j	        k    r| j
        S dS )Nr2   )r   r   r4   r   r5   r   r6   r   r7   r   r8   )r;   r=   s     r   Úget_channelzDamageVector.get_channel>   su   € Ø•mÔ,Ò,Ð,Ø”=Ð Ø�Ô*Ò*Ð*Ø”9ÐØ�Ô*Ò*Ð*Ø”9ÐØ�Ô/Ò/Ð/Ø”>Ð!Ø�Ô+Ò+Ð+Ø”:ÐØˆsr   N)r9   r3   )r=   r   r9   r3   )r   r   r   r   r4   Ú__annotations__r5   r6   r7   r8   r<   r?   r   r   r   r1   r1   2   s�   € € € € € € àGÐGØ€HÐÐÐÑØ€DÐÐÐÑØ€DÐÐÐÑØ€IÐÐÐÑØ€EÐÐÐÑðSð Sð Sð Sðð ð ð ð ð r   r1   )r.   c                  óö   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   dZd
ed<   dZd
ed<    ee	¬¦  «        Z
ded<   dZd
ed<    ee¬¦  «        Zded<   dZded<   dZd
ed<    ee	¬¦  «        Zded<   dS )ÚDamagePacketzJOutgoing attack payload sent from attacker to damage calculation pipeline.ÚintÚattacker_idr   Úcombatant_typeÚattacker_levelr1   Údamage_vectorç     @�@r3   Úaccuracygš™™™™™©?Úcrit_chanceg      ø?Úcrit_multiplier©Údefault_factoryúDict[DamageChannel, float]Úelemental_penetrationr2   Úincreased_damage_pctzList[float]Úmore_damage_multipliersFÚboolÚis_aoeÚstagger_impactzDict[AilmentType, float]Úailment_chanceN)r   r   r   r   r@   rI   rJ   rK   r   ÚdictrO   rP   ÚlistrQ   rS   rT   rU   r   r   r   rB   rB   L   s  € € € € € € àTÐTØÐÐÑØ!Ð!Ð!Ñ!ØÐÐÑØÐÐÑØ€HÐÐÐÑØ€KÐÐÐÑØ!€OÐ!Ð!Ð!Ñ!Ø8=¸ÈdÐ8SÑ8SÔ8SÐÐSÐSÐSÑSØ"%ÐÐ%Ð%Ð%Ñ%Ø+0¨5ÀÐ+FÑ+FÔ+FÐÐFÐFÐFÑFØ€FÐÐÐÑØ€NÐÐÐÑØ/4¨uÀTÐ/JÑ/JÔ/J€NÐJÐJÐJÑJÐJÐJr   rB   c                  ó  — e Zd ZU dZded<   ded<   ded<   dZded	<   dZded
<   dZded<   dZded<   dZ	ded<   dZ
ded<    ee¬¦  «        Zded<    ee¬¦  «        Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dS )ÚDefenseSheetz;Incoming defense parameters for an entity receiving damage.rC   Údefender_idr   rE   Údefender_levelrH   r3   Úmax_lifeÚcurrent_lifer2   Úmax_wardÚcurrent_wardÚarmourÚevasion_ratingrL   rN   ÚresistancesÚmax_resistance_capsÚblock_chanceé2   Úentropy_poolFrR   Úis_in_iframeg      ð?Údamage_taken_multiplierÚaoe_damage_reduction_pctN)r   r   r   r   r@   r\   r]   r^   r_   r`   ra   r   rV   rb   rc   rd   rf   rg   rh   ri   r   r   r   rY   rY   ^   s6  € € € € € € àEÐEØÐÐÑØ!Ð!Ð!Ñ!ØÐÐÑØ€HÐÐÐÑØ €LÐ Ð Ð Ñ Ø€HÐÐÐÑØ€LÐÐÐÑØ€FÐÐÐÑØ€NÐÐÐÑØ.3¨eÀDÐ.IÑ.IÔ.I€KÐIÐIÐIÑIØ6;°eÈDÐ6QÑ6QÔ6QÐÐQÐQÐQÑQØ€LÐÐÐÑØ€LÐÐÐÑØ€LÐÐÐÑØ%(ÐÐ(Ð(Ð(Ñ(Ø&)ÐÐ)Ð)Ð)Ñ)Ð)Ð)r   rY   c                  ód   — e Zd ZU dZded<   dZded<   dZded<   dZded	<   dZded
<   dZ	ded<   dS )ÚBossStaggerStatez/PoE2-inspired Poise / Stagger meter for Bosses.r3   Úmax_stagger_poiser2   Úcurrent_staggerFrR   Úis_staggeredÚstagger_duration_remaining_secÚstagger_cooldown_remaining_secgÍÌÌÌÌÌô?Ústagger_damage_amplificationN)
r   r   r   r   r@   rm   rn   ro   rp   rq   r   r   r   rk   rk   s   s|   € € € € € € à9Ð9ØÐÐÑØ €OÐ Ð Ð Ñ Ø€LÐÐÐÑØ,/Ð"Ð/Ð/Ð/Ñ/Ø,/Ð"Ð/Ð/Ð/Ñ/Ø*.Ð Ð.Ð.Ð.Ñ.Ð.Ð.r   rk   c                  ó@   — e Zd ZU dZded<   ded<   ded<   dZded<   d	S )
ÚAilmentApplicationz&Result of an inflicted status ailment.r!   Úailment_typer3   Úduration_secÚ	magnituder2   ÚdpsN)r   r   r   r   r@   rw   r   r   r   rs   rs   ~   sM   € € € € € € à0Ð0ØÐÐÑØÐÐÑØÐÐÑØ€CÐÐÐÑÐÐr   rs   c                  óÎ   — e Zd ZU dZ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ed<   ded<   ded<    ee¬¦  «        Zded<   dZded<   dZ	ded<   dZ
ded<   dS )ÚCombatHitResultzBComprehensive outcome of a hit evaluated by the Damage Calculator.rR   Úis_hitÚ	is_evadedÚ
is_blockedÚis_criticalr3   Úraw_damage_totalrN   Úmitigated_damage_by_channelÚabsorbed_by_wardÚdamage_to_lifeÚfinal_total_damageÚdefender_life_remainingÚdefender_ward_remainingrL   zList[AilmentApplication]Úinflicted_ailmentsr2   Ústagger_inflictedFÚboss_staggered_triggeredNzOptional[BossPhase]Úboss_phase_transition)r   r   r   r   r@   r   rW   r…   r†   r‡   rˆ   r   r   r   ry   ry   ‡   së   € € € € € € àLÐLØ€L€L�LØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØ;Ð;Ð;Ñ;ØÐÐÑØÐÐÑØÐÐÑØ"Ð"Ð"Ñ"Ø"Ð"Ð"Ñ"Ø38°5ÈÐ3NÑ3NÔ3NÐÐNÐNÐNÑNØ"ÐÐ"Ð"Ð"Ñ"Ø%*ÐÐ*Ð*Ð*Ñ*Ø15ÐÐ5Ð5Ð5Ñ5Ð5Ð5r   ry   N)r   Ú
__future__r   Údataclassesr   r   Úenumr   Útypingr   r   r	   Ústrr   r   r!   r)   r1   rB   rY   rk   rs   ry   r   r   r   ú<module>rŽ      s½  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð �C˜ñ ô ð ðð ð ð ð �C˜ñ ô ð ðð ð ð ð �#�tñ ô ð ðð ð ð ð ��Tñ ô ð ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð2 €�ÐÑÔðKð Kð Kð Kð Kñ Kô Kñ ÔðKð" €�ÐÑÔð*ð *ð *ð *ð *ñ *ô *ñ Ôð*ð( €�ÐÑÔð/ð /ð /ð /ð /ñ /ô /ñ Ôð/ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�ÐÑÔð6ð 6ð 6ð 6ð 6ñ 6ô 6ñ Ôð6ð 6ð 6r   