
    Ii                         S r SSKJr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  SSKJr  SSKJrJrJr  SSKJrJr  SSK J!r!  \\
 " S S\5      5       5       r"g)a]  
Coup Game Implementation for PlayPalace v11.

A game of deduction and deception. Players start with two influences (character cards)
and two coins. The goal is to eliminate all other players' influences.

Actions:
- Income: Take 1 coin
- Foreign Aid: Take 2 coins (can be blocked by Duke)
- Coup: Pay 7 coins, choose player to lose influence (mandatory at 10+ coins)
- Duke: Take 3 coins
- Assassin: Pay 3 coins, choose player to lose influence (can be blocked by Contessa)
- Captain: Steal 2 coins from another player (can be blocked by Captain or Ambassador)
- Ambassador: Exchange cards with the deck
    )	dataclassfield)datetimeN   )GamePlayer)register_game   )Action	ActionSet
Visibility	MenuInput)	BotHelper)
GameResultPlayerResult)Localization)KeybindState   )DeckCard	Character)
CoupPlayerCoupOptions)CoupBotc            	       f  ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9r\
\	S'   \" \S9r\\	S'   Sr\\	S'   S	r\S	-  \	S
'   S	r\S	-  \	S'   S	r\S	-  \	S'   S	r\S	-  \	S'   Sr\\	S'   \" \S9r\\   \	S'   \" \S9r\\\\   4   \	S'   Sr\\	S'   Sr\\	S'   S	r\S	-  \	S'   Sr\\	S'   \" \S9r\\ \\\4      \	S'   0 SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S)_S*S+_S,S-_S.S/_S0S1_S2S3_S4S5_S6S7_S8S-_S9S:_S;S)S<S=S>.Er!Sr"\\	S?'   Sr#\\	S@'   SA\SB\4SC jr$U 4SD jr%\&SB\4SE j5       r'\&SB\4SF j5       r(\&SB\4SG j5       r)\&SB\4SH j5       r*\&SB\4SI j5       r+\&SB\\   4SJ j5       r,SSK\SL\SM\SB\4SN jjr-SSO jr.SSP jr/SSQ jr0SU 4SR jjr1SS\SB\24ST jr3/ SUQr4SS\5SB\24U 4SV jjr6SSSWSB\74U 4SX jjr8SSSWSB\74U 4SY jjr9SS\5SB\74SZ jr:SS\5SB\74S[ jr;SS\5SB\S	-  4S\ jr<SS\5SB\S	-  4S] jr=SSS\5S^\S	-  SB\74S_ jjr> SSS\5S^\S	-  SB\S	-  4S` jjr?SS\5S^\SB\4Sa jr@SS\5SB\74Sb jrASSS\5S^\S	-  SB\S	-  4Sc jjrBSS\5S^\SB\4Sd jrCSS\5SB\74Se jrDSS\5SB\S	-  4Sf jrESS\5SB\74Sg jrFSS\5SB\S	-  4Sh jrGSS\5SB\74Si jrHSS\5SB\S	-  4Sj jrISS\5S^\SB\4Sk jrJSS\5SB\S	-  4Sl jrKSS\5SB\74Sm jrLSS\5SB\S	-  4Sn jrMSS\5SB\S	-  4So jrNSS\5SB\S	-  4Sp jrOSS\5SB\S	-  4Sq jrPSS\5SB\\   4Sr jrQSs\SB\4St jrRSS\5S\\   SB\S	-  4Su jrSSS\5S^\SBS	4Sv jrTSS\5S^\SBS	4Sw jrUSS\5S^\SBS	4Sx jrVSS\5S^\SBS	4Sy jrWSS\5S^\SBS	4Sz jrXSS\5S{\S^\SBS	4S| jrYSS\5S^\SBS	4S} jrZSS\5S{\S^\SBS	4S~ jr[SS\5S{\S^\SBS	4S jr\SS\5S^\SBS	4S jr]SSK\S\S\S	-  SBS	4S jjr^SS\5S^\SBS	4S jr_SS\5S^\SBS	4S jr`SS\5S^\SBS	4S jraS\SB\4S jrbS\SB\\\   -  4S jrcSS jrdS\S\SBS	4S jreS\SBS	4S jrfSU 4S jjrgSS jrhSS\5S^\SBS	4S jriS\S\\j-  SBS	4S jrkSK\S\SBS	4S jrlSS\5S^\SBS	4S jrmSS jrnS\S	-  SBS	4S jroSB\p4S jrqS\pS\SB\\   4S jrrSB\\   4S jrsSrtU =ru$ )CoupGame"   z
Coup game implementation.
)default_factoryplayersoptionsdeckmain
turn_phaseNactive_actionactive_target_idactive_claimer_idoriginal_claimer_idr   return_countpassed_playersplayer_claims _losing_player_idend_turn_next_action_after_lose_steal_block_claimed_roleFis_resolvingevent_queueassassinate.ogg   block_contessa.ogg<   block_duke.ogg:   block_stealing.ogg   challenge.ogg,   challengefail.ogg   challengesuccess.ogg)   zchardestroy1.ogg   zchardestroy2.ogg   zclaim_ambassador.ogg
   zclaim_assassin.ogg   zclaim_captain.ogg$   zclaim_contessa.ogg   zclaim_duke.ogg   coup.oggY   zexchange_complete.oggzexchange_start.oggn      ;      )zforeign_aid.oggz
