§
    —»»jê(  ã                   ó„   — d Z ddlmZmZm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mZmZmZmZmZ  G d„ d¦  «        ZdS )at  
FreeExile Weapon Engine & Combat Resolution Core.
Handles:
1. Attribute requirement checks.
2. Weapon damage scaling (Physique, Agility, Mind).
3. Two-Handed (+50% More Dmg) and Dual Wielding (+10% APS, +15% Block) mechanics.
4. Shield blocking and defensive barrier resolution.
5. Sect & Clan Affinity Resonance Buffs.
6. Server-authoritative 0ms Dual Weapon Auto-Swap.
é    )ÚDictÚOptionalÚTuple)ÚFiveElementsÚMartialSectÚWeaponCategory)ÚWeaponClassÚ	GripStyleÚ
PrimalClanÚWeaponImplicitStatÚBaseWeaponTemplateÚEquippedWeaponÚWeaponSetLoadoutÚWeaponScalingResultÚAffinityResonanceResultÚAutoSwapResultÚLoadoutEvaluationResultÚDualWieldBonusc                   óÒ   — e Zd ZdZdd„Zdedeeef         de	fd„Z
	 ddedeeef         d	ed
ee         def
d„Zdedededefd„Zdededededef
d„Zdedeeef         defd„ZdS )ÚWeaponEngineu\   Ä�á»™ng cÆ¡ tÃ­nh toÃ¡n vÃ  tháº©m Ä‘á»‹nh vÅ© khÃ­ phÃ­a mÃ¡y chá»§ (Server-Authoritative).ÚreturnNc                 ó,   — t          ¦   «         | _        d S ©N)r   Údual_wield_rules)Úselfs    ú3C:\Projects\FreeExile\server\world\weapon_engine.pyÚ__init__zWeaponEngine.__init__!   s   € Ý .Ñ 0Ô 0ˆÔÐÐó    ÚtemplateÚ
char_statsc                 óØ   — |                      dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }||j        k     rdS ||j        k     rdS ||j        k     rdS dS )uT   Kiá»ƒm tra Ä‘iá»�u kiá»‡n CÄƒn Cá»‘t (Attributes) tá»‘i thiá»ƒu Ä‘á»ƒ mang vÅ© khÃ­.Ú	cuong_ther   Ú	than_phapÚ	than_niemFT)ÚgetÚreq_physiqueÚreq_agilityÚreq_mind)r   r   r    r"   r#   r$   s         r   Úvalidate_requirementsz"WeaponEngine.validate_requirements$   sy   € à—N’N ;°Ñ2Ô2ˆ	Ø—N’N ;°Ñ2Ô2ˆ	Ø—N’N ;°Ñ2Ô2ˆ	à�xÔ,Ò,Ð,Ø�5Ø�xÔ+Ò+Ð+Ø�5Ø�xÔ(Ò(Ð(Ø�5Øˆtr   ÚweaponÚ
grip_styleÚoffhand_weaponc                 ó4  — |j         }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }dt          dt          d|j        ¦  «        ¦  «        dz  z   }	|j        |	z  }
|j        |	z  }d}|j        t          j	        t          j
        fv r||d	z  |d
z  z   z  }n`|j        t          j        t          j        fv r||d	z  |d
z  z   z  }n2|j        t          j        k    r||dz  |dz  z   z  }n||dz  |dz  z   z  }|
|z  }||z  }|t          j        k    p|j        t          j        k    }d}|j        }|r!|dz  }|dz  }d}t          d|j        ¦  «        }d|dz  z   }|j        |z  }d}d}|s<|�:|j         j        t          j        k    r d}|d| j        j        z   z  }| j        j        }d|d
z  z   }t          d|j        |z  ¦  «        }||z   dz  }d}||z  d||dz
  z  z   z  }t1          ||||||||||¬¦
  «
        S )uÌ   
        TÃ­nh toÃ¡n sÃ¡t thÆ°Æ¡ng, tá»‘c Ä‘á»™ Ä‘Ã¡nh, báº¡o kÃ­ch vÃ  táº§m vá»›i cá»§a vÅ© khÃ­.
        Ã�p dá»¥ng scaling CÄƒn Cá»‘t (Str/Dex/Int) vÃ  cÆ¡ cháº¿ Two-Handed hoáº·c Dual-Wield.
        r"   é2   r#   r$   ç      ð?r   é   g{®Gáz„?gú~j¼t“h?gü©ñÒMbP?gyé&1¬l?g-Cëâ6J?gü©ñÒMb`?g      ø?gš™™™™™õ?g       @gú~j¼t“X?ç        FNTgffffffî?)
