
    Ii                    R   S r SSKJr  SSKJrJr  SSKJr  SSKJr  SSK	r	SSK
JrJr  SS	KJr  S
SKJrJrJrJr  S
SKJr  S
SKJrJr  S
SKJrJrJrJr  S
SKJr  SSK J!r!  SSK"J#r#  SSK$J%r%  SSK$J&r&  SSK$J'r'  SSK$J(r)  / SQr*\ " S S\5      5       r+\\ " S S\5      5       5       r,g)z
Pirates of the Lost Seas - Main Game Class.

A complex RPG adventure with sailing, combat, and leveling.
Players sail across four oceans, collecting gems and battling other pirates.
    )annotations)	dataclassfield)datetime)TYPE_CHECKINGN   )GamePlayer)register_game   )Action	ActionSet
Visibility	MenuInput)	BotHelper)
GameResultPlayerResult)GameOptionsFloatOption
MenuOptionoption_field)Localization)KeybindState   PiratesPlayer)gems)combat)skills)bot)
zRory's OceanzDeveloper's DeepzProgrammer's Paradise SeazThe Palace WaterszSilva's StraitzKai's CurrentzGamer's GulfzServer Room Seaz
Battle BayzCode Compilation Channelc                      \ rS rSr% Sr\" \" SSSSSSS	S
S95      rS\S'   \" \" SSSSSSSSS95      r	S\S'   \" \
" SS/ SQSSSS.SSSSS95      rS\S'   S rg!)"PiratesOptions,   z*Game options for Pirates of the Lost Seas.      ?g?      @r   combat_multiplierz pirates-set-combat-xp-multiplierz"pirates-enter-combat-xp-multiplierz pirates-option-changed-combat-xp)defaultmin_valmax_valdecimal_places	value_keylabelprompt
change_msgfloatcombat_xp_multiplierfind_gem_multiplierz"pirates-set-find-gem-xp-multiplierz$pirates-enter-find-gem-xp-multiplierz"pirates-option-changed-find-gem-xpfind_gem_xp_multiplierwith_roll_bonusmode)r3   no_roll_bonusdisabledzpirates-stealing-with-bonuszpirates-stealing-no-bonuszpirates-stealing-disabledzpirates-set-gem-stealingzpirates-select-gem-stealingzpirates-option-changed-stealingzpirates-desc-gem-stealing)r'   r+   choiceschoice_labelsr,   r-   r.   descriptionstrgem_stealing N)__name__
__module____qualname____firstlineno____doc__r   r   r0   __annotations__r2   r   r;   __static_attributes__r<       8c:\Users\dbart\PlayPalace11\server\games\pirates\game.pyr"   r"   ,   s    4".)479		
#%  %1+69;		
%E  %%D#@!<7
 -083	
L# rD   r"   c                  D  ^  \ rS rSr% Sr\" \S9rS\S'   \" \	S9r
S\S'   \" \S9rS\S	'   \" \S9rS
\S'   \" \S9rS\S'   SrS\S'   SrS\S'   SrS\S'   \SPS j5       r\SPS j5       r\SPS j5       r\SQS j5       r\SQS j5       rU 4S jrSRU 4S jjrSSSTS jjrSUS jrSUU 4S jjrSRU 4S  jjrSVS! jrSWS" jrSVS# jr SWS$ jr!SVS% jr"SWS& jr#SVS' jr$SWS( jr%SVS) jr&SWS* jr'SXS+ jr(SVS, jr)SWS- jr*SWS. jr+SWS/ jr,SVS0 jr-SWS1 jr.SWS2 jr/SRS3 jr0SRS4 jr1SRS5 jr2SRU 4S6 jjr3SVS7 jr4SRS8 jr5SYS9 jr6SRS: jr7SZS; jr8S[S< jr9S\S= jr:S]S> jr;S]S? jr<S]S@ jr=S]SA jr>S]SB jr?S]SC jr@S]SD jrAS^SE jrBS]SF jrCS]SG jrDS]SH jrES]SI jrFS_SJ jrGS`SK jrHS`SL jrIS`SM jrJSaSN jrKSOrLU =rM$ )bPiratesGame\   a  
Pirates of the Lost Seas - A complex RPG adventure.

