§
    %Ájé+  ã                  ó”   — d Z ddlmZ ddlmZmZmZmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZ ddlmZmZ g d¢Z G d„ d¦  «        Zd	S )
u)  
Tráº­n Ä�á»“ VÃµ CÃ´ng (Martial Matrix Engine) & Cá»• VÃµ Háº¯c Ã�m Skill System for FreeExile.
Manages:
- ChÃ¢n VÃµ Ä�an (Active Martial Core Elixirs / Skill Gems) with distinct Sects & Elements.
- Tháº§n Biáº¿n PhÃ¹ (Transmutation Sigils / Support Gems) with deep trade-off mechanics (PoE2 spirit).
- Ma Tráº­n ChiÃªu Thá»©c (Martial Skill Matrix - 6 active slots, up to 5 linked sigils per slot).
- Phá»‘i há»£p vá»›i Há»‡ Thá»‘ng NhÃ¢n Váº­t: CÄƒn Cá»‘t (CÆ°Æ¡ng Thá»ƒ, ThÃ¢n PhÃ¡p, Tháº§n Niá»‡m), NgÅ© HÃ nh, Song Binh Tá»± Ä�á»™ng HoÃ¡n Ä�á»•i.
é    )Úannotations)ÚAnyÚDictÚListÚOptionalÚTuple)
ÚFiveElementsÚMartialSectÚSkillTagÚWeaponCategoryÚSigilAugmentTypeÚ
WeaponItemÚCharacterLoadoutÚ
DiBienTaAnÚ	ChanVoDanÚCalculatedSkillDamage)Úcreate_standard_active_skillsÚcreate_standard_augment_sigils)ÚMartialMatrixr   r   r	   r
   r   r   r   r   r   r   r   r   c                  óP   — e Zd ZdZddd„Zdd„Zdd„Zdd„Zdd„Zd d„Z		 d!d"d„Z
dS )#r   uæ   
    Ma Tráº­n ChiÃªu Thá»©c: Quáº£n lÃ½ 6 Ã´ ChÃ¢n VÃµ Ä�an vÃ  tá»‘i Ä‘a 5 Tháº§n Biáº¿n PhÃ¹ liÃªn káº¿t má»—i Ã´.
    Tá»± Ä‘á»™ng tháº©m Ä‘á»‹nh tÃ­nh tÆ°Æ¡ng thÃ­ch Tag, hoÃ¡n Ä‘á»•i Song Binh vÃ  tÃ­nh toÃ¡n Trade-off.
    é   Úmax_active_slotsÚintc                óP   — || _         d„ t          |¦  «        D ¦   «         | _        d S )Nc                ó   — i | ]}|d “ŒS ©N© )Ú.0Úis     ú4C:\Projects\FreeExile\server\world\martial_matrix.pyú
<dictcomp>z*MartialMatrix.__init__.<locals>.<dictcomp>6   s   € Ð5_Ð5_Ð5_À!°a¸Ð5_Ð5_Ð5_ó    )r   ÚrangeÚslots)Úselfr   s     r    Ú__init__zMartialMatrix.__init__4   s,   € Ø 0ˆÔØ5_Ð5_ÅuÐM]ÑG^ÔG^Ð5_Ñ5_Ô5_ˆŒ
ˆ
ˆ
r"   Ú
slot_indexÚskillr   ÚreturnÚboolc                ó@   — |dk     s|| j         k    rdS || j        |<   dS )Nr   FT)r   r$   )r%   r'   r(   s      r    Úsocket_active_skillz!MartialMatrix.socket_active_skill8   s.   € Ø˜Š>ˆ>˜Z¨4Ô+@Ò@Ð@Ø�5Ø!&ˆŒ
�:ÑØˆtr"   úOptional[ChanVoDan]c                ó8   — | j                              |d ¦  «        S r   )r$   Úpop©r%   r'   s     r    Úremove_active_skillz!MartialMatrix.remove_active_skill>   s   € ØŒz�~Š~˜j¨$Ñ/Ô/Ð/r"   c                ó6   — | j                              |¦  «        S r   )r$   Úgetr0   s     r    Úget_active_skillzMartialMatrix.get_active_skillA   s   € ØŒz�~Š~˜jÑ)Ô)Ð)r"   Úsigilr   úTuple[bool, str]c                ó  — | j                              |¦  «        }|sdd|› d�fS t          |j        ¦  «        |j        k    rdd|j        › d�fS |j        rG|j                             |j        ¦  «        s(d„ |j        |j        z
  D ¦   «         }dd|j        › d|› �fS t          |d	¦  «        r>|j
        r7|j
        |j        z  r(d
„ |j
        |j        z  D ¦   «         }dd|j        › d|› �fS |j                             |¦  «         dS )uÃ   
        LiÃªn káº¿t Tháº§n Biáº¿n PhÃ¹ vÃ o ChÃ¢n VÃµ Ä�an táº¡i Ã´ slot_index.
        Kiá»ƒm tra nghiÃªm ngáº·t tÃ­nh tÆ°Æ¡ng thÃ­ch nhÃ£n (Tag Compatibility) vÃ  giá»›i háº¡n 5 phÃ¹.
        Fu   Ã” sá»‘ u    chÆ°a cáº¯m ChÃ¢n VÃµ Ä�anu   Ä�Ã£ Ä‘áº¡t tá»‘i Ä‘a u    Tháº§n Biáº¿n PhÃ¹ liÃªn káº¿tc                ó   — g | ]	}|j         ‘Œ