Ú
min_damageÚ
max_damageÚeffective_attack_speedÚfinal_crit_chanceÚeffective_dpsÚweapon_reach_metersÚstun_potency_multiplierÚbonus_block_chanceÚis_two_handedÚis_dual_wield)r   r%   ÚmaxÚminÚqualityr2   r3   Úweapon_classr	   ÚBLADEÚBLUNT_HAMMERÚSWORDÚ
RANGED_BOWÚSTAFFr
   Ú
TWO_HANDEDr+   Úweapon_range_metersÚattacks_per_secondÚ
ONE_HANDEDr   Úmore_attack_speedr9   Úbase_crit_chancer   )r   r*   r    r+   r,   Útplr"   r#   r$   Úquality_factorÚbase_minÚbase_maxÚ	dmg_scaleÚ
scaled_minÚ
scaled_maxr:   Ústun_potencyÚreachÚ	aps_scaleÚeffective_apsÚbonus_blockr;   Ú
crit_scaleÚ
final_critÚavg_hitÚcrit_multiplierr6   s                              r   Úcalculate_weapon_damagez$WeaponEngine.calculate_weapon_damage2   s«  € ð ŒoˆØ—N’N ;°Ñ3Ô3ˆ	Ø—N’N ;°Ñ3Ô3ˆ	Ø—N’N ;°Ñ3Ô3ˆ	ð ¥ A¥s¨2¨v¬~Ñ'>Ô'>Ñ ?Ô ?À$Ñ FÑGˆØ”> NÑ2ˆØ”> NÑ2ˆð ˆ	ØÔ¥Ô 1µ;Ô3KÐLÐLÐLØ˜) eÑ+°	¸EÑ0AÑBÑBˆIˆIØÔ¥+Ô"3µ[Ô5KÐ!LÐLÐLØ˜) eÑ+°	¸EÑ0AÑBÑBˆIˆIØÔ¥Ô!2Ò2Ð2Ø˜) fÑ,°¸VÑ1CÑDÑDˆIˆIà˜) eÑ+°	¸EÑ0AÑBÑBˆIà 	Ñ)ˆ
Ø 	Ñ)ˆ
ð $¥yÔ';Ò;ÐhÀÄÕS\ÔSgÒAgˆØˆØÔ'ˆàð 	6Ø˜$ÑˆJØ˜$ÑˆJØˆLÝ˜˜SÔ4Ñ5Ô5ˆEð ˜9 vÑ-Ñ.ˆ	ØÔ.°Ñ:ˆØˆØˆàð 	G Ð!;ØÔ&Ô1µYÔ5IÒIÐIà $�Ø #¨Ô(=Ô(OÑ"OÑP�Ø"Ô3ÔF�ð ˜I¨Ñ-Ñ.ˆ
Ý˜˜sÔ3°jÑ@ÑAÔAˆ
ð  
Ñ*¨cÑ1ˆØˆØ -Ñ/°3¸ÀÐY\ÑG\Ñ9]Ñ3]Ñ^ˆå"Ø!Ø!Ø#0Ø(Ø'Ø %Ø$0Ø*Ø'Ø'ð
ñ 
ô 
ð 	
r   Ú	char_sectÚ	char_clanc                 óP  — |j         }|j        |k    }|j        |k    }d}d}d}	g }
|r(|dz  }|dz  }|
                     d|j        › d�¦  «         |r(|dz  }|	dz  }	|
                     d	|j        › d