Features:
- 40-tile map across 4 oceans
- 18 gems to collect
- Skill system that unlocks as players level up
- Combat with cannonballs, buffs, and gem stealing
- Golden Moon event every 3rd round (3x XP)
)default_factorylist[PiratesPlayer]playersr"   options	list[str]selected_oceanszdict[int, bool]charted_tileszdict[int, int]gem_positionsr   intgems_collected   
total_gemsFboolgolden_moon_activec                    g)NzPirates of the Lost Seasr<   clss    rE   get_namePiratesGame.get_nameu   s    )rD   c                    g)Npiratesr<   rX   s    rE   get_typePiratesGame.get_typey   s    rD   c                    g)Nzcategory-uncategorizedr<   rX   s    rE   get_categoryPiratesGame.get_category}   s    'rD   c                    gNr   r<   rX   s    rE   get_min_playersPiratesGame.get_min_players       rD   c                    g)N   r<   rX   s    rE   get_max_playersPiratesGame.get_max_players   rg   rD   c                "   > [         TU ]  5         g)z Initialize non-serialized state.N)super__post_init__self	__class__s    rE   rn   PiratesGame.__post_init__   s    rD   c                x  > [         TU ]  5         U R                  (       a>  U R                  R                  5        VVs0 s H  u  p[	        U5      U_M     snnU l        U R
                  (       a?  U R
                  R                  5        VVs0 s H  u  p[	        U5      U_M     snnU l        ggs  snnf s  snnf )z,Rebuild runtime state after deserialization.N)rm   rebuild_runtime_staterP   itemsrQ   rO   )rp   kvrq   s      rE   rt   !PiratesGame.rebuild_runtime_state   s    %' 8<8J8J8P8P8R!S8R#a&!)8R!SD8<8J8J8P8P8R!S8R#a&!)8R!SD  "T!Ss   B0B6c                    [        XUS9$ )zCreate a new Pirates player.)idnameis_botr   )rp   	player_idr{   r|   s       rE   create_playerPiratesGame.create_player   s     	VDDrD   c                X   [        SS9nU R                  U5      nU(       a  UR                  OSnUR                  [	        S[
        R                  " US5      SSSS	S