S r   ©Úvalue©r   Úts     r    ú
<listcomp>z5MartialMatrix.link_sigil_to_skill.<locals>.<listcomp>R   s   € ÐPÐPÐP¨˜AœGÐPÐPÐPr"   u   Tháº§n Biáº¿n PhÃ¹ 'u%   ' khÃ´ng tÆ°Æ¡ng thÃ­ch: thiáº¿u tag Úexcluded_tagsc                ó   — g | ]	}|j         ‘Œ
S r   r9   r;   s     r    r=   z5MartialMatrix.link_sigil_to_skill.<locals>.<listcomp>W   s   € ÐQÐQÐQ¨˜QœWÐQÐQÐQr"   u-   ' xung Ä‘á»™t vá»›i tag cá»§a chiÃªu thá»©c: )Tu+   LiÃªn káº¿t Tháº§n Biáº¿n PhÃ¹ thÃ nh cÃ´ng)r$   r3   ÚlenÚlinked_sigilsÚmax_linked_sigilsÚrequired_tagsÚissubsetÚtagsÚ
sigil_nameÚhasattrr>   Úappend)r%   r'   r5   r(   Úmissing_tagsÚconflict_tagss         r    Úlink_sigil_to_skillz!MartialMatrix.link_sigil_to_skillD   s^  € ð
 ”