�¦  «         |
rd                     |
¦  «        nd}t          |||||	|¬¦  «        S )ub   Ä�Ã¡nh giÃ¡ cá»™ng hÆ°á»Ÿng sá»©c máº¡nh khi trang bá»‹ vÅ© khÃ­ khá»›p TÃ´ng MÃ´n vÃ  Cá»• Tá»™c.r/   r1   gš™™™™™¹?g333333Ã?u   ChÃ­nh TÃ´ng u&   : +10% SÃ¡t thÆ°Æ¡ng, +15% Báº¡o KÃ­chg{®Gáz´?gš™™™™™É?u   Huyáº¿t Máº¡ch u'   : +8% SÃ¡t thÆ°Æ¡ng, +20% ChoÃ¡ng vÃ¡ngz | u0   KhÃ´ng cÃ³ cá»™ng hÆ°á»Ÿng mÃ´n phÃ¡i/tá»™c há»‡)Úhas_sect_resonanceÚhas_clan_resonanceÚtotal_damage_multiplierÚbonus_crit_multiplierÚbonus_stun_durationÚdescription)r   Úsect_affinityÚclan_affinityÚappendÚvalueÚjoinr   )r   r*   r\   r]   rK   Ú
sect_matchÚ
clan_matchÚdmg_multÚ
bonus_critÚ
bonus_stunÚnotesÚdescs               r   Úget_affinity_resonancez#WeaponEngine.get_affinity_resonance†   sø   € ð ŒoˆØÔ'¨9Ò4ˆ
ØÔ'¨9Ò4ˆ
àˆØˆ
Øˆ
Øˆàð 	bØ˜ÑˆHØ˜$ÑˆJØ�LŠLÐ`¨¬Ð`Ð`Ð`ÑaÔaÐaØð 	eØ˜ÑˆHØ˜$ÑˆJØ�LŠLÐc¨9¬?ÐcÐcÐcÑdÔdÐdà$)Ðaˆu�zŠz˜%Ñ Ô Ð Ð/aˆå&Ø)Ø)Ø$,Ø",Ø *Øð
ñ 
ô 
ð 	
r   Úcurrent_active_setÚweapon_set_1Úweapon_set_2Úrequired_categoryc           
      ó  — |t           j        k    r"|dk    r|n|}t          d||j        d¬¦  «        S dt          dt           dt
          t          t          t                   f         fd„}|dk    r|n|} |||¦  «        \  }}	|rt          d||	d	|› d
|j	        › �¬¦  «        S |dk    rdnd}
|dk    r|n|} |||¦  «        \  }}|rt          d|
|d|
› d|j	        › d�¬¦  «        S t          d||j        d|j	        › �¬¦  «        S )uë   
        Thuáº­t toÃ¡n giáº£i quyáº¿t Song Binh Tá»± Ä�á»™ng HoÃ¡n Ä�á»•i (Dual Savage Auto-Swap in 0ms).
        Tá»± Ä‘á»™ng chuyá»ƒn vÅ© khÃ­ khá»›p vá»›i yÃªu cáº§u cá»§a chiÃªu thá»©c mÃ  khÃ´ng lÃ m ngáº¯t chuá»—i combo.
        é   Fu7   ChiÃªu thá»©c cháº¥p nháº­n má»�i loáº¡i vÅ© khÃ­ (ANY))ÚswappedÚnew_active_setÚselected_weaponÚreasonÚloadoutÚcatr   c                 óš   — | j         r| j         j        j        |k    r	d| j         fS | j        r| j        j        j        |k    r	d| j        fS dS )NT)FN)Úmainhandr   ÚcategoryÚoffhand)r|   r}   s     r   Úmatchesz/WeaponEngine.resolve_auto_swap.<locals>.matches¾   s\   € ØÔð . GÔ$4Ô$=Ô$FÈ#Ò$MÐ$MØ˜WÔ-Ð-Ð-ØŒð - 7¤?Ô#;Ô#DÈÒ#KÐ#KØ˜Wœ_Ð,Ð,Ø�;r   u   Bá»™ u!    Ä‘Ã£ sáºµn sÃ ng vá»›i vÅ© khÃ­ é   Tu&   Tá»± Ä‘á»™ng hoÃ¡n chuyá»ƒn sang Bá»™ u	    (Khá»›p z) trong 0msuB   Cáº£nh bÃ¡o: KhÃ´ng cÃ³ bá»™ vÅ© khÃ­ nÃ o thá»�a mÃ£n yÃªu cáº§u )
