
    IiA,                    L   S r SSKJr  SSKJr  SSKJr  SSKr\(       a  SSKJ	r	  SSK
Jr  SS	KJr  SS
KJr  \ " S S5      5       r S       SS jjrSS jr   S             SS jjr              SS jr          SS jr            SS jrg)z
Combat System for Pirates of the Lost Seas.

Handles cannonball attacks, defenses, and gem stealing.
This module consolidates the duplicate target-finding logic that was
scattered throughout the Lua code.
    )annotations)	dataclass)TYPE_CHECKINGN   )PiratesGame)PiratesPlayer)gems)skillsc                  V    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   Srg)CombatResult   zResult of a combat action.boolhitintattack_rolldefense_rollattack_bonusdefense_bonus	xp_gained N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       :c:\Users\dbart\PlayPalace11\server\games\pirates\combat.pyr   r      s'    $	INr   r   c                   Uc  [         R                  " U5      n/ nU R                  5        HY  nUR                  UR                  :X  a  M  [	        UR
                  UR
                  -
  5      nXR::  d  MH  UR                  U5        M[     U$ )ar  
Get all valid targets within attack range.

This is the unified function that replaces the duplicate target-finding
code that was in the Lua skills.lua and combat.lua files.

Args:
    game: The game instance
    attacker: The attacking player
    max_range: Override range (None uses skill manager's calculated range)

Returns:
    List of players within attack range
)r
   get_attack_rangeget_active_playersidabspositionappend)gameattacker	max_rangetargetsplayerdistances         r   get_targets_in_ranger-   "   sw    " ++H5	G))+99#x((6??:; NN6" , Nr   c                F    [        U R                  UR                  -
  5      $ )z%Get the distance between two players.)r$   r%   )player1player2s     r   get_distancer1   A   s    w'"2"2233r   c                   [         R                  " SS5      nU R                  SU S3SS9  U R                  U5      nU R                  U5      nU(       a  UR	                  SUR
                  SS	9  U(       a  UR	                  S
UR
                  SS9  U R                  SUR
                  UR
                  US9  [        R                  " U5      n	[        R                  " U5      n
[         R                  " SS5      nU R                  SUS9  U	S:  a  U R                  SU	S9  X-  n[         R                  " SS5      nU(       a  UR	                  SUSS9  U R                  SUR
                  XS9  U
S:  a  U R                  SU
S9  X-  nU(       a  SOSnX-  nX:  nU(       a  [         R                  " SS5      nU R                  SU S3SS9  U(       a  UR	                  SUR
                  SS	9  U(       a  UR	                  SUR
                  SS9  U R                  SUR
                  UR
                  US9  [         R                  " S S!5      nUR                  R                  XR
                  UX5        [        XX)X5        [        S"UUU	U
[        UU-  5      S#9$ U(       a  UR	                  S$UR
                  SS	9  U(       a  UR	                  S%SS&9  U R                  S'UR
                  UR
                  US9  [         R                  " S(S)5      nUR                  R                  XR
                  UX5        [        S*UUU	U
[        UU-  5      S#9$ )+a  
Execute an attack between two players.

Args:
    game: The game instance
    attacker: The attacking player
    defender: The defending player
    golden_moon_active: Whether golden moon is active this turn
    global_xp_multiplier: Global XP multiplier from game options
    gem_stealing: Gem stealing mode ("with_roll_bonus", "no_roll_bonus", or "disabled")

Returns:
    CombatResult with the outcome
r      zgame_pirates/cannon.ogg<   volumezpirates-attack-you-firetable)targetbufferzpirates-attack-incoming)r(   r:   zpirates-attack-fired)r(   defenderexclude   zpirates-attack-roll)rollr   zpirates-attack-bonus)bonuszpirates-defense-roll)r>   r:   zpirates-defense-roll-others)r+   r>   r<   zpirates-defense-bonusg      @      ?zgame_pirates/cannonhitF   zpirates-attack-hit-youzpirates-attack-hit-themzpirates-attack-hit2      T)r   r   r   r   r   r   zpirates-attack-miss-youzpirates-attack-miss-them)r:   zpirates-attack-miss   d   F)randomrandint
play_soundget_userspeak_lnamebroadcast_lr
   get_attack_bonusget_defense_bonuslevelinggive_xp_handle_boardingr   r   )r'   r(   r;   golden_moon_activeglobal_xp_multipliergem_stealing	sound_numattacker_userdefender_userr   r   r   r   	moon_mult
total_multr   xp_gains                    r   	do_attackr[   F   sJ   . q!$IOO))D9"OE MM(+MMM(+M7V]^7(--X_`X`  
 **84L,,X6M ..A&K*=a/|D# >>!Q'L4<PWX%hmm,   q0F% *sI1J

$C
NN1a(	04@L!!":8==Y`!a!!";hmm\c!d 8==8==Zb 	 	

 ..S)!!$w	` 	]#%%''J./
 	
 !!";HMMZa!b!!"<W!M!HMMHMM[c 	 	

 ..S)!!$w	`#%%''J./
 	
r   c                   U R                  U5      nU R                  U5      nUS:g  =(       a    UR                  5       nU(       ab  U(       a[  UR                  (       dJ  U R                  X5      n	U	S:X  a   [	        U UUUS:X  a  UOSUS:X  a  UOS5        gU	S;   a  [        XX)5        g[        R                  " SS/5      n
[        XX*5        g)	a  
Handle the boarding action after a successful attack.

The attacker can choose to push the defender or attempt to steal a gem.

Args:
    game: The game instance
    attacker: The attacking player
    defender: The defending player
    attack_bonus: Attacker's bonus (for steal roll if applicable)
    defense_bonus: Defender's bonus (for steal roll if applicable)
    gem_stealing: Gem stealing mode
disabledstealwith_roll_bonusr   N)leftrightr`   ra   )rI   has_gemsis_botrequest_boarding_choice_attempt_gem_steal_push_defenderrF   choice)r'   r(   r;   r   r   rT   rV   rW   	can_stealrg   	directions              r   rQ   rQ      s    * MM(+MMM(+M
*Bx/@/@/BI 8??--hAW ,0A Aq!-1B!B ((48< vw/0I487r   c           
        [         R                  " SS5      nUS:X  a  U* nUR                  n[        S[	        SUR                  U-   5      5      Ul        U R                  U5      nU R                  U5      nU(       a'  UR                  SUR                  UUR                  SS9  U(       a'  UR                  S	UR                  UUR                  SS
9  U R                  SUR                  UR                  UUUR                  US9  g)z-Push the defender in the specified direction.r3      r`   r   (   zpirates-push-your8   )r9   ri   r%   r:   zpirates-push-them)r(   ri   r%   r:   zpirates-push)r(   r;   ri   old_posnew_posr<   N)	rF   rG   r%   maxminrI   rJ   rK   rL   )r'   r(   r;   ri   push_amountrm   rV   rW   s           r   rf   rf      s    ..A&KF"lGAs2x'8'8;'FGHHMM(+MMM(+M==&& 	 	
 ]]&& 	 	
 	!!  r   c                   U R                  SUR                  S9  [        R                  " SS5      U-   n[        R                  " SS5      U-   nU R                  SXVS9  XV:  Ga[  [        R                  " S[	        UR
                  5      S-
  5      nUR                  U5      nUGb  [
        R                  " U5      n	UR                  X5        UR                  [
        R                  5        [        R                  " SS5      n
U R                  S	U
 S
3SS9  [
        R                  " U5      nU R                  U5      nU R                  U5      nU(       a  UR                  SUUR                  SS9  U(       a  UR                  SUUR                  SS9  U R                  SUR                  UUR                  US9  g gU R                  S5        g)a"  
Attempt to steal a gem from the defender.

Args:
    game: The game instance
    attacker: The attacking player
    defender: The defending player
    attack_bonus: Bonus to attacker's steal roll
    defense_bonus: Bonus to defender's steal roll

Returns:
    True if steal was successful
zpirates-steal-attempt)r(   r   r=   zpirates-steal-rolls)r^   defendr      zgame_pirates/stealgemr4   rA   r6   zpirates-steal-success-your8   )gemr9   r:   zpirates-steal-success-them)ru   r(   r:   zpirates-steal-success)r(   ru   r;   r<   Tzpirates-steal-failedF)rL   rK   rF   rG   lenr	   
remove_gemget_gem_valueadd_gemrecalculate_scorerH   get_gem_namerI   rJ   )r'   r(   r;   r   r   
steal_rolldefend_rollstolen_index
stolen_gem	gem_valuerU   gem_namerV   rW   s                 r   re   re     s   ( 	,x}}E1%4J..A&6K**Q~~aX]]);a)?@((6
!**:6IZ3 &&t'9'9: q!,IOO3I;dCBOO((4H MM(3M MM(3M%%/ #=="	 &  %%0 %]]"	 &  '!!    I "R  	/0r   )N)r'   'PiratesGame'r(   'PiratesPlayer'r)   z
int | Nonereturnzlist['PiratesPlayer'])r/   r   r0   r   r   r   )Fr@   r_   )r'   r   r(   r   r;   r   rR   r   rS   floatrT   strr   r   )r'   r   r(   r   r;   r   r   r   r   r   rT   r   r   None)
r'   r   r(   r   r;   r   ri   r   r   r   )r'   r   r(   r   r;   r   r   r   r   r   r   r   )r   
__future__r   dataclassesr   typingr   rF   r'   r   r+   r    r	   r
   r   r-   r1   r[   rQ   rf   re   r   r   r   <module>r      s   # !   !%      MQ
#2?I>4  %"%)u

u
u
 u
 	u

  u
 u
 u
p.8
.8.8 .8 	.8
 .8 .8 
.8b&
&#2&>M&Z]&	&RH
HH H 	H
 H 
Hr   