95        UR                  [	        S[
        R                  " US5      SSSS	S
95        UR                  [	        S[
        R                  " US5      SSSS	S
95        UR                  [	        S[
        R                  " US5      SSSS	S
95        UR                  [	        S[
        R                  " US5      SSSS	S
95        UR                  [	        S[
        R                  " US5      SSSS	S
95         UR                  [	        S[
        R                  " US5      S S!S"[        S#S$S%9S&95        UR                  [	        S'[
        R                  " US(5      S)S*S+S,95        UR                  [	        S-[
        R                  " US.5      S/S0S1S,95        UR                  [	        S2[
        R                  " US35      S4S0S1S,95        U$ )5z(Create the turn action set for a player.turn)r{   en	move_leftzpirates-move-left_action_move_left_is_move_enabled_is_move_hiddenF)rz   r,   handler
is_enabled	is_hiddenshow_in_actions_menu
move_rightzpirates-move-right_action_move_rightmove_2_leftzpirates-move-2-left_action_move_2_left_is_move_2_enabled_is_move_2_hiddenmove_2_rightzpirates-move-2-right_action_move_2_rightmove_3_leftzpirates-move-3-left_action_move_3_left_is_move_3_enabled_is_move_3_hiddenmove_3_rightzpirates-move-3-right_action_move_3_right	use_skillzpirates-use-skill_action_use_skill_is_skill_enabled_is_skill_hidden_get_skill_optionszpirates-select-skill)rL   r-   )rz   r,   r   r   r   input_request
check_moonzpirates-check-moon_action_check_moon_is_moon_check_enabled_is_moon_check_hiddenrz   r,   r   r   r   check_positionzpirates-check-position_action_check_position_is_status_enabled_is_status_hiddencheck_statuszpirates-check-status_action_check_status)r   get_userlocaleaddr   r   getr   )rp   player
action_setuserr   s        rE   create_turn_action_set"PiratesGame.create_turn_action_set   sR   F+
}}V$ $$ 	"&&v/BC+-+%*		
 	"&&v/CD,-+%*		
 	 "&&v/DE-/-%*		
 	!"&&v/EF./-%*		
 	 "&&v/DE-/-%*		
 	!"&&v/EF./-%*		
		 	"&&v/BC+.,'01
	
 	"&&v/CD,31	
 	#"&&v/GH0/-	
 	!"&&v/EF./-	
 rD   c                  > [         TU ]  U5      nU R                  U5      nU(       a  UR                  OSn[	        S[
        R                  " US5      SSSS9nUR                  U5        UR                  UR                  ;   a%  UR                  R                  UR                  5        UR                  R                  SUR                  5        U$ )	z7Create the standard action set and add detailed status.r   check_status_detailedzpirates-check-status-detailed_action_check_status_detailedr   _is_always_hiddenr   r   )rm   create_standard_action_setr   r   r   r   r   r   rz   _orderremoveinsert)rp   r   r   r   r   actionrq   s         rE   r   &PiratesGame.create_standard_action_set!  s    W7?
}}V$ $$&""6+JK3+)
 	v99
)))$$VYY/  FII.rD   c                  > [         TU ]  5         SU R                  ;   a  / U R                  S'   SU R                  ;   a  / U R                  S'   U R                  SSS/[        R
                  SS9  U R                  SS	S
/[        R
                  SS9  U R                  SSS/[        R
                  SS9  U R                  SSS/[        R
                  SS9  U R                  SSS/[        R
                  SS9  g)z!Define all keybinds for the game.szshift+spzCheck positionr   T)stateinclude_spectatorsmzCheck moon brightnessr   zCheck statusr   zDetailed statusr   rv   z	Use skillr   FN)rm   setup_keybinds	_keybindsdefine_keybindr   ACTIVEro   s    rE   r   PiratesGame.setup_keybinds3  s    $.. "$DNN3&(*DNN9%%%# 	 	
 	#N%%# 	 	
 	%%# 	 	
 	$%%%# 	 	
 	M%%$ 	 	
rD   c                H    U R                   S:w  a  gU R                  U:w  a  gg Nplayingaction-not-playingaction-not-your-turnstatuscurrent_playerrp   r   s     rE   r   PiratesGame._is_move_enabledd  %    ;;)#'&()rD   c                    U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ [        R                  $ Nr   r   r   HIDDENr   VISIBLEr   s     rE   r   PiratesGame._is_move_hiddenk  @    ;;)#$$$&($$$!!!rD   c                    U R                   S:w  a  gU R                  U:w  a  g[        U[        5      (       a  UOS nU(       a  UR                  S:  a  gg )Nr   r   r      zpirates-requires-level-15r   r   
isinstancer   levelrp   r   r   s      rE   r   PiratesGame._is_move_2_enabledr  sH    ;;)#'&() 77FTAGGbL.rD   c                "   U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ [	        U[
        5      (       a  UOS nU(       a  UR                  S:  a  [        R                  $ [        R                  $ )Nr   r   r   r   r   r   r   r   r   r   r   s      rE   r   PiratesGame._is_move_2_hidden|  sl    ;;)#$$$&($$$ 77FTAGGbL$$$!!!rD   c                    U R                   S:w  a  gU R                  U:w  a  g[        U[        5      (       a  UOS nU(       a  UR                  S:  a  gg )Nr   r   r      zpirates-requires-level-150r   r   s      rE   r   PiratesGame._is_move_3_enabled  sH    ;;)#'&() 77FTAGGcM/rD   c                "   U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ [	        U[
        5      (       a  UOS nU(       a  UR                  S:  a  [        R                  $ [        R                  $ )Nr   r   r   r   s      rE   r   PiratesGame._is_move_3_hidden  sl    ;;)#$$$&($$$ 77FTAGGcM$$$!!!rD   c                H    U R                   S:w  a  gU R                  U:w  a  gg r   r   r   s     rE   _is_cannonball_enabled"PiratesGame._is_cannonball_enabled  r   rD   c                    U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ [        R                  $ r   r   r   s     rE   _is_cannonball_hidden!PiratesGame._is_cannonball_hidden  r   rD   c                H    U R                   S:w  a  gU R                  U:w  a  gg r   r   r   s     rE   r   PiratesGame._is_skill_enabled  r   rD   c                    U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ [        R                  $ r   r   r   s     rE   r   PiratesGame._is_skill_hidden  r   rD   c                    [        U[        5      (       d  / $ / n[        R                  " U5       H#  nUR	                  UR                  U5      5        M%     U$ )z(Get available skills for the skill menu.)r   r   r   get_available_skillsappendget_menu_label)rp   r   rL   skills       rE   r   PiratesGame._get_skill_options  sJ    &-00I008ENN5//78 9rD   c                &    U R                   S:w  a  gg )Nr   r   )r   r   s     rE   r   PiratesGame._is_status_enabled  s    ;;)#'rD   c                b    U R                   S:w  a  [        R                  $ [        R                  $ r   )r   r   r   r   r   s     rE   r   PiratesGame._is_status_hidden  s&    ;;)#$$$!!!rD   c                "    [         R                  $ Nr   r   r   s     rE   _is_check_scores_hidden#PiratesGame._is_check_scores_hidden         rD   c                "    [         R                  $ r   r   r   s     rE    _is_check_scores_detailed_hidden,PiratesGame._is_check_scores_detailed_hidden  r  rD   c                J    U R                   S:w  a  gU R                  (       d  gg )Nr   r   zpirates-no-golden-moon)r   rV   r   s     rE   r   "PiratesGame._is_moon_check_enabled  s     ;;)#'&&+rD   c                    U R                   S:w  a  [        R                  $ U R                  (       d  [        R                  $ [        R                  $ r   )r   r   r   rV   r   r   s     rE   r   !PiratesGame._is_moon_check_hidden  s;    ;;)#$$$&&$$$!!!rD   c                "    [         R                  $ )z0Always return hidden - for keybind-only actions.r   r   s     rE   r   PiratesGame._is_always_hidden  s       rD   c                R   SU l         SU l        SU l        U R                  S5        U R	                  SSS9  U R                  S5        [        [        5      n[        R                  " U5        US	S
 U l
        U R                  SSR                  U R                  5      S9  U R                  5        H  n[        R                  " SS5      Ul        M!     [        SS5       Vs0 s H  o3S_M     snU l        ["        R$                  " S5      U l        SU l        SU l        U R                  SU R(                  S9  U R                  5       nU R-                  U5        U R/                  5         U R1                  5         [2        R4                  " U [        R                  " SS5      S9  g	s  snf )zCalled when the game starts.r   Tr   zgame_pirates/mus.oggzgame_pirates/amloop.oggzgame_pirates/am_intro.ogg)introzpirates-welcomeN   zpirates-oceans, )oceansr   (   )   FrS   zpirates-gems-placed)total
      ticks)r   game_activeround
play_musicplay_ambiencebroadcast_llistOCEAN_NAMESrandomshufflerN   joinget_active_playersrandintpositionrangerO   r   
place_gemsrP   rT   rR   set_turn_playersrebuild_all_menus_start_roundr   	jolt_bots)rp   	availabler   iactive_playerss        rE   on_startPiratesGame.on_start  sp   
 	./4<WX*+ %	y!(!})$))D<P<P2QR --/F$nnQ3FO 0 16a=1h= "__R0.dooF 002n- 	  	Dr2(>?% >s   !F$c                    U =R                   S-  sl         U R                   S-  S:H  U l        U R                  (       a"  U R                  S5        U R                  S5        U R	                  5         g)zStart a new round.r   r   r   zgame_pirates/goldenmoon.oggzpirates-golden-moonN)r  rV   
play_soundr  _announce_turn)rp   s    rE   r)  PiratesGame._start_round  sY    

a
 #'**q.A"5""OO9:23 	rD   c                   U R                   nU(       a  [        U[        5      (       d  g[        R                  " X5        UR
                  (       dV  U R                  U5      nU(       a>  UR                  R                  SU R                  5       S9(       a  UR                  S5        U R                  SUR                  UR                  S9  g)zAnnounce whose turn it is.Nplay_turn_sound)	game_typezgame_pig/turn.oggzpirates-turn)r   r$  )r   r   r   r   on_turn_startr|   r   preferencesget_effectiver^   r1  r  r{   r$  )rp   r   r   s      rE   r2  PiratesGame._announce_turn  s    $$Z>> 	T* }}==(D((66!T]]_ 7   34fooVrD   c                p   > [         TU ]  5         U R                  S:w  a  g[        R                  " U 5        g)zCalled every game tick.r   N)rm   on_tickr   r   ro   s    rE   r<  PiratesGame.on_tick2  s,    ;;)# 	$rD   c                Z    [        U[        5      (       d  g[        R                  " X5      $ )z(Determine what action a bot should take.N)r   r   bot_ai	bot_thinkr   s     rE   r@  PiratesGame.bot_think<  s#    &-00--rD   c                   U R                   nU(       a  [        U[        5      (       d  gU R                  U5        U R                  S::  a  U R                  5         gU R                  SS9  U R                  S:X  a  U R                  5         OU R                  5         U R                   nU R                   H+  nX!:X  a  U R                  USS9  M  U R                  U5        M-     [        R                  " U [        R                  " SS5      S	9  g)
zEnd the current player's turn.Nr   F)announcer   )r$  P   x   r  )r   r   r   _check_gem_collectionrT   	_end_gameadvance_turn
turn_indexr)  r2  rK   rebuild_player_menur   r*  r  r#  )rp   currentr   s      rE   end_turnPiratesGame.end_turnB  s    %%j-@@ 	""7+ ??aNN 	5) ??a! %%A|((Q(7((+	  	Dr3(?@rD   c                @   U R                   R                  UR                  S5      nUS:X  a  g[        R                  " U5      n[        R
                  " U5      n[        R                  " SS5      nU R                  SU S3SS9  UR                  X#5        U R                  U5      nU(       a  UR                  S	UUS