—’˜zÑ*Ô*ˆØð 	MØÐL ZÐLÐLÐLÐLÐLåˆuÔ"Ñ#Ô# uÔ'>Ò>Ð>ØÐk°5Ô3JÐkÐkÐkÐkÐkð Ôð 	w uÔ':×'CÒ'CÀEÄJÑ'OÔ'Oð 	wØPÐP¨eÔ.AÀEÄJÑ.NÐPÑPÔPˆLØÐv°Ô1AÐvÐvÐhtÐvÐvÐvÐvõ �5˜/Ñ*Ô*ð 	@¨uÔ/Bð 	@ÈÔH[Ð^cÔ^hÑHhð 	@ØQÐQ¨uÔ/BÀUÄZÑ/OÐQÑQÔQˆMØÐ°Ô1AÐÐÐp}ÐÐÐÐàÔ×"Ò" 5Ñ)Ô)Ð)ØBÐBr"   Ú	characterr   úTuple[bool, int, str]c                ód  — |j         }|t          j        k    r
d|j        dfS |j        dk    r|j        n|j        }|r|j        |k    r
d|j        dfS |j        dk    rdnd}|j        dk    r|j        n|j        }|r#|j        |k    r||_        d|d|› d|j        › d�fS d	|j        d
|j        › d�fS )u  
        CÆ¡ cháº¿ Song Binh Tá»± Ä�á»™ng HoÃ¡n Ä�á»•i (PoE2 Spirit Dual Weapon Auto-Swap).
        Náº¿u bá»™ vÅ© khÃ­ Ä‘ang cáº§m khÃ´ng khá»›p vá»›i yÃªu cáº§u cá»§a chiÃªu thá»©c,
        há»‡ thá»‘ng tá»± Ä‘á»™ng kiá»ƒm tra bá»™ vÅ© khÃ­ phá»¥ vÃ  hoÃ¡n Ä‘á»•i trong 0ms.
        Tu7   ChiÃªu thá»©c khÃ´ng yÃªu cáº§u vÅ© khÃ­ Ä‘áº·c Ä‘á»‹nhé   u$   VÅ© khÃ­ hiá»‡n táº¡i tÆ°Æ¡ng thÃ­ché   u-   Tá»± Ä‘á»™ng hoÃ¡n Ä‘á»•i sang Bá»™ VÅ© KhÃ­ z (u   ) Ä‘á»ƒ xuáº¥t chiÃªuFu;   Cáº£ 2 bá»™ vÅ© khÃ­ Ä‘á»�u khÃ´ng thá»�a mÃ£n yÃªu cáº§u 'u   ' cá»§a chiÃªu thá»©c)	Úweapon_requirementr   ÚANYÚactive_weapon_setÚweapon_set_1Úweapon_set_2ÚcategoryÚnamer:   )r%   rL   r(   ÚreqÚ
cur_weaponÚalt_setÚ
alt_weapons          r    Úresolve_weapon_swapz!MartialMatrix.resolve_weapon_swap]   s4  € ð Ô&ˆØ•.Ô$Ò$Ð$Ø˜Ô4Ð6oÐoÐoà/8Ô/JÈaÒ/OÐ/O�YÔ+Ð+ÐU^ÔUkˆ
Øð 	]˜*Ô-°Ò4Ð4Ø˜Ô4Ð6\Ð\Ð\ð !Ô2°aÒ7Ð7�!�!¸QˆØ/8Ô/JÈaÒ/OÐ/O�YÔ+Ð+ÐU^ÔUkˆ
àð 	D˜*Ô-°Ò4Ð4Ø*1ˆIÔ'Ø˜ð  #DÐRYð  #Dð  #DÐ]gÔ]lð  #Dð  #Dð  #Dð  Dð  Dà�iÔ1ð  4RÐqtÔqzð  4Rð  4Rð  4Rð  Rð  	Rr"   NúOptional[CharacterLoadout]úOptional[Dict[str, Any]]c                óB  — | j                              |¦  «        }|sdS |j        }|}|j        }|j        }d}t          |j        ¦  «        }	t          |j        ¦  «        }
d}d}d}|j        }|j	        }d}d}d}d}d}d}d}d}d}|r‘t          j        |j        v st          j        |j        v rd|j        dz  z   }||z  }d|j        d	z  z   }||z  }||j        d
z  z  }t          j        |j        v s|j        t$          j        k    rd|j        dz  z   }||z  }|j        D ]ò}|j        r |j                             |j        ¦  «        sŒ)||j        z  }||j        z  }||j        z   |j        z  }||j        z  }|	|j        z  }	|
|j        z  }
||j        z  }||j         z  }||j!        z  }||j"        z  }|j#        rd}|j$        rd}|j%        rd}|j&        rd}|j'        rd}|j(        |k    r|j(        }|j)        rd}|j*        dk    r
||j*        z  }Œó|j+        rd}|j,        sd}t[          t]          |	¦  «        ¦  «        }|rdnd}i d|j/        “d|j0        “d|j        j1        “d|j2        j1        “dd„ |j        D ¦   «         “dt]          |d¦  «        “d|“dt]          |d¦  «        “d|“d|“d|“dt[          t]          |
¦  «        ¦  «        “dt[          t]          |j3        |z  ¦  «        ¦  «        “d|“d|“dt]          ti          dtk          d|¦  «        ¦  «        d ¦  «        “d!t]          |d¦  «        “i d"t]          |d ¦  «        “d#|j6        “d$|j7        “d%|j8        “d&|j9        “d'|j:        “d(|j;        “d)|“d*|“d+|“d,|“d-|“d.|“d/|“d0|j<        “d1|j=        “¥S )2u}  
        TÃ­nh toÃ¡n toÃ n bá»™ thuá»™c tÃ­nh thá»±c thi cá»§a chiÃªu thá»©c:
        - TÃ¡c Ä‘á»™ng lÅ©y tÃ­ch cá»§a cÃ¡c Tháº§n Biáº¿n PhÃ¹ (Trade-off Matrix).
        - Tá»‰ lá»‡ khuáº¿ch Ä‘áº¡i tá»« CÄƒn Cá»‘t nhÃ¢n váº­t (CÆ°Æ¡ng Thá»ƒ, ThÃ¢n PhÃ¡p, Tháº§n Niá»‡m).
        - Pháº¡t ChÃ¢n KhÃ­ / KhÃ­ Huyáº¿t, Ä‘á»™ giáº­t pháº£n cháº¥n, cáº¥m Ä‘oÃ¡n chiáº¿n thuáº­t.
        Nr   g      ð?gš™™™™™©?g      ø?g        Fgü©ñÒMb`?gú~j¼t“X?gü©ñÒMbP?Tu   KHÃ�_HUYáº¾Tu
   CHÃ‚N_KHÃ�Úskill_idÚ
skill_nameÚelementÚsectrE   c                ó   — g | ]	}|j         ‘Œ
S r   r9   r;   s     r    r=   z8MartialMatrix.compute_modified_skill.<locals>.<listcomp>Ý   s   € Ð1Ð1Ð1 �Q”WÐ1Ð1Ð1r"   Úeffective_damagerP   Úprojectile_countÚ
aoe_radiusÚchain_countÚ
cost_valueÚ	cost_typeÚcooldown_msÚcast_time_msÚanimation_lock_msÚvulnerability_multiplierÚcrit_chanceé   Úcrit_multiplierÚrecoil_damage_percentÚdot_multiplierÚdot_duration_secÚspeed_penalty_percentÚself_damage_max_hp_percentÚminimum_range_metersÚimmobilized_during_effectÚward_disabledÚelemental_disabledÚphysical_disabledÚpiercing_disabledÚfreeze_chanceÚignite_poison_disabledÚdash_distanceÚupside_summaryÚdownside_summary)>r$   r3   Úbase_damageÚbase_projectile_countÚbase_aoe_radiusÚfloatÚenergy_costrk   rm   Úvulnerability_taken_multiplierr   ÚMELEErE   ÚSLAMÚ	cuong_theÚ	than_phapÚSPELLrb   r	   ÚTHOÚ	than_niemrA   rC   rD   Údamage_multiplierÚprojectile_bonusÚaoe_radius_bonusÚaoe_radius_multiplierÚchain_count_bonusÚenergy_cost_multiplierÚcooldown_multiplierÚcast_speed_multiplierÚcrit_chance_multiplierÚcrit_multiplier_bonusrr   Úconverts_cost_to_lifeÚdisables_wardÚdisables_elemental_damageÚdisables_physical_damageÚdisables_piercingÚforces_freeze_chanceÚdisables_ignite_and_poisonÚdash_evasion_distanceÚcannot_critÚdirect_hit_enabledr   Úroundr`   ra   r:   rc   rl   ÚminÚmaxrs   rt   ru   rv   rw   rx   Úupside_descÚdownside_desc)r%   r'   rL   r(   r‚   re   Útotal_projectilesÚeffective_aoeÚtotal_chainsÚeffective_energyÚeffective_cooldownÚeffective_cast_speedÚeffective_crit_chanceÚeffective_crit_multÚeffective_animation_lockÚeffective_vulnerabilityÚtotal_recoil_pctÚconverts_to_lifery   rz   r{   r|   r}   r~   r   Úphysique_multÚagility_speedÚspirit_multr5   Úfinal_resource_costrj   s                                  r    Úcompute_modified_skillz$MartialMatrix.compute_modified_skilly   st  € ð ”
—’˜zÑ*Ô*ˆØð 	Ø�4ð Ô'ˆØ&ÐØ!Ô7ÐØÔ-ˆØˆÝ  Ô!2Ñ3Ô3ÐÝ" 5Ô#4Ñ5Ô5ÐØ"ÐØ $ÐØ"ÐØ#(Ô#:Ð Ø"'Ô"FÐØÐØ ÐØˆØ"ÐØ!ÐØ!ÐØˆØ!&ÐØˆð ð 	0ÝŒ~ ¤Ð+Ð+­x¬}ÀÄ
Ð/JÐ/JØ # yÔ':¸UÑ'BÑ C�Ø  MÑ1Ð à 9Ô#6¸Ñ#?Ñ@ˆMØ  MÑ1Ð Ø! iÔ&9¸EÑ&AÑBÐ!åŒ~ ¤Ð+Ð+¨u¬}ÅÔ@PÒ/PÐ/PØ! YÔ%8¸5Ñ%@ÑA�Ø  KÑ/Ð ð Ô(ð 	=ð 	=ˆEØÔ"ð ¨5Ô+>×+GÒ+GÈÌ
Ñ+SÔ+Sð Øà Ô 7Ñ7ÐØ Ô!7Ñ7ÐØ*¨UÔ-CÑCÀuÔGbÑbˆMØ˜EÔ3Ñ3ˆLØ Ô <Ñ<ÐØ %Ô";Ñ;ÐØ  EÔ$?Ñ?Ð Ø! UÔ%AÑAÐ!Ø 5Ô#>Ñ>ÐØ Ô ;Ñ;ÐàÔ*ð (Ø#'Ð ØÔ"ð %Ø $�ØÔ.ð *Ø%)Ð"ØÔ-ð )Ø$(Ð!ØÔ&ð )Ø$(Ð!ØÔ)¨MÒ9Ð9Ø %Ô :�ØÔ/ð .Ø)-Ð&ØÔ*¨SÒ0Ð0Ø Ô!<Ñ<�øð Ôð 	(Ø$'Ð!àÔ'ð 	#Ø"Ðå!¥%Ð(8Ñ"9Ô"9Ñ:Ô:ÐØ&6ÐH�N�N¸Lˆ	ð"
Ø˜œð"
à˜%Ô*ð"
ð �u”}Ô*ð"
ð �E”JÔ$ð	"
ð
 Ð1Ð1 e¤jÐ1Ñ1Ô1ð"