income.oggz	steal.oggztax.ogginterrupt_timer_ticksinterrupt_duration_ticksfilenamereturnc                 b    UR                  S5      S   nU R                  R                  US5      $ )z6Helper to get dynamic duration of audio file in ticks./r   )splitAUDIO_DURATIONS_TICKSget)selfrO   names      5c:\Users\dbart\PlayPalace11\server\games\coup\game.pyget_audio_duration_ticks!CoupGame.get_audio_duration_ticks_   s.    ~~c"2&))--dA66    c                 "   > [         TU ]  5         g N)super__post_init__)rW   	__class__s    rY   r`   CoupGame.__post_init__d   s    r\   c                     g)NCoup clss    rY   get_nameCoupGame.get_nameg       r\   c                     g)Ncoupre   rf   s    rY   get_typeCoupGame.get_typek   rj   r\   c                     g)Nzcategory-playauralre   rf   s    rY   get_categoryCoupGame.get_categoryo   s    #r\   c                     g)Nr   re   rf   s    rY   get_min_playersCoupGame.get_min_playerss       r\   c                     g)N   re   rf   s    rY   get_max_playersCoupGame.get_max_playersw   ru   r\   c                 
    / SQ$ )N)winsratinggames_playedre   rf   s    rY   get_supported_leaderboards#CoupGame.get_supported_leaderboards{   s    11r\   	player_idrX   is_botc                     [        XUS9$ )zCreate a new Coup player.)idrX   r   )r   )rW   r   rX   r   s       rY   create_playerCoupGame.create_player   s    Y&AAr\   c                    SU l         U R                  5         SU l        SU l        [	        5       U l        U R
                  R                  5         U R
                  R                  5         U R                  5       nU R                  R                  5         U H  nSUl        / Ul        SUl        [        5       U R                  UR                  '   [!        S5       HA  nU R
                  R#                  5       nU(       d  M&  UR                  R%                  U5        MC     M     U R'                  U5        U R)                  S5        U R+                  S[,        R.                  " SS5       S	35        [0        R2                  " U [,        R.                  " S
S5      S9  U H(  nUR4                  (       a  M  U R7                  US5        M*     U R9                  5         U R;                  5         g)zCalled when the game starts.playingTr   r   Fzgame_coup/music.oggzgame_cards/shuffler
   .oggrB   r9   ticks
check_handN)status_sync_table_statusgame_activeroundr   r!   build_standard_deckshuffleget_active_playersr*   clearcoins
influencesis_deadsetr   rangedrawappendset_turn_players
play_music
play_soundrandomrandintr   	jolt_botsr   _action_check_handreset_turn_order_start_turn)rW   active_playersplayer_cards        rY   on_startCoupGame.on_start   s{   !
 F			%%'		 002  "$FFL "F"FN,/EDvyy)1Xyy~~'4%%,,T2  % 	n- 	-.,V^^Aq-A,B$GH 	Dr2(>? %F===''= %
 	r\   c                 J   U R                   nU(       a  [        U[        5      (       d  gU R                  5       n[	        U5      S::  a  U R                  U(       a  US   OS5        gUR                  (       a  U R                  5         gU R                  5         SU l	        SU l
        SU l        SU l        SU l        SU l        [        5       U l        SU l        UR$                  (       a*  [&        R(                  " U[*        R,                  " SS5      S9  U R/                  5         g)zStart a player's turn.Nr   r   r"   r9   2   r   )current_player
isinstancer   get_alive_playerslen	_end_gamer   	_end_turnannounce_turnr#   r$   r%   r&   r'   rM   r   r)   r/   r   r   jolt_botr   r   rebuild_all_menus)rW   r   alives      rY   r   CoupGame._start_turn   s    $$Z
;; &&(u:?NNu58$7 >>NN 	 ! $!%#' %&"!e)-&==vV^^B-CD r\   c                 B    U R                  SS9  U R                  5         g)zEnd current player's turn.F)announceN)advance_turnr   )rW   s    rY   r   CoupGame._end_turn   s    5)r\   c                   > [         TU ]  5         Sn[        U S5      (       aD  U R                  (       a3  U R	                  U R                  5      nU(       a  U R                  U5      nU(       a  UR                  OSnU R                  S[        R                  " US5      S/[        R                  SS9  U R                  S	[        R                  " US
5      S/[        R                  S9  U R                  S[        R                  " US5      S/[        R                  SS9  U R                  S[        R                  " US5      S/[        R                  S9  U R                  S[        R                  " US5      S/[        R                  S9  U R                  S[        R                  " US5      S/[        R                  S9  g)z!Define all keybinds for the game.Nhost_usernameenwcoup-action-check-wealthcheck_wealthT)stateinclude_spectatorshcoup-action-check-handr   )r   lcoup-action-check-tablecheck_tableccoup-action-challenge	challengevcoup-action-blockblockpcoup-action-passpass)r_   setup_keybindshasattrr   get_player_by_nameget_userlocaledefine_keybindr   rV   r   ACTIVE)rW   userr   r   ra   s       rY   r   CoupGame.setup_keybinds   s    4))d.@.@,,T-?-?@F}}V, $$ 	V%?@%%# 	 	
 	V%=>N%%	 	 	
 	V%>?O%%# 	 	
 	V%<=M%%	 	 	
 	!!&*=>	Q]QdQd 	 	
 	!!&*<=x|ObOb 	 	
r\   r   c                 r   U R                  U5      nU(       a  UR                  OSn[        SS9n[        S5       H9  nUR	                  [        SU 3[        R                  " US5      SSS	S
SS95        M;     [        S5       H9  nUR	                  [        SU 3[        R                  " US5      SSSSSS95        M;     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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      S0S1S-SS95        UR	                  [        S2[        R                  " US35      S4S5S-[        S6S7S8S99SS:95        UR	                  [        S;[        R                  " US<5      S=S1S-SS95        UR	                  [        S>[        R                  " US?5      S@SAS-[        S6S7S8S99SS:95        UR	                  [        SB[        R                  " USC5      SDS1S-[        S6S7S8S99SS:95        UR	                  [        SE[        R                  " USF5      SGS1S-SS95        U$ )Hz(Create the turn action set for a player.r   turn)rX      lose_influence_zcoup-action-lose-influence_action_lose_influence_is_lose_influence_enabled_is_lose_influence_hidden_get_lose_influence_labelF)r   labelhandler
is_enabled	is_hidden	get_labelshow_in_actions_menureturn_card_zcoup-action-return-card_action_return_card_is_return_card_enabled_is_return_card_hidden_get_return_card_labelr   r   _action_challenge_is_challenge_enabled_is_interrupt_hiddenr   r   r   r   r   r   r   r   _action_block_is_block_enabled_is_block_hidden_get_block_labelblock_captainzcoup-action-block-captain_is_block_steal_enabled_is_block_steal_hiddenblock_ambassadorzcoup-action-block-ambassadorr   r   _action_pass_is_pass_enabledincomezcoup-action-income_action_income_is_income_enabled_is_action_hiddenforeign_aidzcoup-action-foreign-aid_action_foreign_aid_is_action_enabledrl   zcoup-action-coup_action_coup_is_coup_enabledzcoup-select-target_target_options_bot_select_target)promptr    
bot_select)r   r   r   r   r   input_requestr   taxzcoup-action-tax_action_taxassassinatezcoup-action-assassinate_action_assassinate_is_assassinate_enabledstealzcoup-action-steal_action_stealexchangezcoup-action-exchange_action_exchange)	r   r   r   r   addr   r   rV   r   )rW   r   r   r   
action_setis         rY   create_turn_action_setCoupGame.create_turn_action_set  s   }}V$ $$F+
 qANN(,&**63OP4;99).
  qANN%aS)&**63LM1866).
  	"&&v/FG+20%*		
 	"&&v/BC'.,,%*
	
 	""&&v/JK'42%*		
 	%"&&v/MN'42%*		
 	"&&v/AB&-0%*		
 	"&&v/CD(/-%*		
 	 "&&v/HI-/-%*		
 	"&&v/AB&--'/-3
 &+	
" 	"&&v/@A%/-%*		
 	 "&&v/HI-4-'/-3
 &+	
 	"&&v/BC'/-'/-3
 &+	
 	"&&v/EF*/-%*		
 r\   )r   r   r   
whose_turnwhos_at_tablec                 `  > [         TU ]  U5      nUR                  S5      (       a  UR                  S5        UR                  S5      (       a  UR                  S5        U R	                  U5      nU(       a  UR
                  OSnUR                  [        S[        R                  " US5      S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5        U(       a  [        USS5      S:X  ay  / nU R                   H,  nUR                  U5      (       d  M  UR                  U5        M.     UR                   H%  nX`R                  ;  d  M  UR                  U5        M'     XRl        U$ )Ncheck_scorescheck_scores_detailedr   r   r   _action_check_wealth_is_public_info_enabled_is_info_hiddenT)r   r   r   r   r   r   r   r   r   r   _is_private_info_enabled_is_private_info_hiddenr   r   r   _action_check_tableclient_typer+   web)r_   create_standard_action_set
get_actionremover   r   r  r   r   rV   getattrweb_target_orderr   _order)rW   r   r  r   r   final_orderaidra   s          rY   r$  #CoupGame.create_standard_action_set  s   W7?
   00n-  !89956}}V$ $$ 	!"&&v/IJ.4+%)#'
	
 	"&&v/GH,53%)		
 	 "&&v/HI-4+%)#'
	
 GD-4=K,,((--&&s+ - "((333&&s+ ) !,r\   r   c                    > U R                  U5      nU(       a!  [        USS5      S:X  a  [        R                  $ [        TU ]  U5      $ )z5Override: Visible for Web (always), hidden otherwise.r"  r+   r#  )r   r'  r   VISIBLEr_   _is_whos_at_table_hiddenrW   r   r   ra   s      rY   r/  !CoupGame._is_whos_at_table_hidden  s@    }}V$GD-4=%%%w/77r\   c                    > U R                  U5      nU(       aA  [        USS5      S:X  a0  U R                  S:X  a  [        R                  $ [        R
                  $ [        TU ]  U5      $ )z;Override: Visible for Web (Playing only), hidden otherwise.r"  r+   r#  r   )r   r'  r   r   r.  HIDDENr_   _is_whose_turn_hiddenr0  s      rY   r4  CoupGame._is_whose_turn_hidden  sX    }}V$GD-4={{i'!)))$$$w,V44r\   c                     U R                  U5      nU(       a!  [        USS5      S:X  a  [        R                  $ [        R                  $ )Nr"  r+   r#  )r   r'  r   r.  r3  )rW   r   r   s      rY   r  CoupGame._is_info_hidden  s;    }}V$GD-4=%%%   r\   c                 f    UR                   (       a  [        R                  $ U R                  U5      $ r^   )is_spectatorr   r3  r  rW   r   s     rY   r    CoupGame._is_private_info_hidden  s(    $$$##F++r\   c                 &    U R                   S:w  a  gg )Nr   action-not-playing)r   r:  s     rY   r   CoupGame._is_public_info_enabled  s    ;;)#'r\   c                 J    U R                   S:w  a  gUR                  (       a  gg )Nr   r=  zaction-spectator)r   r9  r:  s     rY   r  !CoupGame._is_private_info_enabled  s     ;;)#'%r\   	action_idc                    U R                   S:w  d  UR                  U R                  :w  a  [        R                  $ U(       aO  Un [        UR                  S5      S   5      nUS:  d  U[        UR                  5      :  a  [        R                  $ [        R                  $ ! [         a    [        R                  s $ f = f)Nlosing_influencer   rS   r   )r#   r   r,   r   r3  intrT   
ValueErrorr   live_influencesr.  rW   r   rA  coup_playeridxs        rY   r   "CoupGame._is_lose_influence_hidden"  s    ??00FIIAWAW4W$$$&,K))//#.r23 Qw#[%@%@!AA!(((!!!	  )!((()s   B! !B>=B>c                 .   U R                   (       a  gU R                  S:w  d  UR                  U R                  :w  a  gU(       d  g Un [	        UR                  S5      S   5      nUS:  d  U[        UR                  5      :  a  gg ! [         a     gf = f)Naction-game-in-progressrC  action-not-availabler   rS   r   )	r0   r#   r   r,   rD  rT   rE  r   rF  rG  s        rY   r   #CoupGame._is_lose_influence_enabled/  s     ,??00FIIAWAW4W)"(	*iooc*2./C 7cS!<!<==)  	*)	*s   	B 
BBc                 h   Un [        UR                  S5      S   5      nUS:  d  U[        UR                  5      :  a  gUR                  U   nU R                  U5      nU(       a  UR                  OSn[        R                  " USUR                  R                   35      $ ! [         a     gf = f)Nr   rS   zLose Influencer   r   
coup-card-rD  rT   rE  r   rF  r   r   r   rV   	charactervalue)rW   r   rA  rH  rI  r   r   r   s           rY   r   "CoupGame._get_lose_influence_labelE  s    "(	$iooc*2./C 7cS!<!<==#**3/}}V$ $$*T^^5I5I4J(KLL  	$#	$s   B$ $
B10B1c                     U R                   S:w  d  U R                  U:w  a  [        R                  $ [        R                  $ )N
exchanging)r#   r   r   r3  r.  r:  s     rY   r   CoupGame._is_return_card_hiddenT  s3    ??l*d.A.AV.K$$$!!!r\   c                    U R                   (       a  gU R                  S:w  d  U R                  U:w  a  gU(       d  g Un [        UR	                  S5      S   5      nUS:  d  U[        UR                  5      :  a  gg ! [
         a     gf = f)NrL  rV  rM  r   rS   r   )r0   r#   r   rD  rT   rE  r   rF  rG  s        rY   r    CoupGame._is_return_card_enabledY  s    ,??l*d.A.AV.K)"(	*iooc*2./C 7cS!<!<==)  	*)	*s   A= =
B
	B
c                    Un [        UR                  S5      S   5      nUS:  d  U[        UR                  5      :  a  gUR                  U   nU R                  U5      nU(       a  UR                  OSn[        R                  " USUR                  R                   35      n[        R                  " USUS9$ ! [         a     gf = f)	Nr   rS   zReturn Cardr   r   rP  zcoup-return-card-format)r   rQ  )	rW   r   rA  rH  rI  r   r   r   	card_names	            rY   r   CoupGame._get_return_card_labelm  s    "(	!iooc*2./C 7cS!<!<== **3/}}V$ $$ $$Vz$..:N:N9O-PQ	(A	RR  	! 	!s   B: :
CCc                    U R                   S:w  d"  UR                  (       d  UR                  (       a  [        R                  $ U R
                  S;  a  [        R                  $ UR                  U R                  :X  a  [        R                  $ UR                  [        U S[        5       5      ;   a  [        R                  $ [        R                  $ )Nr   action_declaredwaiting_blockr)   )r   r9  r   r   r3  r#   r   r&   r'  r   r.  r:  s     rY   r   CoupGame._is_interrupt_hidden}  s    ;;)#v':':fnn$$$??"FF$$$ 99...$$$99&6>>$$$ !!!r\   c                    U R                   (       a  gUR                  (       a  gUR                  (       a  gUR                  U R                  :X  a  gU R
                  S:X  a  / SQnU R                  U;   a  gg U R
                  S:X  a  g g	)
NrL  coup-you-are-eliminatedr=  rM  r_  )r   r   rl   zcoup-cannot-challenge-actionr`  zcoup-no-active-claim)r0   r   r9  r   r&   r#   r$   )rW   r   unchallengeables      rY   r   CoupGame._is_challenge_enabled  sq    ,>>,'99...)??//?O!!_45__/%r\   c                 d    U R                   S;  a  [        R                  $ U R                  U5      $ )z~Hide generic block during steal (use block_captain/block_ambassador instead)
and during actions that cannot be blocked at all.r   r  )r$   r   r3  r   r:  s     rY   r   CoupGame._is_block_hidden  s0     %CC$$$((00r\   c                 B   U R                   (       a  gUR                  (       a  gUR                  (       a  gUR                  U R                  :X  a  gU R
                  S:w  a  gU R                  S:X  a  g U R                  S:X  a  UR                  U R                  :w  a  g	g g
)NrL  rc  r=  rM  r_  coup-cannot-block-nowr   r  coup-only-target-can-blockcoup-cannot-block-actionr0   r   r9  r   r&   r#   r$   r%   r:  s     rY   r   CoupGame._is_block_enabled  s    ,>>,'99...)??//*..yyD1113 *r\   c                     U R                   S:w  d  U R                  S:w  a  [        R                  $ U R	                  U5      $ )zGOnly show block_captain/block_ambassador during steal interrupt window.r  r_  )r$   r#   r   r3  r   r:  s     rY   r   CoupGame._is_block_steal_hidden  s9    (DOO?P,P$$$((00r\   c                     U R                   (       a  gUR                  (       a  gUR                  (       a  gUR                  U R                  :X  a  gU R
                  S:w  a  gU R                  S:w  a  gUR                  U R                  :w  a  g	g )
NrL  rc  r=  rM  r_  rj  r  rl  rk  rm  r:  s     rY   r    CoupGame._is_block_steal_enabled  sr    ,>>,'99...)??//*(-99---/r\   c                 0   U R                  U5      nU(       a  UR                  OSnSSS.R                  U R                  =(       d    S5      nU(       a,  [        R                  " XE5      n[        R                  " USUS9$ [        R                  " US5      $ )	z2Dynamic label showing which role the block claims.r   zcoup-card-dukezcoup-card-contessarg  r+   zcoup-action-block-with)roler   )r   r   rV   r$   r   )rW   r   rA  r   r   role_keyrt  s          rY   r   CoupGame._get_block_label  s    }}V$ $$+/
 #d  &B
' 	 ##F5D##F,D4PP(;<<r\   c                     U R                   (       a  gUR                  (       a  gUR                  (       a  gUR                  U R                  :X  d#  UR                  [        U S[        5       5      ;   a  gg )NrL  rc  r=  r)   rM  )r0   r   r9  r   r&   r'  r   r:  s     rY   r   CoupGame._is_pass_enabled  s[    ,>>,'99...&))w"CE@
 3
 *r\   c                    U R                   S:w  d"  UR                  (       d  UR                  (       a  [        R                  $ U R
                  U:w  d  U R                  S:w  a  [        R                  $ [        R                  $ )Nr   r"   )r   r9  r   r   r3  r   r#   r.  r:  s     rY   r   CoupGame._is_action_hidden  sY    ;;)#v':':fnn$$$&(DOOv,E$$$!!!r\   c                 "   U R                   (       a  gU R                  S:w  a  gUR                  (       a  gUR                  (       a  gU R                  U:w  d  U R
                  S:w  a  gUnUR                  U R                  R                  :  a  gg )NrL  r   r=  rc  r"   action-not-your-turnzcoup-must-coup)	r0   r   r   r9  r   r#   r   r    mandatory_coup_thresholdrW   r   rH  s      rY   r  CoupGame._is_action_enabled  sr    ,;;)#'>>,'&(DOOv,E)"( E EE#r\   c                 $    U R                  U5      $ r^   )r  r:  s     rY   r   CoupGame._is_income_enabled  s    &&v..r\   c                     U R                   (       a  gU R                  S:w  a  gUR                  (       a  gUR                  (       a  gU R                  U:w  d  U R
                  S:w  a  gUnUR                  S:  a  gg )	NrL  r   r=  rc  r"   r|     coup-not-enough-coins)r0   r   r   r9  r   r#   r   r~  s      rY   r  CoupGame._is_coup_enabled  sh    ,;;)#'>>,'&(DOOv,E)"(q *r\   c                 ^    U R                  U5      nU(       a  U$ UnUR                  S:  a  gg )Nr
   r  )r  r   )rW   r   errrH  s       rY   r   CoupGame._is_assassinate_enabled"  s3    %%f-J"(q *r\   c           
         U R                  U5      nU(       a  UR                  OSn/ nU R                  5        HD  nXQ:w  d  M
  UR                  [        R
                  " USUR                  UR                  S95        MF     U$ )Nr   coup-wealth-liner   r   )r   r   r   r   r   rV   rX   r   )rW   r   r   r   r    r   s         rY   r  CoupGame._target_options-  sm    }}V$ $$'')A{ $$V-?VWV]V]^ *
 r\   
target_strc                 t    SU;   a#  UR                  SS5      S   R                  5       $ UR                  5       $ )zHHelper to extract the base player name from the formatted option string.:r   r   )rT   strip)rW   r  s     rY   _extract_target_nameCoupGame._extract_target_name8  s<     *##C+A.4466!!r\   c                    U(       d  g U Vs0 s H  o0R                  U5      U_M     nn[        R                  " X[        UR	                  5       5      5      nU(       a	  XT;   a  XE   $ [
        R                  " U5      $ s  snf r^   )r  r   select_best_targetlistkeysr   choice)rW   r   r    opt
option_map	best_names         rY   r  CoupGame._bot_select_target@  sr     FMMWc//4c9W
M..tT*//BS=TU	0((}}W%% Ns   A>c           
         U R                  U5      nU(       d  g / nU R                  5        HG  nUR                  [        R                  " UR
                  SUR                  UR                  S95        MI     U(       d0  UR                  [        R                  " UR
                  S5      5        SR                  U5      nUR                  USS9  g )Nr  r  zcoup-no-alive-players, tablebuffer)
r   r   r   r   rV   r   rX   r   joinspeak)rW   r   rA  r   linesr   combineds          rY   r  CoupGame._action_check_wealthQ  s    }}V$'')ALL  .@WXW^W^_ * LL))$++7NOP99U#

8G
,r\   c                    U R                  U5      nU(       d  g UnUR                  (       a  UR                  SSS9  g / nUR                   HL  n[        R
                  " UR                  SUR                  R                   35      nUR                  U5        MN     U(       d"  [        R
                  " UR                  S5      nOSR                  U5      nUR                  SUR                  USS9  g )	Nrc  r  r  rP  coup-no-cardsr  zcoup-hand-context)r   cardsr  )r   r   speak_lrF  r   rV   r   rR  rS  r   r  r   )	rW   r   rA  r   rH  r  r   r[  	cards_strs	            rY   r   CoupGame._action_check_handc  s    }}V$"(LL27LC//D$((
4>>CWCWBX6YZILL# 0 $((oFI		%(I 	(0A0A[bcr\   c           
      r   U R                  U5      nU(       d  g / nU R                  5        H  nUR                  nU(       d  M  U Vs/ s H;  n[        R                  " UR
                  SUR                  R                   35      PM=     nnSR                  U5      n	UR                  [        R                  " UR
                  SUR                  U	S95        M     U(       d0  UR                  [        R                  " UR
                  S5      5        SR                  U5      n
UR                  U
SS9  g s  snf )	NrP  r  zcoup-table-line)r   r  zcoup-table-emptyz; r  r  )r   r   dead_influencesr   rV   r   rR  rS  r  r   rX   r  )rW   r   rA  r   r  r   deadr   r  r  r  s              rY   r!  CoupGame._action_check_table{  s    }}V$((*A$$Dt]a]aXYL$$T[[Jq{{?P?P>Q2RS]a   !IIe,	 $$T[[2CAFFZcd + LL))$++7IJK99U#

8G
,s   AD4c                     UnU=R                   S-  sl         U R                  S5        U R                  SUR                  S9  U R	                  5         g )Nr   zgame_coup/income.oggcoup-takes-incomer   )r   r   broadcast_lrX   r   )rW   r   rA  rH  s       rY   r   CoupGame._action_income  sG    "(Q./,V[[Ar\   c                 <    U R                  UR                  S5        g )Nr   _declare_actionr   rW   r   rA  s      rY   r   CoupGame._action_foreign_aid  s    VYY6r\   target_namec                    UnU R                  U R                  U5      5      nU(       a  UR                  (       a  g SU l        U R	                  5         U=R
                  S-  sl        U R                  S5        U R                  SUR                  UR                  S9  U R                  S5      nU R                  R                  U R                  U-   SUR                  SS	.45        g )
NTr  zgame_coup/coup.oggzcoup-plays-coupr   targetrG   prompt_lose_influencerl   	target_idreason)r   r  r   r0   r   r   r   r  rX   rZ   r1   r   sound_scheduler_tickr   )rW   r   r  rA  rH  r  durations          rY   r  CoupGame._action_coup  s    "((()B)B;)OP  Q,-*6;;v{{S00<))H4'$ii6:	
r\   c                 <    U R                  UR                  S5        g )Nr	  r  r  s      rY   r
  CoupGame._action_tax  s    VYY.r\   c                     UnU R                  U R                  U5      5      nU(       a  UR                  (       a  g U=R                  S-  sl        U R	                  UR
                  SUR
                  5        g )Nr
   r  )r   r  r   r   r  r   )rW   r   r  rA  rH  r  s         rY   r  CoupGame._action_assassinate  sY    "((()B)B;)OPQVYYvyyAr\   c                     U R                  U R                  U5      5      nU(       a  UR                  (       a  g U R                  UR                  SUR                  5        g )Nr  )r   r  r   r  r   )rW   r   r  rA  r  s        rY   r  CoupGame._action_steal  sC    (()B)B;)OPVYY;r\   c                 <    U R                  UR                  S5        g )Nr  r  r  s      rY   r  CoupGame._action_exchange  s    VYY
3r\   actionr  c                 T   X l         Xl        Xl        X0l        SU l        U R
                  R                  S-  U l        U R                  U l        [        5       U l
        U R                  U5      nU(       a  U R                  U5      OSnU R                  U5      nU(       a-  XR                  ;   a  U R                  U   R                  U5        US:X  a,  U R                  S5        U R!                  SUR"                  S9  OUS:X  a  U R!                  S	UR"                  S9  OUS
:X  a@  U R                  S5        U R!                  SUR"                  U(       a  UR"                  OSS9  OwUS:X  a@  U R                  S5        U R!                  SUR"                  U(       a  UR"                  OSS9  O1US:X  a+  U R                  S5        U R!                  SUR"                  S9  U R!                  S5        U R%                  5         [&        R(                  " U [*        R,                  " SS5      S9  g)zAStarts the interrupt window for a challengeable/blockable action.r_  r9   Nr	  game_coup/claim_duke.oggzcoup-claims-taxr  r   zcoup-claims-foreign-aidr  zgame_coup/claim_assassin.oggzcoup-claims-assassinater+   r  r  game_coup/claim_captain.oggzcoup-claims-stealr  game_coup/claim_ambassador.oggzcoup-claims-exchangecoup-waiting-for-reactions(   P   r   )r$   r&   r'   r%   r#   r    timer_duration_secondsrM   rN   r   r)   get_player_by_id"_get_required_character_for_actionr*   r  r   r  rX   r   r   r   r   r   )rW   r   r  r  r   r  req_chars          rY   r  CoupGame._declare_action  s   #!*#,  )+%)\\%H%H2%M"(,(B(B%!e&&y15>&&y1D::6B	%7%77y)--h7 U?OO67.v{{C}$6v{{K}$OO:;)&++U[fkkac   wOO9:#FKKv[]   z!OO<=3FKKH56 Dr2(>?r\   c                    U R                   S;  a  g U R                  S::  a  g SU l        SU l        U R                  5         U R	                  S5        U R                  U R                  5      nU R                  SUR                  UR                  S9  U R                  S5      nU R                  R                  U R                  U-   SS	UR                  045        g )
Nr^  r   Tzgame_coup/challenge.oggzcoup-challenges)
challengerr  r:   resolve_challengechallenger_id)r#   rM   r0   r   r   r  r&   r  rX   rZ   r1   r   r  r   )rW   r   rA  claimerr  s        rY   r   CoupGame._action_challenge  s    ??"FF %%*%&"  12''(>(>?*v{{7<<X00A))H4# &)),	
r\   c                    U R                   S:w  a  g U R                  S::  a  g SU l        U R                  U R                  5      nU(       d  g U R                  S:X  az  U R                  S5        U R                  SUR                  UR                  S9  UR                  U R                  ;   a(  U R                  UR                     R                  S5        GObU R                  S:X  ay  U R                  S	5        U R                  S
UR                  UR                  S9  UR                  U R                  ;   a(  U R                  UR                     R                  S5        OU R                  S:X  a  US:X  a9  SnU R                  S5        U R                  SUR                  UR                  S9  O@US:X  a9  SnU R                  S5        U R                  SUR                  UR                  S9  Og UR                  U R                  ;   a(  U R                  UR                     R                  U5        X@l        Og SU l         UR                  U l        U R                  R                  S-  U l        U R                  U l        [        5       U l        U R                  S5        U R#                  5         [$        R&                  " U [(        R*                  " SS5      S9  g )Nr_  r   r   r  zcoup-blocks-foreign-aid)blockerr  duker  zgame_coup/claim_contessa.oggzcoup-blocks-assassinatecontessar  r   captainr  zcoup-blocks-steal-captainr   
ambassadorr  zcoup-blocks-steal-ambassadorr`  r9   r  r  r  r   )r#   rM   r  r&   r$   r   r  rX   r   r*   r  r/   r    r  rN   r   r)   r   r   r   r   r   )rW   r   rA  r  claimed_roles        rY   r   CoupGame._action_block  sf   ??// %%*%&"''(>(>? .OO676T[T`T`ayyD...""699-11&9=0OO:;6T[T`T`ayyD...""699-11*=7*O+( =>  /W\\ !  00+ @A  2FKKPWP\P\ !  yyD...""699-11,?-9* *!'%)\\%H%H2%M"(,(B(B%!e56 Dr2(>?r\   c                    U R                   S;  a  g U R                  R                  UR                  5        U R	                  U5      nU(       a!  UR
                  (       d  UR                  SSS9  U R                  5       nSnU H$  nUR                  U R                  :w  d  M  US-  nM&     [        U R                  5      U:  a  SU l
        U R                  5         g )Nr^  zcoup-action-pass-confirmedr  r  r   r   )r#   r)   r  r   r   r   r  r   r&   r   rM   r   )rW   r   rA  r   r   eligible_countr   s          rY   r   CoupGame._action_passO  s    ??"FF		*}}V$LL5gLF &&(Attt---!#  t""#~5)*D& 	 r\   c                 4    SSSSS.nUR                  US5      $ )Nr  assassinr  r  )r	  r  r  r  r+   rV   rW   r  mappings      rY   r  +CoupGame._get_required_character_for_actiong  s(    %$	
 {{62&&r\   c                 6    SSSS/S.nUR                  US5      $ )Nr  r  r  r  )r   r  r  r+   r  r  s      rY   !_get_required_character_for_block*CoupGame._get_required_character_for_blockp  s*    !%.

 {{62&&r\   c                     U R                   (       d  g[        U R                   5      n/ U l         U R                  nU H;  u  p4nX2::  a  U R                  XE5        M  U R                   R	                  X4U45        M=     g)zProcess queued game events.N)r1   r  r  _handle_eventr   )rW   current_queuecurrent_ticktick
event_typedatas         rY   _process_eventsCoupGame._process_eventsx  sm    T--.00&3"Dd#"":4  ''4(@A	 '4r\   r  r  c                    US:X  an  U R                  UR                  S5      5      nU(       a/  U=R                  S-  sl        U R                  SUR                  S9  SU l        U R                  5         g US:X  a8  SU l        U R                  UR                  S5      UR                  S	5      5        g US
:X  a  U R                  R                  S-  U l
        U R                  U l        SU l        U R                  S5        U R                  5         [        R                  " U [        R                   " SS5      S9  g US:X  a  SU l        UR                  S5      U l        U R                  R                  S-  U l
        U R                  U l        ['        5       U l        SU l        U R                  S5        U R                  5         [        R                  " U [        R                   " SS5      S9  g US:X  a!  U R+                  UR                  S5      5        g US:X  a8  SU l        U R                  UR                  S5      UR                  S	5      5        g US:X  a  U R-                  5         g US:X  a  SU l        U R                  5         g US:X  a  SU l        U R                  5         g US:X  a  SU l        U R/                  5         g g )Nresolve_incomer   r   r  r  Fr  r  r  start_interrupt_windowr9   r  r  r  r   start_waiting_blockr`  
blocker_idr  r  post_challenge_lose_influencepost_challenge_resolve_actionpost_challenge_end_turnpost_block_successpost_lose_influence)r  rV   r   r  rX   r0   r   _prompt_lose_influencer    r  rM   rN   r   r   r   r   r   r#   r&   r   r)   _execute_challenge_resolve_action_post_lose_influence)rW   r  r  r   s       rY   r  CoupGame._handle_event  sL   ))**488K+@AF!  !4V[[ I %DNN22 %D''(=txx?QR33)-)L)Lr)QD&,0,F,FD) %D9:""$FNN2r,BC00-DO%)XXl%;D")-)L)Lr)QD&,0,F,FD)"%%D %D9:""$FNN2r,BC..##DHH_$=>:: %D''(=txx?QR::  "44 %DNN// %DNN00 %D%%' 1r\   r  c                    U R                  U5      nU R                  U R                  5      nU(       a  U(       d  SU l        g U R                  U R                  5      nU R
                  S:X  aI  U R                  S:X  a  U R                  (       a  U R                  nOU R                  U R                  5      nSnS n[        U[        5      (       a&  U H  nUR                  U5      (       d  M  SnUn  O   OUR                  U5      (       a  SnUnU(       Ga  U R                  S5        U R                  S5      nU R                  SXcR                  S9  UR                   GH  n	U	R                   U:X  d  M  U R"                  R%                  U	5        U R"                  R'                  5         U R                  S	[(        R*                  " S
S5       S35        UR,                  R/                  U	5        U R"                  R1                  5       n
UR,                  R3                  U
5        U R                  S[(        R*                  " S
S5       S35        UR4                  U R6                  ;   a'  U R6                  UR4                     R9                  5         U
(       ar  UR:                  (       da  U R=                  U5      nU(       aI  [>        R@                  " URB                  SU
R                   RD                   35      nURG                  SUSS9    O   U R
                  S:X  a  SU l$        O;SU l$        U RK                  SUR                  S9  U RK                  SUR                  S9  U RL                  R3                  U RN                  U-   SUR4                  SS.45        g U R                  S5        U R                  S5      nU RK                  SUR                  S9  U R
                  S:X  a  SU l$        OU R
                  S:X  a  SU l$        U RK                  S UR                  S9  U RL                  R3                  U RN                  U-   SUR4                  S!S.45        g )"NFr`  r  Tzgame_coup/challengesuccess.oggr>   zcoup-challenge-failedr  game_cards/discardr   r
   r   game_cards/drawr   rP  zcoup-drew-replacement-cardr  )rR  r  r_  resolve_actionr-   zcoup-bluff-wrong)r  coup-block-successfulr  r  failed_challenger  zgame_coup/challengefail.oggr<   zcoup-challenge-succeededzcoup-bluff-calledlost_challenge)(r  r&   r0   r  r$   r#   r/   r  r   r  has_influencer   rZ   _broadcast_card_messagerX   rF  rR  r!   r  r   r   r   r   r&  r   r   r   r*   r   r   r   r   rV   r   rS  r  r.   r  r1   r  )rW   r  r   r  required_charhas_characterrevealed_charrcr  r   new_cardr   new_card_names                rY   r  CoupGame._execute_challenge  s   &&}5''(>(>?W %D??@R@RS??o-!!W,1O1O $ > > $ F FtGYGY ZmT**#((,,$(M$&M	 $ $$]33 $ -OO<=445KLH(('|| ) 
  //>>]2IIMM$'II%%'OO&819M8Nd$ST&&--d3#yy~~/H&&--h7OOofnnQ6J5K4$PQzzT%7%77**7::6<<>#}}W5,8,<,< $z(:L:L:R:R9S-T-M !LL <*7'. ) 
 - 00 "33/?,/9,  !3 L  !8',, O ##--83"())7IJ OO9:445HIH7M"33/9,O3/?,0F##--83")**8HIr\   c                   > [         TU ]  5         U R                  5         U R                  (       d  g U R	                  5         U R
                  S:  Ga{  U R                  (       Gdi  U =R
                  S-  sl        U R
                  S:X  GaC  U R                  S:X  a  U R                  5         GO!U R                  S:X  Ga  SU l        U R                  5         U R                  U R                  5      nU R                  SU(       a  UR                  OSS9  S	nU R                  S
:X  a  SnU R                  SU 35        OMU R                  S:X  a  SnU R                  SU 35        O&U R                  S:X  a  SnU R                  SU 35        U(       a  U R!                  U5      OSnU R"                  R%                  U R&                  U-   S0 45        [(        R                  " U 5        g )Nr   r   r_  r`  Tr  Someoner  r+   r   r6   
game_coup/r  r4   r  r8   r  )r_   on_tickprocess_scheduled_soundsr   r  rM   r0   r#   r	  r   r  r&   r  rX   r$   r   rZ   r1   r   r  r   )rW   r  
sound_filer  ra   s       rY   r   CoupGame.on_tick!  s   %%'%%)$2C2C2C&&!+&))Q.??&77((*__7(,D%**,"33D4J4JKG$$/V_ %  "$J))]:%5
*ZL(AB++}<%9
*ZL(AB++w6%9
*ZL(ABLVt<<ZH\]H$$++22X=?SUWX 	r\   c                 l   U R                  S5        U R                  U R                  5      nU R                  U R                  5      nU(       d  U R	                  5         gU R
                  S:X  aQ  U=R                  S-  sl        U R                  S5        U R                  SUR                  S9  U R	                  5         gU R
                  S:X  aQ  U=R                  S	-  sl        U R                  S
5        U R                  SUR                  S9  U R	                  5         gU R
                  S:X  a  SU l	        U R                  5         SnU R                  SU 35        U R                  SUR                  U(       a  UR                  OSS9  U R                  U5      nU R                  R                  U R                  U-   SU(       a  UR                  OSSS.45        gU R
                  S:X  a  U(       a  [!        SUR                  5      OSnU(       a  U=R                  U-  sl        U=R                  U-  sl        U R                  S5        U R                  SUR                  U(       a  UR                  OSUS9  U R	                  5         gU R
                  S:X  Ga  U R                  S5        U R                  SUR                  S9  U R"                  R%                  5       nU R"                  R%                  5       nU(       aE  UR&                  R                  U5        U R                  S[(        R*                  " SS 5       S!35        U(       aE  UR&                  R                  U5        U R                  S[(        R*                  " SS 5       S!35        UR                  U R,                  ;   a'  U R,                  UR                     R/                  5         S"U l        SU l        U R                  5         UR4                  (       a+  [6        R8                  " U[(        R*                  " S#S$5      S%9  ggg)&zIResolves the active action after no challenges/blocks occur or they fail.zcoup-action-resolvesNr   r   zgame_coup/foreign_aid.oggzcoup-takes-foreign-aidr  r	  r
   zgame_coup/tax.oggzcoup-takes-taxr  Tr2   r  zcoup-assassinatesr+   r  r  assassinatedr  r  r   zgame_coup/steal.oggzcoup-steals)r   r  amountr  zgame_coup/exchange_start.oggzcoup-exchangesr  r   r   r   rV  rB   r9   r   )r  r  r'   r%   r   r$   r   r   rX   r0   r   rZ   r1   r   r  r   minr!   r   r   r   r   r*   r   r#   rM   r   r   r   )rW   r   r  r"  r  stolencard1card2s           rY   r	  CoupGame._resolve_actionK  sP   /0&&t'?'?@&&t'<'<=NN.LLALOO785fkkJNN5(LLALOO/0-fkkBNN=0 $D""$*JOOj56#FKKv[]   44Z@H##--8+/5&))2X 7*-3SFLL)F&LLF"LOO12{{&,v{{"	   NN:-OO:;-fkkB IINN$EIINN$E!!((//&..A2F1Gt LM!!((//&..A2F1Gt LMyyD...""699-335*DO)*D&""$}}""6B1GH + .r\   c                    U R                   S:w  d  U R                  U:w  a  g Un [        UR                  S5      S   5      nUS:  d  U[        UR                  5      :  a  g UR                  U   nU R                  R                  U5        U R                  R                  5         UR                  R                  U5        U R                  S[        R                  " SS5       S35        U R                  U5      nU(       aI  [         R"                  " UR$                  S	UR&                  R(                   35      nUR+                  S
SUS9  [-        U SS5      S:X  a  SU l        U R1                  5         g SU l        U R                  S5        U R3                  SUR4                  S9  U R7                  5         g ! [         a     g f = f)NrV  r   rS   r   r  r   r
   r   rP  zcoup-returned-cardr  r  rR  r(   zgame_coup/exchange_complete.oggzcoup-exchange-completer  )r#   r   rD  rT   rE  r   rF  r!   r  r   r   r&  r   r   r   r   r   rV   r   rR  rS  r  r'  r(   r   r  rX   r   )rW   r   rA  rH  rI  r   r   r[  s           rY   r   CoupGame._action_return_card  s   ??l*d.A.AV.K"(	iooc*2./C 7cS!<!<==**3/		d		%%d+,V^^Aq-A,B$GH}}V$$((
4>>CWCWBX6YZILL-gLS 4+q0 !D""$ !DOO=>5fkkJNNG  		s   F8 8
GGmessage_keyrR  c                    [        US5      (       a  UR                  OUnU R                   HW  nU R                  U5      nU(       d  M  [        R
                  " UR                  SU 35      nUR                  " U4SUS.UD6  MY     g)z>Broadcast a message with a localized card name to all players.rS  rP  r  r-  N)r   rS  r   r   r   rV   r   r  )rW   r/  rR  kwargschar_valr   r   r[  s           rY   r   CoupGame._broadcast_card_message  sr     '.i&A&A9??yA==#D$((
8*6MNILLTW	TVT r\   r  c                    U R                  U5      nU(       a  UR                  (       a  U R                  5         gUR                  n[	        U5      S:X  a  U R                  5         g[	        U5      S:X  a  UR
                  U l        U R                  S[        R                  " SS5       S35        U R                  S[        R                  " SS5       S35        UR                  S5        U R                  S	US   R                  UR                  S
9  UR                  (       a  U R                  SUR                  S
9  U R                  5         gUR
                  U l        SU l        U R!                  5         UR"                  (       a+  [$        R&                  " U[        R                  " SS5      S9  gU R)                  U5      nU(       a  UR+                  SSS9  gg)z3Prompts a player to choose which influence to lose.Nr   r   zgame_coup/chardestroyr   r   r  r
   coup-loses-influencer  coup-player-eliminatedrC  rB   r9   r   zcoup-must-lose-influencer  r  )r  r   r
  rF  r   r   r,   r   r   r   reveal_influencer  rR  rX   r  r#   r   r   r   r   r   r  )rW   r   r  r   liver   s         rY   r  CoupGame._prompt_lose_influence  sw   &&y1%%'%%t9>%%'Y!^%+YYD"OO3FNN1a4H3INOOO011E0FdKL##A&((&Q(9(9&++ )  ~~  !9&++ N%%' &,YYD"0DO""$}}""6B1GH}}V,LL!;GLL r\   c                 0   U R                   S:w  d  UR                  U R                  :w  a  g Un [        UR	                  S5      S   5      nUS:  d  U[        UR                  5      :  a  g SU l        U R                  5         S[        R                  " SS5       S	3nU R                  S
U 35        U R                  S[        R                  " SS5       S	35        UR                  U   R                  nUR                  U5        U R                  SXaR                   S9  UR"                  (       a  U R%                  SUR                   S9  U R'                  U5      nU R(                  R+                  U R,                  U-   S0 45        g ! [
         a     g f = f)NrC  r   rS   r   Tchardestroyr   r   r   r  r  r
   r5  r  r6  r  )r#   r   r,   rD  rT   rE  r   rF  r0   r   r   r   r   rR  r7  r  rX   r   r  rZ   r1   r   r  )rW   r   rA  rH  rI  r"  charr  s           rY   r   CoupGame._action_lose_influence  so   ??00FIIAWAW4W"(	iooc*2./C 7cS!<!<==  "6>>!Q#7"8=
*ZL12,V^^Aq-A,B$GH**3/99$$S)$$%;T++$V5fkkJ00<!:!:X!EG\^` ab)  		s   F 
FFc                 8   U R                   (       aA  U R                   U R                  ;   a'  U R                  U R                      R                  5         SU l         U R                  nSU l        US:X  a  U R	                  5         g US:X  a  U R                  5         g g )Nr+   r-   r  )r,   r*   r   r.   r   r	  )rW   next_actions     rY   r
  CoupGame._post_lose_influence  s    !!d&<&<@R@R&Rt556<<>!#22'1$*$NN,,  " -r\   winnerc                     U R                  S5        U(       a  U R                  SUR                  S9  U R                  5         g)zEnd the game.zgame_chaosbear/wingame.oggzgame-winnerr  N)r   r  rX   finish_game)rW   rA  s     rY   r   CoupGame._end_game   s5    45]6;;?r\   c                    U R                  5       nU(       a  US   OSnU R                  5       n[        US SS9n/ nU H  nUR                   Vs/ s H  owR                  R
                  PM     nnUR                  (       d?  UR                  UR                   Vs/ s H  owR                  R
                  PM     sn5        UR                  UR                  UR                  XU:H  S.5        M     [        U R                  5       [        R                  " 5       R!                  5       U R"                  U Vs/ s HD  n[%        UR&                  UR                  UR(                  =(       a    UR*                  (       + S9PMF     snU(       a  UR                  OSU(       a  UR&                  /OSSUS	.S
9$ s  snf s  snf s  snf )z.Build the game result with Coup-specific data.r   Nc                 <    U R                   (       + U R                  4$ r^   )r   r   )r   s    rY   <lambda>,CoupGame.build_game_result.<locals>.<lambda>/  s    qyy=!''*Br\   T)keyreverse)rX   r   r  	is_winner)r   player_namer   r   )winner_name
winner_idswinner_scorerankings)	game_type	timestampduration_ticksplayer_resultscustom_data)r   r   sortedr  rR  rS  r   extendrF  r   rX   r   r   rm   r   now	isoformatr  r   r   r   replaced_human)	rW   r   rA  r   sorted_playersrP  r   r   
dead_cardss	            rY   build_game_resultCoupGame.build_game_result'  s   &&("q002 BD
 A565F5FG5F++++5FJG99!!010A0AB0A1[[&&0AB OO!''JZ`U`a   mmolln..044 ( (A dd !88<A,<,<(<
 ( /5v{{$-3vyyk !$	
 	
 H Cs   F3F8
6AF=resultr   c                 R   [         R                  " US5      /nUR                  R                  S/ 5      n[        US5       H  u  pVUS   nUS   nUS   n	U	 V
s/ s H  n
[         R                  " USU
 35      PM     nn
U(       a  SR	                  U5      O[         R                  " US	5      nUR                  S
5      (       a  [         R                  " US5      nO[         R                  " US5      n[         R                  " USUUUUUS9nUR                  U5        M     U$ s  sn
f )zFormat the end screen for Coup.zgame-final-scoresrP  r   rX   r   r  rP  r  r  rK  zcoup-end-winnerzcoup-end-eliminatedzcoup-end-line)rankrX   r   r   r  )r   rV   rU  	enumerater  r   )rW   r_  r   r  rP  r  r  rX   r   r  r   	loc_cardsr  r   lines                  rY   format_end_screenCoupGame.format_end_screenR  s    !!&*=>?%%))*b9 1-GA<DMEMEMRSU))&Jqc2BCUIS(1		)$|7G7GP_7`  xx$$%))&2CD%))&2GH##D LL1 .4 + Ts   $D$c                     U R                    Vs/ s H-  n[        USS5      (       a  M  [        USS5      (       a  M+  UPM/     sn$ s  snf )zGet all alive players.r9  Fr   )r   r'  )rW   r   s     rY   r   CoupGame.get_alive_playerss  sK     \\
!1ne4 =DQ	SX=Y !
 	
 
s   AAA)r,   r.   r/   r$   r&   r%   r!   r1   r   rN   rM   r0   r'   r)   r(   r   r   r#   )F)rP   Nr^   )v__name__
__module____qualname____firstlineno____doc__r   r  r   r   __annotations__r   r    r   r!   r#   strr$   r%   r&   r'   r(   rD  r   r)   dictr*   r,   r.   r/   r0   boolr1   tuplerU   rM   rN   rZ   r`   classmethodrh   rm   rp   rs   rx   r~   r   r   r   r   r   r   r  r(  r   r$  r   r/  r4  r  r   r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r  r  r  r   r!  r   r   r  r
  r  r  r  r  r   r   r   r  r  r  r  r  r   r	  r   r   r  r  r   r
  r   r   r]  re  r   __static_attributes____classcell__)ra   s   @rY   r   r   "   s    !&d ;GT*; =G[= t,D$,  
 !%M3:$#'cDj'$(sTz(&*t*L#$S9NCH9).t)DM4SX&Ds#-S-,0sTz0 L$/4T/JKeCdN+,J2b 	" 	b	
 	 	R 	 	B 	B 	 	b 	R 	b 	" 	B  	 !" 	c#$ +2 "#3"$%c%7 7 7
        $S $ $       249 2 2Bs B# Bt BPZ B*X !D
-
^qZ qI qf d; ;I ;B8x 8J 85H 5 5!f ! !,f , ,
f t 
v #* " "3: "Yc " 7;),t	t,M M3 M3 M"V "
 "
f t WZ]aWa (SV S S S "6 "j ""&F &sTz &*1v 1* 1* *3: *01V 1
 1f t "=v =# =# =v #* " ": " C$J $/ /C$J /v #* $	f 	t 		f 	c 	"s "s "& &$s) &d
 &"-6 -c -d -$d dC dD d0-& -S -T -0V   7& 7S 7T 7
6 
 
 
PT 
./& /S /T /B& Bs Bs BW[ B<F < < <QU <4v 4# 4$ 4*@ *@c *@cDj *@\` *@X
 
3 
4 
67@F 7@s 7@t 7@r!6 !c !d !0' ' '' 'd3i 'B4( 4(4 4(D 4(lb b bH(TMI^*& *S *T *X
U
U+.?
U	
U"M "MS "MT "MHcV c c c:#
T 1 d )
: )
V
 C DI B
4
#3 
 
r\   r   )#rm  dataclassesr   r   r   r   baser   r   registryr	   game_utils.actionsr   r   r   r   game_utils.bot_helperr   game_utils.game_resultr   r   messages.localizationr   server.core.ui.keybindsr   r  r   r   r   r   r   r   botr   r   re   r\   rY   <module>r     s_     )    $ J J . > 1 0 ( ( +  U
t U
  U
r\   