S9  U R                  SUR                  XCUS9  [        R                  " SS5      nU R                  (       a  SOSnUR                  R!                  XR                  XxU R"                  R$                  5        SU R                   UR                  '   U =R&                  S-  sl        U =R(                  S-  sl        SU R*                  UR                  '   g)z+Check if player is on a gem and collect it.Nr   r   zgame_pirates/grabgem.oggF   volumezpirates-gem-found-youtable)gemvaluebufferzpirates-gem-found)r   rU  rV  excluder   i,  r%   r$   T)rP   r   r$  r   get_gem_valueget_gem_namer  r#  r1  add_gemr   speak_lr  r{   rV   levelinggive_xprL   r2   rT   rR   rO   )	rp   r   gem_type	gem_valuegem_name	sound_numr   xp_gain	moon_mults	            rE   rF  !PiratesGame._check_gem_collectione  sd   %%))&//2>r>&&x0	$$X. NN1a(	.yk>rJ 	x+}}V$LL'	   	\b 	 	

 ..c*22C	++w4<<3V3V	

 /16??+1q .26??+rD   c                   U R                  S5        U R                  5       nU(       d  g[        S U 5       5      nU Vs/ s H  o3R                  U:X  d  M  UPM     nn[        R
                  " U5      nU R                  SSS9  U R                  SUR                  UR                  S9  UR                  U l        UR                  U l	        U R                  5         gs  snf )	z"End the game and determine winner.zpirates-all-gems-collectedNc              3  8   #    U  H  oR                   v   M     g 7fr   score).0r   s     rE   	<genexpr>(PiratesGame._end_game.<locals>.<genexpr>  s     <^GG^s   zgame_pig/win.oggrD  rR  zpirates-winner)r   ri  )r  r"  maxri  r  choicer1  r{   _winner_name_winner_scorefinish_game)rp   r-  highest_scorer   winnerswinners         rE   rG  PiratesGame._end_game  s    56 002<^<<,In=0H1nI w'*26)&++V\\R #KK#\\ Js    CCc                   U R                  5       n[        US SS9n0 n0 n0 nU H_  nUR                  X6R                  '   UR                  XFR                  '   [
        R                  " UR
                  5      XVR                  '   Ma     [        U SS5      n[        U SS5      n[        U R                  5       [        R                  " 5       R                  5       U R                  U Vs/ s H8  n[        UR                  UR                  UR                   [        USS	5      S
9PM:     snUUUUUU R"                  U R$                  S.S9$ s  snf )z1Build the game result with Pirates-specific data.c                    U R                   $ r   rh  )r   s    rE   <lambda>/PiratesGame.build_game_result.<locals>.<lambda>  s    aggrD   T)keyreversero  Nrp  r   is_virtual_botF)r}   player_namer|   r|  )winner_namewinner_scorefinal_scoresfinal_levels
final_gemsrounds_playedrR   )r6  	timestampduration_ticksplayer_resultscustom_data)r"  sortedri  r{   r   r   format_gem_listgetattrr   r^   r   now	isoformatsound_scheduler_tickr   rz   r|   r  rR   )	rp   r-  sorted_playersr  r  r  r   r~  r  s	            rE   build_game_resultPiratesGame.build_game_result  s7   0024EtT 
A#$77L #$77L !%!5!5aff!=Jvv  
 dND9t_a8mmolln..044 ( (A dd !88#*1.>#F	 (  + , , ,(!%"&"5"5
 	
s   '?Ec           
     N   [         R                  " US5      /nUR                  R                  S0 5      nUR                  R                  S0 5      n[        UR	                  5       S5       H6  u  nu  pxUR                  US5      n	UR                  U SU SU SU	 35        M8     U$ )	z'Format the end screen for Pirates game.zgame-final-scoresr  r  r   r   z. z: z points, level )r   r   r  	enumerateru   r   )
rp   resultr   linesr  r  r,  r{   ri  r   s
             rE   format_end_screenPiratesGame.format_end_screen  s    !!&*=>?))--nbA))--nbA ),*<*<*> BA} $$T1-ELLA3bbugFG !C rD   c                |   UR                   nUS:  a  [        SUR                   U-   5      nO[        SUR                   U-   5      nXC:X  a*  U R                  U5      nU(       a  UR	                  SUSS9  gXAl         [        U5      nUS:X  a,  [        R                  " SS5      nU R                  S	U S
3SS9  OcUS:X  a,  [        R                  " SS5      nU R                  SU S
3SS9  O1US:X  a+  [        R                  " SS5      nU R                  SU S
3SS9  US:  a  SOSnU R                  U5      nU(       a@  US:X  a  UR	                  SUUR                   SS9  OUR	                  SUUUR                   SS9  U R                  SUR                  UUR                   US9  SU R                  UR                   '   g)zp
Move a player by the specified amount.

Returns:
    True if move was successful, False if blocked by map edge
r   r  r   zpirates-map-edgerT  )r$  rW  Fr   zgame_pirates/moverP  <   rR  r   zgame_pirates/boatzgame_pirates/futurerightleftzpirates-move-you)	directionr$  rW  zpirates-move-you-tiles)tilesr  r$  rW  zpirates-move)r   r  r$  rX  T)r$  minrm  r   r\  absr  r#  r1  r  r{   rO   )	rp   r   amountold_positionnew_positionr   
abs_amountrb  r  s	            rE   _move_playerPiratesGame._move_player  s    A:r6??V#;<Lq&//F":;L'==(D/,wW& [
?q!,IOO/	{$?OK1_q!,IOO/	{$?OK1_q!,IOO1)DA"OM%zGv	}}V$Q&'#__"	   ,$'#__"   	;;__ 	 	
 /36??+rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g )NrO  r   r   r  rL  rp   r   	action_ids      rE   r   PiratesGame._action_move_left!  3    &-00VR((MMO )rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g )Nr   r  r  s      rE   r   PiratesGame._action_move_right'  3    &-00VQ''MMO (rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g )Nr  r  s      rE   r   PiratesGame._action_move_2_left-  r  rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g rd   r  r  s      rE   r    PiratesGame._action_move_2_right3  r  rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g )Nr  r  s      rE   r   PiratesGame._action_move_3_left9  r  rD   c                    [        U[        5      (       d  g U R                  US5      (       a  U R                  5         g g )Nr   r  r  s      rE   r    PiratesGame._action_move_3_right?  r  rD   c                    [        U[        5      (       d  gU R                  U:w  a  gU R                  U5      nUS:X  a  U R	                  5         gg)z'Fire a cannonball at a target in range.NrL  )r   r   r   handle_cannonball_attackrL  )rp   r   r  r  s       rE   _action_cannonballPiratesGame._action_cannonballE  sI    &-00&(..v6ZMMO  rD   c                |   [        U[        5      (       d  g[        R                  " U5       H  nUR	                  U5      U:X  d  M  UR                  X5      u  pVU(       a)  UR                  X5      nUS:X  a  U R                  5           gU R                  U5      nU(       a  U(       a  UR                  USS9    g   g)zHandle skill menu selection.NrL  rT  rW  )
r   r   r   r   r   can_perform	do_actionrL  r   speak)	rp   r   skill_choicer  r   can_usereasonr  r   s	            rE   r   PiratesGame._action_use_skillT  s    &-00 008E##F+|;"'"3"3D"A"__T:F+
   ==0D

6'
: 9rD   c                   [        U[        5      (       d  gU R                  U5      nU(       d  g/ nU R                  5        Hj  n[        R
                  " UR                  5      nUR                  UR                   SUR                   SUR                   SUR                   SU 3	5        Ml     U H  nUR                  U5        M     g)zShow game status to the player.N: Level r   XP, 	 points, )r   r   r   r"  r   r  r   r{   r   xpri  r  )rp   r   r  r   r  r   gem_strlines           rE   r    PiratesGame._action_check_statusk  s    &-00}}V$((*A**1662GLLAFF88AGG9BqttfE!'')T[S\]^ + DJJt rD   c                R   [        U[        5      (       d  g/ nU R                  5        Hj  n[        R                  " UR                  5      nUR                  UR                   SUR                   SUR                   SUR                   SU 3	5        Ml     U R                  X5        g)z%Show detailed status in a status box.Nr  r  r  r  )r   r   r"  r   r  r   r{   r   r  ri  
status_box)rp   r   r  r  r   r  s         rE   r   )PiratesGame._action_check_status_detailed{  s    &-00((*A**1662GLLAFF88AGG9BqttfE!'')T[S\]^ + 	&rD   c                   [        U[        5      (       d  gUR                  S-
  S-  nU[        U R                  5      :  a  U R                  U   OSnU R                  U5      nU(       a  UR                  SUR                  US9  gg)z#Announce player's current position.Nr   r  Unknownzpirates-your-position)r$  ocean)r   r   r$  lenrN   r   r\  )rp   r   r  ocean_index
ocean_namer   s         rE   r   "PiratesGame._action_check_position  s    &-00*r1 S!5!566   - 	 }}V$LL06??R\L] rD   c                    U R                   S-  S-  nU R                  U5      nU(       a  UR                  SUU R                   SS9  gg)z2Check moon brightness (gems collected percentage).d   rS   zpirates-moon-brightness)
brightness	collectedr  N)rR   r   r\  )rp   r   r  r  r   s        rE   r   PiratesGame._action_check_moon  sP    ))C/B6
}}V$LL)%--	   rD   c                .    [         R                  " X5      $ )z*Get all valid targets within attack range.)r   get_targets_in_range)rp   attackers     rE   r   PiratesGame.get_targets_in_range  s    **4::rD   c                   U R                  U5      nU(       d@  [        R                  " U5      nU R                  U5      nU(       a  UR	                  SUSS9  gUR
                  (       d   [        R                  " XU5      nU(       aN  [        R                  " U UUU R                  U R                  R                  U R                  R                  5        gg)z"Handle a cannonball attack action.zpirates-no-targetsrT  )r%  rW  continuerL  )r  r   get_attack_ranger   r\  r|   r?  bot_select_targetr   	do_attackrV   rL   r0   r;   )rp   r   targets	max_ranger   targets         rE   r  $PiratesGame.handle_cannonball_attack  s    ++F3//7I==(D17S }}  ))$@''11)) rD   c                  ^ / nU R                  5        H  nUR                  UR                  :X  a  M  UR                  S-
  S-  mT[        U R                  5      :  a  U R                  T   OSn[        U4S jU 5       5      (       a  Mw  UR                  TU45        M     U(       dD  U R                  U5      nU(       a  UR                  SSS9  U R                  SUR                  US	9  g
UR                  (       a  [        R                  " XU5      nO[        R                  " U5      S   nUc  g
US-  S-   nUS-   S-  n	[        R                   " X5      n
Xl        UR#                  U5        [        R                   " SS5      nU R%                  SU S3SS9  U[        U R                  5      :  a  U R                  U   OSnU R                  SUR                  XZS9  SU R&                  U
'   g)zHandle the portal skill.r   r  r  c              3  2   >#    U  H  oS    T:H  v   M     g7f)r   Nr<   )rj  o	ocean_nums     rE   rk  ,PiratesGame.handle_portal.<locals>.<genexpr>  s     B/Qty(/s   zpirates-portal-no-shipsrT  r  zpirates-portal-fizzle)r   rX  r  r   r   zgame_pirates/portalrP  r  rR  zpirates-portal-success)r   r  r$  TrL  )r"  rz   r$  r  rN   anyr   r   r\  r  r{   r|   r?  bot_select_portal_oceanr  rn  r#  start_cooldownr1  rO   )rp   r   r   occupied_oceansr   r  r   chosen_oceanocean_start	ocean_endnew_posrb  r  s               @rE   handle_portalPiratesGame.handle_portal  s    24((*Attvyy aB.I s4#7#788 $$Y/ 
 B/BBB&&	:'>? + ==(D6wG4V[[RXY ==!99$XL "==9!<L #R'!+!A%+	..8!V$NN1a(	-i[=bI c$"6"677   . 	
 	$V[[
 	 	
 '+7#rD   c           	     @   U R                  SSS9  U R                  U5      nU(       a  UR                  SSS9  U R                  SUR                  SUS	9  [        S
S5       H  nU R                  U5      nU(       d  U(       a  UR                  SUSS9    gU(       a  UR                  SUSS9  [        R                  " XU5      nU(       d  Mm  [        R                  " U UUU R                  U R                  R                  U R                  R                  5        M     g)z*Handle the battleship skill (two attacks).zgame_pirates/battleship.oggr  rR  zpirates-battleship-activatedrT  r  zpirates-skill-activated
Battleship)r   r   rX  r   r   zpirates-battleship-no-targets)shotrW  zpirates-battleship-shotrL  )r1  r   r\  r  r{   r%  r  r?  r  r   r  rV   rL   r0   r;   )rp   r   r   r  r  r  s         rE   handle_battleshipPiratesGame.handle_battleship  s   5bA}}V$LL7LH%fkkW] 	 	
 !QKD//7GLL!@tT[L\   6T'R--dGDFv  ++LL55LL--  * rD   c                    U R                   R                  S:g  =(       a    UR                  5       n[        R                  " XX#5      $ )zHRequest boarding action choice from player (simplified for bot/default).r6   )rL   r;   has_gemsr?  bot_select_boarding_action)rp   r  defender	can_steals       rE   request_boarding_choice#PiratesGame.request_boarding_choice$  s7    LL--;S@Q@Q@S	00UUrD   )ro  rp  rO   r  rP   rR   rV   r  rN   r   rT   )returnr:   )r  rQ   )r  None)F)r}   r:   r{   r:   r|   rU   r  r   )r   r
   r  r   )r   r
   r  z
str | None)r   r
   r  r   )r   r
   r  rM   )r   r   r  r  )r  r   )r  r   r   r:   r  rM   )r   r   r  rQ   r  rU   )r   r
   r  r:   r  r  )r   r
   r  r:   r  r:   r  r  )r  r   r  rJ   )r   r   r  r:   )r  r   r   r   r  r:   )Nr=   r>   r?   r@   rA   r   r  rK   rB   r"   rL   rN   dictrO   rP   rR   rT   rV   classmethodrZ   r^   ra   re   rj   rn   rt   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r.  r)  r2  r<  r@  rL  rF  rG  r  r  r  r   r   r   r   r   r   r  r   r   r   r   r   r  r  r  r  r  rC   __classcell__)rq   s   @rE   rG   rG   \   s   	 $)#>G >#NCG^C "'t!<OY<%*4%@M?@$)$$?M>?NCJ$$* *   ( (     	TE~@$+
b"""""
"
!!"!*@XW& .!AF'3R0'
R"?B	. '^ ";@6p DV VrD   rG   )-rA   
__future__r   dataclassesr   r   r   typingr   r  baser	   r
   registryr   game_utils.actionsr   r   r   r   game_utils.bot_helperr   game_utils.game_resultr   r   game_utils.optionsr   r   r   r   messages.localizationr   server.core.ui.keybindsr   r   r    r   r   r   r    r?  r  r"   rG   r<   rD   rE   <module>r     s    # (      $ J J . > T T 1 0 !     ,[ , ,^ IV$ IV  IVrD   