ð ¥Ð&6¸Ñ :Ô :ð"
ð Ð 1ð"
ð �% ¨qÑ1Ô1ð"
ð ˜<ð"
ð Ð-ð"
ð ˜ð"
ð �3�uÐ%7Ñ8Ô8Ñ9Ô9ð"
ð �C¥ eÔ&8Ð;OÑ&OÑ PÔ PÑQÔQð"
ð  Ð!9ð"
ð 'Ð(?ð"
ð  �5¥ S­#¨cÐ3HÑ*IÔ*IÑ!JÔ!JÈAÑNÔNð!"
ð" �uÐ%8¸!Ñ<Ô<ð#"
ð "
ð$ $¥UÐ+;¸QÑ%?Ô%?ð%"
ð& ˜eÔ2ð'"
ð(  Ô 6ð)"
ð* $ UÔ%@ð+"
ð, )¨%Ô*Jð-"
ð. # EÔ$>ð/"
ð0 (¨Ô)Hð1"
ð2 ˜]ð3"
ð4 !Ð"4ð5"
ð6  Ð!2ð7"
ð8  Ð!2ð9"
ð: ˜]ð;"
ð< %Ð&<ð="
ð> ˜]ð?"
ð@ ˜eÔ/ðA"
ðB  Ô 3ðC"
ð "
ð "	
r"   )r   )r   r   )r'   r   r(   r   r)   r*   )r'   r   r)   r-   )r'   r   r5   r   r)   r6   )rL   r   r(   r   r)   rM   r   )r'   r   rL   r]   r)   r^   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r,   r1   r4   rK   r\   r¸   r   r"   r    r   r   /   sÍ   € € € € € ðð ð`ð `ð `ð `ð `ðð ð ð ð0ð 0ð 0ð 0ð*ð *ð *ð *ðCð Cð Cð Cð2Rð Rð Rð Rð> 15ðA
ð A
ð A
ð A
ð A
ð A
ð A
r"   r   N)r¼   Ú
__future__r   Útypingr   r   r   r   r   Úserver.world.martial_typesr	   r
   r   r   r   r   r   r   r   r   Úserver.world.martial_catalogr   r   Ú__all__r   r   r"   r    ú<module>rÂ      s:  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð
ð ð €ð"K
ð K
ð K
ð K
ð K
ñ K
ô K
ð K
ð K
ð K
r"   