r   ÚANYr   r   r   r   Úboolr   r   rh   )r   rr   rs   rt   ru   Ú
active_setr‚   Úcurrent_loadoutÚhas_currÚwpn_currÚalt_set_numÚalt_loadoutÚhas_altÚwpn_alts                 r   Úresolve_auto_swapzWeaponEngine.resolve_auto_swapª   s§  € ð ¥Ô 2Ò2Ð2Ø);¸qÒ)@Ð)@˜˜ÀlˆJÝ!ØØ1Ø *Ô 3ØPð	ñ ô ð ð	Õ-ð 	µNð 	ÅuÍTÕS[Õ\jÔSkÐMkÔGlð 	ð 	ð 	ð 	ð +=ÀÒ*AÐ*A˜,˜,À|ˆØ$˜W _Ð6GÑHÔHÑˆ�(àð 	Ý!ØØ1Ø (ØmÐ1ÐmÐmÐTeÔTkÐmÐmð	ñ ô ð ð .°Ò2Ð2�a�a¸ˆØ&8¸AÒ&=Ð&=�l�lÀ<ˆØ"˜7 ;Ð0AÑBÔBÑˆ�àð 	Ý!ØØ*Ø 'ØzÀÐzÐzÐVgÔVmÐzÐzÐzð	ñ ô ð õ ØØ-Ø+Ô4ØqÐXiÔXoÐqÐqð	
ñ 
ô 
ð 	
r   r|   c                 ó  — |j         }|j        }|st          dddddd¬¦  «        S |                      |||j        j        |¬¦  «        }d}|j        }d}d}	|r–|j        j        t          j	        k    r|d}|j        j
        r3|j        j
        j        t          j        k    r||j        j
        j        z  }||                     dd¦  «        dz  z  }|j        j        t"          j        k    r|	d	z  }	t          ||j        |||	|j        ¬¦  «        S )
u^   Tá»•ng há»£p toÃ n bá»™ chá»‰ sá»‘ cÃ´ng thá»§ cá»§a má»™t bá»™ vÅ© khÃ­ (Mainhand + Offhand).Fr1   )Ú
has_shieldr;   Útotal_block_chanceÚbonus_armorÚ
bonus_wardÚcombined_dps)r,   Tr"   r.   g      @g      Y@)r   r�   r   r[   r   r+   r9   r?   r	   ÚSHIELDÚimplicit_modÚstatr   ÚBLOCK_CHANCErh   r%   Úelementr   ÚTHUYr;   r6   )
r   r|   r    ÚmainÚoffÚmain_resr�   Úblock_chancer’   r“   s
             r   Úevaluate_loadoutzWeaponEngine.evaluate_loadoutä   s;  € àÔˆØŒoˆàð 	Ý*Ø Ø#Ø#&ØØØ ðñ ô ð ð ×/Ò/°°jÀ$Ä-ÔBZÐknÐ/ÑoÔoˆØˆ
ØÔ2ˆØˆØˆ
àð 	$�3”<Ô,µÔ0BÒBÐBØˆJØŒ|Ô(ð @¨S¬\Ô-FÔ-KÕOaÔOnÒ-nÐ-nØ ¤Ô 9Ô ?Ñ?�Ø˜JŸNšN¨;¸Ñ;Ô;¸cÑAÑBˆKØŒ|Ô#¥|Ô'8Ò8Ð8Ø˜eÑ#�
å&Ø!Ø"Ô0Ø+Ø#Ø!Ø!Ô/ð
ñ 
ô 
ð 	
r   )r   Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ÚstrÚintr…   r)   r   r
   r   r   r[   r   r   r   rq   r   r   r   rŽ   r   rŸ   © r   r   r   r      s~  € € € € € ØfÐfð1ð 1ð 1ð 1ðÐ.@ð ÈdÐSVÐX[ÐS[Ìnð Ðaeð ð ð ð ð& 48ðR
ð R
àðR
ð ˜˜c˜”NðR
ð ð	R
ð
 ! Ô0ðR
ð 
ðR
ð R
ð R
ð R
ðh"
àð"
ð ð"
ð ð	"
ð
 
!ð"
ð "
ð "
ð "
ðH8
àð8
ð 'ð8
ð 'ð	8
ð
 *ð8
ð 
ð8
ð 8
ð 8
ð 8
ðt$
Ð(8ð $
ÀdÈ3ÐPSÈ8Änð $
ÐYpð $
ð $
ð $
ð $
ð $
ð $
r   r   N)r£   Útypingr   r   r   Úserver.world.martial_typesr   r   r   Úserver.world.weapon_typesr	   r
   r   r   r   r   r   r   r   r   r   r   r   r¦   r   r   ú<module>rª      s  ðð	ð 	ð )Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ Pðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð j
ð j
ð j
ð j
ð j
ñ j
ô j
ð j
ð j
ð j
r   