§
    .Âj†  ã                  ó”  — d Z ddlm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  G d„ dee¦  «        Z edd¬	¦  «         G d
„ d¦  «        ¦   «         Z G d„ d¦  «        Z edd¬	¦  «         G d„ de¦  «        ¦   «         Z edd¬	¦  «         G d„ de¦  «        ¦   «         Z edd¬	¦  «         G d„ de¦  «        ¦   «         Z edd¬	¦  «         G d„ de¦  «        ¦   «         Z edd¬	¦  «         G d„ de¦  «        ¦   «         Z edd¬	¦  «         G d„ d¦  «        ¦   «         Z edd¬	¦  «         G d„ d¦  «        ¦   «         ZdS )a  
FreeExile Character Stat Aggregator Domain Types & AST Models.
Defines Modifier Types, Stat Modifiers, Evaluation Contexts,
AST Hierarchy for Calculation Auditing, and Aggregated Character Stats.
Strict typing with @dataclass(slots=True) following Elite Standards 2026.
é    )Úannotations)ÚEnum)ÚDictÚListÚOptionalÚ	FrozenSetÚAnyÚ
Collection)Ú	dataclassÚfieldc                  ó&   — e Zd ZdZdZdZdZdZdZdS )ÚModifierTypezGCanonical Path of Exile modifier types for character stat calculations.ÚFLATÚ	INCREASEDÚREDUCEDÚMOREÚLESSN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   © ó    ú0C:\Projects\FreeExile\server\stats\stat_types.pyr   r      s-   € € € € € ØQÐQØ€DØ€IØ€GØ€DØ€D€D€Dr   r   T)ÚslotsÚfrozenc                  ól   — e Zd ZU dZded<   ded<   ded<    e¦   «         Zded	<   d
Zded<   dZded<   d
S )ÚStatModifierz8An individual modifier contributing to a character stat.ÚstrÚstat_keyr   Úmod_typeÚfloatÚvalueúFrozenSet[str]ÚtagsNúOptional[str]Ú	conditionÚ Úsource)	r   r   r   r   Ú__annotations__Ú	frozensetr%   r'   r)   r   r   r   r   r      so   € € € € € € àBÐBØ€M€M�MØÐÐÑØ€L€L�LØ$˜9™;œ;€DÐ&Ð&Ð&Ñ&Ø#€IÐ#Ð#Ð#Ñ#Ø€FÐÐÐÑÐÐr   r   c                  ó   — e Zd ZdZdd„ZdS )ÚASTNodez*Base class for all stat formula AST nodes.ÚreturnúDict[str, Any]c                ó   — t           ‚©N)ÚNotImplementedError©Úselfs    r   Úto_dictzASTNode.to_dict$   s   € Ý!Ð!r   N©r.   r/   )r   r   r   r   r5   r   r   r   r-   r-   "   s.   € € € € € Ø4Ð4ð"ð "ð "ð "ð "ð "r   r-   c                  ó>   — e Zd ZU dZded<   ded<   dZded<   dd
„ZdS )ÚConstantNodez,Constant base value node in calculation AST.r   Únamer"   r#   r(   r)   r.   r/   c                óJ   — d| j         t          | j        d¦  «        | j        dœS )NÚConstanté   )Úast_typer9   r#   r)   )r9   Úroundr#   r)   r3   s    r   r5   zConstantNode.to_dict/   s-   € à"Ø”IÝ˜4œ: qÑ)Ô)Ø”kð	
ð 
ð 	
r   Nr6   )r   r   r   r   r*   r)   r5   r   r   r   r8   r8   (   sS   € € € € € € à6Ð6Ø€I€I�IØ€L€L�LØ€FÐÐÐÑð
ð 
ð 
ð 
ð 
ð 
r   r8   c                  óx   — e Zd ZU dZ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d„Z
d
S )ÚModifierContributionNodezARecords an individual modifier's contribution to the calculation.r   r)   Úmodifier_typer"   r#   ©Údefault_factoryz	List[str]r%   Nr&   r'   TÚboolÚcondition_metr.   r/   c                óˆ   — d| j         | j        t          | j        d¦  «        t	          | j        ¦  «        | j        | j        dœS )NÚModifierContributionr<   )r=   r)   rA   r#   r%   r'   rE   )r)   rA   r>   r#   Úlistr%   r'   rE   r3   s    r   r5   z ModifierContributionNode.to_dictB   sD   € à.Ø”kØ!Ô/Ý˜4œ: qÑ)Ô)Ý˜œ‘O”OØœØ!Ô/ð
ð 
ð 	
r   r6   )r   r   r   r   r*   r   rH   r%   r'   rE   r5   r   r   r   r@   r@   8   sŽ   € € € € € € àKÐKØ€K€K�KØÐÐÑØ€L€L�LØ�e¨DÐ1Ñ1Ô1€DÐ1Ð1Ð1Ñ1Ø#€IÐ#Ð#Ð#Ñ#Ø€MÐÐÐÑð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   r@   c                  óR   — e Zd ZU dZded<   ded<    ee¬¦  «        Zded<   dd„ZdS )ÚSumNodez.Sum of flat modifiers added to the base value.r   r9   r"   ÚtotalrB   úList[Dict[str, Any]]Úchildrenr.   r/   c                óJ   — d| j         t          | j        d¦  «        | j        dœS )NÚSumr<   )r=   r9   rK   rM   )r9   r>   rK   rM   r3   s    r   r5   zSumNode.to_dictU   s-   € àØ”IÝ˜4œ: qÑ)Ô)Øœð	
ð 
ð 	
r   Nr6   ©	r   r   r   r   r*   r   rH   rM   r5   r   r   r   rJ   rJ   N   s`   € € € € € € à8Ð8Ø€I€I�IØ€L€L�LØ%* U¸4Ð%@Ñ%@Ô%@€HÐ@Ð@Ð@Ñ@ð
ð 
ð 
ð 
ð 
ð 
r   rJ   c                  ó\   — e Zd ZU dZded<   ded<   ded<    ee¬¦  «        Zded	<   dd„ZdS )ÚScaleFactorNodezIAdditive percentage scale factor: 1.0 + sum(increased - reduced) / 100.0.r   r9   r"   Úpercentage_sumÚ
multiplierrB   rL   rM   r.   r/   c                ór   — d| j         t          | j        d¦  «        t          | j        d¦  «        | j        dœS )NÚScaleFactorr<   )r=   r9   rS   rT   rM   )r9   r>   rS   rT   rM   r3   s    r   r5   zScaleFactorNode.to_dictf   s=   € à%Ø”IÝ# DÔ$7¸Ñ;Ô;Ý ¤°Ñ3Ô3Øœð
ð 
ð 	
r   Nr6   rP   r   r   r   rR   rR   ^   so   € € € € € € àSÐSØ€I€I�IØÐÐÑØÐÐÑØ%* U¸4Ð%@Ñ%@Ô%@€HÐ@Ð@Ð@Ñ@ð
ð 
ð 
ð 
ð 
ð 
r   rR   c                  óR   — e Zd ZU dZded<   ded<    ee¬¦  «        Zded<   dd„ZdS )ÚProductNodezUMultiplicative compound product: prod(1.0 + more / 100.0) * prod(1.0 - less / 100.0).r   r9   r"   rT   rB   rL   rM   r.   r/   c                óJ   — d| j         t          | j        d¦  «        | j        dœS )NÚProductr<   )r=   r9   rT   rM   )r9   r>   rT   rM   r3   s    r   r5   zProductNode.to_dictw   s-   € à!Ø”IÝ ¤°Ñ3Ô3Øœð	
ð 
ð 	
r   Nr6   rP   r   r   r   rX   rX   p   sc   € € € € € € à_Ð_Ø€I€I�IØÐÐÑØ%* U¸4Ð%@Ñ%@Ô%@€HÐ@Ð@Ð@Ñ@ð
ð 
ð 
ð 
ð 
ð 
r   rX   c                  ón   — e Zd ZU dZ e¦   «         Zded<    e¦   «         Zded<   dZded<   dd„Z	dd„Z
dS )ÚEvaluationContextz@Context holding active skill tags, conditions, and vital ratios.r$   Úactive_tagsÚ
conditionsç      ð?r"   Úcurrent_hp_ratioÚrequired_tagsúCollection[str]r.   rD   c                ód   ‡— |sdS d„ | j         D ¦   «         Št          ˆfd„|D ¦   «         ¦  «        S )zMReturns True if modifier tags are a subset of active tags (case-insensitive).Tc                ó6   — h | ]}|                      ¦   «         ’ŒS r   ©Úlower)Ú.0Úts     r   ú	<setcomp>z1EvaluationContext.matches_tags.<locals>.<setcomp>‹   s    € Ð<Ð<Ð< a˜Ÿš™	œ	Ð<Ð<Ð<r   c              3  óD   •K  — | ]}|                      ¦   «         ‰v V — Œd S r1   re   )rg   rh   Úactive_lowers     €r   ú	<genexpr>z1EvaluationContext.matches_tags.<locals>.<genexpr>Œ   s0   øè è € ÐDÐD°�1—7’7‘9”9 Ð,ÐDÐDÐDÐDÐDÐDr   )r]   Úall)r4   ra   rk   s     @r   Úmatches_tagszEvaluationContext.matches_tags‡   sI   ø€ àð 	Ø�4Ø<Ð<¨4Ô+;Ð<Ñ<Ô<ˆÝÐDÐDÐDÐD°mÐDÑDÔDÑDÔDÐDr   r'   r&   c                óè   — |�|                      ¦   «         sdS |                      ¦   «                              ¦   «         }|d„ | j        D ¦   «         v rdS |dv r| j        dk    S |dv r| j        dk    S dS )	zEEvaluates whether a named condition is met under the current context.NTc                ó6   — h | ]}|                      ¦   «         ’ŒS r   re   )rg   Úcs     r   ri   z5EvaluationContext.is_condition_met.<locals>.<setcomp>“   s    € Ð:Ð:Ð: Q�q—w’w‘y”yÐ:Ð:Ð:r   )Úon_low_healthÚon_low_lifegffffffÖ?)Úon_full_healthÚon_full_lifer_   F)Ústriprf   r^   r`   )r4   r'   Úc_lowers      r   Úis_condition_metz"EvaluationContext.is_condition_metŽ   s‘   € àÐ I§O¢OÑ$5Ô$5ÐØ�4Ø—/’/Ñ#Ô#×)Ò)Ñ+Ô+ˆØÐ:Ð:¨$¬/Ð:Ñ:Ô:Ð:Ð:Ø�4ØÐ6Ð6Ð6ØÔ(¨DÒ0Ð0ØÐ8Ð8Ð8ØÔ(¨CÒ/Ð/Øˆur   N)ra   rb   r.   rD   )r'   r&   r.   rD   )r   r   r   r   r+   r]   r*   r^   r`   rn   rx   r   r   r   r\   r\   €   sˆ   € € € € € € àJÐJØ"+ )¡+¤+€KÐ-Ð-Ð-Ñ-Ø!* ¡¤€JÐ,Ð,Ð,Ñ,Ø!ÐÐ!Ð!Ð!Ñ!ðEð Eð Eð Eðð ð ð ð ð r   r\   c                  óÂ   — e Zd ZU dZded<   ded<   ded<   ded<   ded<    ee¬¦  «        Zd	ed
<    ee¬¦  «        Zd	ed<   e	dd„¦   «         Z
e	dd„¦   «         Zdd„ZdS )ÚAggregatedCharacterStatszBFinal calculated character combat vitals and secondary attributes.r"   Úattack_damageÚmax_hpÚcrit_chanceÚcrit_multiplierÚ
move_speedrB   zDict[str, float]ÚresistancesÚ	all_statsr.   c                ó   — | j         S )z6Alias for attack_damage for CombatActor compatibility.)r{   r3   s    r   Úbase_attackz$AggregatedCharacterStats.base_attack§   s   € ð Ô!Ð!r   c                ó   — | j         S )z7Alias for move_speed for PlayerCharacter compatibility.)r   r3   s    r   Úmovement_speedz'AggregatedCharacterStats.movement_speed¬   s   € ð ŒÐr   r/   c           	     ó�   — | j         | j        | j        | j        | j        t          | j        ¦  «        t          | j        ¦  «        dœS )z0Serializes final stats to a standard dictionary.)r{   r|   r}   r~   r   r€   r�   )r{   r|   r}   r~   r   Údictr€   r�   r3   s    r   r5   z AggregatedCharacterStats.to_dict±   sJ   € ð "Ô/Ø”kØÔ+Ø#Ô3Øœ/Ý Ô 0Ñ1Ô1Ý˜dœnÑ-Ô-ð
ð 
ð 	
r   N)r.   r"   r6   )r   r   r   r   r*   r   r‡   r€   r�   Úpropertyrƒ   r…   r5   r   r   r   rz   rz   œ   sã   € € € € € € àLÐLØÐÐÑØ€M€M�MØÐÐÑØÐÐÑØÐÐÑØ$) E¸$Ð$?Ñ$?Ô$?€KÐ?Ð?Ð?Ñ?Ø"' %¸Ð"=Ñ"=Ô"=€IÐ=Ð=Ð=Ñ=àð"ð "ð "ñ „Xð"ð ðð ð ñ „Xðð

ð 

ð 

ð 

ð 

ð 

r   rz   N)r   Ú
__future__r   Úenumr   Útypingr   r   r   r   r	   r
   Údataclassesr   r   r   r   r   r-   r8   r@   rJ   rR   rX   r\   rz   r   r   r   ú<module>r�      s  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ðð ð ð ð �3˜ñ ô ð ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð"ð "ð "ð "ð "ñ "ô "ð "ð €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
�7ñ 
ô 
ñ $Ô#ð
ð €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
˜wñ 
ô 
ñ $Ô#ð
ð* €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
ˆgñ 
ô 
ñ $Ô#ð
ð €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
�gñ 
ô 
ñ $Ô#ð
ð" €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
�'ñ 
ô 
ñ $Ô#ð
ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð6 €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ $Ô#ð
ð 
ð 
r   