
    Ii                        S SK JrJr  S SKJr  S SKrS SKJr  S SKJ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J r J!r!J"r"  SSK#J$r$  SSK%J&r&J'r'  Sr(Sr)Sr*Sr+Sr,Sr-Sr.Sr/Sr0\(S\)S\*S\+S\,S\-S\.S\/S\0S0	r1\(\)\*\+\,\-\.\/\0/	r2\(S\)S\*S\+S\,S \-S!\.S"\/S#\0S$0	r3\ S%\S&\!S'\"S(0r4\\ " S) S*\
5      5       5       r5g)+    )	dataclassfield)datetimeN)Optional)DataClassJSONMixin   )GamePlayer)register_game   )Action	ActionSet	MenuInput
Visibility)	BotHelper)
GameResultPlayerResult)Localization)KeybindState)CardDeck
SUIT_CLUBSSUIT_DIAMONDSSUIT_HEARTSSUIT_SPADES   
NinePlayer)	NineStateSequenceState         	   
               zrank-sixz
rank-sevenz
rank-eightz	rank-ninezrank-tenz	rank-jackz
rank-queenz	rank-kingzrank-acezsuit-diamondsz
suit-clubszsuit-heartszsuit-spadesc                     ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9r\
\	S'   \" \S9r\\	S'   \" \S9r\\   \	S'   Sr\\	S	'   S
r\\   \	S'   U 4S jrSQU 4S jjr\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rSRS\S\S\S\4S jjrS\4S jrS\S\4S jr SSS\S\S\4S jjr!SSS\S\S\4S jjr"SSS\S\S\4S  jjr#S!\$S"\S\4S# jr%S$\\   S\\   4S% jr&S!\S\S
-  4S& jr' STS'\S(\S
-  SS
4S) jjr(S\\   4U 4S* jjr)SQS+ jr*SQS, jr+S\\   4S- jr,SQS. jr-S!\SS
4S/ jr.SQS0 jr/S\\   4S1 jr0S2\SS
4S3 jr1S\24S4 jr3S5\2S\S\\   4S6 jr4S!\S\54S7 jr6S!\S\54U 4S8 jjr7SQU 4S9 jjr8S!\SS
4S: jr9S!\$S"\S\4S; jr:S!\SS
4S< jr;SQS= jr<S!\$S\S
-  4S> jr=S!\$S\>4S? jr?S!\$S\S
-  4S@ jr@S!\$S\>4SA jrAS!\S\4SB jrBS!\$S"\SS
4SC jrCS!\$S"\S\4SD jrDS!\$S\S
-  4SE jrES!\$S\>4SF jrFS!\$S"\SS
4SG jrGS!\$S"\SS
4SH jrHS!\$S"\SS
4SI jrI SRS!\S\SJ\S\J\\4   4SK jjrKS!\SL\S\SS
4SM jrLSQU 4SN jjrMS!\S\S
-  4SO jrNSPrOU =rP$ )UNineGameX   znine-description)default_factoryplayers
nine_statedeckdiscard_pileFgame_activeNfirst_turn_player_idc                 "   > [         TU ]  5         g)zInitialize runtime state.N)super__post_init__self	__class__s    5c:\Users\dbart\PlayPalace11\server\games\nine\game.pyr6   NineGame.__post_init__i   s        returnc                 "   > [         TU ]  5         g)z3Rebuild non-serialized state after deserialization.N)r5   rebuild_runtime_stater7   s    r:   r?   NineGame.rebuild_runtime_statem   s    %'r<   c                     g)NNine clss    r:   get_nameNineGame.get_nameq       r<   c                     g)NninerC   rD   s    r:   get_typeNineGame.get_typeu   rH   r<   c                     g)Nzcategory-card-gamesrC   rD   s    r:   get_categoryNineGame.get_categoryy   s    $r<   c                     gNr   rC   rD   s    r:   get_min_playersNineGame.get_min_players}       r<   c                     g)Nr!   rC   rD   s    r:   get_max_playersNineGame.get_max_players   rT   r<   	player_idnameis_botc                     [        XUS9$ )zCreate a new player.)idrY   rZ   r   )r8   rX   rY   rZ   s       r:   create_playerNineGame.create_player   s    Y&AAr<   c                     / nSn[         [        [        [        4 H0  n[         H#  n[        X$US9nUR                  U5        US-  nM%     M2     [        US9$ )z3
Create a 36-card deck for Nine (6s through Aces).
r   )r\   ranksuitr   cards)r   r   r   r   NINE_RANKS_IN_ORDERr   appendr   )r8   rc   card_id_counterra   r`   cards         r:   _build_nine_deckNineGame._build_nine_deck   s[     [ID+ET"1$ , J
 %  r<   rg   c                 B    [         R                  UR                  S5      $ )zFGet the internal value of a card for Nine game logic (Ace is highest).r   )NINE_RANK_ORDERgetr`   )r8   rg   s     r:   _get_card_nine_valueNineGame._get_card_nine_value   s    ""499a00r<   r`   localec                 |    [         R                  U5      nU(       a  [        R                  " X#5      $ [        U5      $ )z4Get localized name for a card rank specific to Nine.)NINE_RANK_KEYSrl   r   str)r8   r`   ro   keys       r:   _get_localized_rank_name!NineGame._get_localized_rank_name   s0      &##F004yr<   ra   c                 |    [         R                  U5      nU(       a  [        R                  " X#5      $ [        U5      $ )z#Get localized name for a card suit.)	SUIT_KEYSrl   r   rr   )r8   ra   ro   rs   s       r:   _get_localized_suit_name!NineGame._get_localized_suit_name   s.    mmD!##F004yr<   c                     U R                  UR                  U5      nU R                  UR                  U5      n[        R
                  " USX4S9$ )z5Get localized full card name (e.g., 'Nine of Clubs').z	card-name)r`   ra   )rt   r`   rx   ra   r   rl   )r8   rg   ro   	rank_name	suit_names        r:   _get_localized_card_name!NineGame._get_localized_card_name   sC    11$))VD	11$))VD	)TTr<   player	action_idc                 |    U R                  U5      nU(       a  UR                  OSn[        R                  " US5      $ )z5Get localized label for the 'Check Sequences' action.ennine-action-check-sequencesget_userro   r   rl   r8   r   r   userro   s        r:   $_get_localized_check_sequences_label-NineGame._get_localized_check_sequences_label   s1    }}V$ $$(EFFr<   handc                     ^  [        UU 4S jS9$ )zLSorts a player's hand according to Nine's rules (rank ascending, then suit).c                 >   > TR                  U 5      U R                  4$ N)rm   ra   )rg   r8   s    r:   <lambda>,NineGame._sort_player_hand.<locals>.<lambda>   s    d.G.G.Mtyy-Yr<   rs   )sorted)r8   r   s   ` r:   _sort_player_handNineGame._sort_player_hand   s     d YZZr<   c                 v    U R                   R                  5       (       a  gU R                   R                  5       $ )zDraw a card for a player.N)r0   is_emptydraw_oner8   r   s     r:   
_draw_cardNineGame._draw_card   s-    99 yy!!##r<   message_keysending_playerc                    U R                    H  nU R                  U5      nU(       d  M  UR                  nSU 3nU(       a&  XB:X  a!  SU 3n[        R                  " XhSS9(       a  Un[        U5      n	SU	;   a0  [        U	S   [        5      (       a  U R                  U	S   U5      U	S'   SU	;   a0  [        U	S   [        5      (       a  U R                  U	S   U5      U	S'   UR                  " U40 U	D6  M     g)zBroadcasts a localized message to all players, personalizing 'you' vs 'player',
with fallback for 'you' messages to 'player' messages if 'you' version is not defined.znine-player-z	nine-you-T)silentrg   ra   N)r.   r   ro   r   rl   dict
isinstancer   r}   intrx   speak_l)
r8   r   r   kwargspr   target_localefinal_message_keyyou_version_key
msg_kwargss
             r:   _broadcast_nine_message NineGame._broadcast_nine_message   s    
 A==#D KKM".{m <!"5$-k]";##M4P(7% fJ #
:f3Et(L(L%)%B%Bv&&
6"
 #
:f3Es(K(K%)%B%Bv&&
6" LL*9j9= r<   c                    > [         TU ]  5       n[        U R                  5       5      nUS:X  a&  UR	                  [
        R                  " SS5      5        U$ )z,Validate game configuration before starting.   r   znine-error-invalid-player-count)r5   prestart_validatelenget_active_playersre   r   rl   )r8   errorsnum_playersr9   s      r:   r   NineGame.prestart_validate   sJ    *,$1134!MM,**41RSTr<   c                    SU l         SU l        [        5       U l        U R	                  5       nU R                  U5        U R                  5       U l        U R                  R                  5         / U l	        U R                  5         U R                  5       U l        U R                  (       a`  SnU R	                  5        H!  nUR                  U R                  :X  d  M  Un  O   U(       a!  X l        U R                  SUR                   US9  O"U R#                  S5        U R%                  5         gU R'                  [(        R*                  " / SQ5      5        U R-                  5         g)zCalled when the game starts.playingTNzstart-player-announcement)r   r   z:Error: Nine of Clubs not found in any hand. Aborting game.)zgame_cards/shuffle1.oggzgame_cards/shuffle2.oggzgame_cards/shuffle3.ogg)statusr2   r   r/   r   set_turn_playersrh   r0   shuffler1   _deal_initial_hands_find_nine_of_clubs_playerr3   r\   current_playerr   rY   	broadcastfinish_game
play_soundrandomchoice_start_turn)r8   active_playersfirst_player_objr   s       r:   on_startNineGame.on_start   s5   #+ 002n- ))+			 	  "$($C$C$E!$$  $,,.444444'($ /
  &6#,,/+00#3 -  NNWXMMa	
 	r<   c                    U R                  5       n[        U5      nSnUS:X  a  SnOUS:X  a  SnOUS:X  a  SnO
US:X  a  SnOg	U R                  S
US9  U Hq  n/ Ul        [	        U5       H8  nU R                  U5      nU(       d  M  UR                  R                  U5        M:     U R                  UR                  5      Ul        Ms     U R                  [        R                  " / SQ5      5        g	)z8Deal initial hands to all players based on player count.r   r      r   r'      r$   r!   Nz	nine-dealrb   )zgame_cards/draw1.oggzgame_cards/draw2.oggzgame_cards/draw3.oggzgame_cards/draw4.ogg)r   r   r   r   ranger   re   r   r   r   r   )r8   r   r   cards_to_deal_per_playerr   _rg   s          r:   r   NineGame._deal_initial_hands)  s    002.)#$ !')$A')$A'($A'($ $$[8P$Q$FFK34v.4KK&&t, 5
 00=FK % 	MM		
r<   c                     U R                  5        HP  nUR                   H=  nUR                  [        :X  d  M  UR                  [
        :X  d  M/  UR                  s  s  $    MR     g)z*Find the player who has the Nine of Clubs.N)r   r   r`   	RANK_NINEra   r   r\   r8   r   rg   s      r:   r   #NineGame._find_nine_of_clubs_playerP  sI    --/F99	)dii:.E!99$ $ 0 r<   c                 |   U R                   nU(       a  [        U[        5      (       d  gU R                  5         U R	                  U5      (       d  U R                  U5        gUR                  (       a*  [        R                  " U[        R                  " SS5      S9  U R                  5         U R                  5         g)zStart a player's turn.N   2   ticks)r   r   r   announce_turn_has_valid_move_auto_skip_current_player_turnrZ   r   jolt_botr   randint_update_all_turn_actionsrebuild_all_menusr   s     r:   r   NineGame._start_turnX  s    $$Z
;; ##F++//7 ==vV^^B-CD%%' r<   c                 X    U R                  SXR                  S9  U R                  5         g)z=Execute the logic for automatically skipping a player's turn.z
skips-turnr   r   N)r   rY   	_end_turnr   s     r:   r   'NineGame._auto_skip_current_player_turnl  s%    $$\&Q\Q\$]r<   c                     U R                  5       nU(       a  U R                  U5        g[        R                  " U [        R
                  " SS5      S9  U R                  SS9  U R                  5         g)zEnd current player's turn.N      r   F)announce)_check_game_winner	_end_gamer   	jolt_botsr   r   advance_turnr   )r8   winning_player_ids     r:   r   NineGame._end_turnr  s`     !335NN,- 	Dr2(>?5)r<   c                 p    U R                  5        H"  nUR                  (       a  M  UR                  s  $    g)z2Check if any player has won the game (empty hand).N)r   r   r\   r   s     r:   r   NineGame._check_game_winner  s-    --/F;;;yy  0 r<   	winner_idc                     SnU R                  5        H  nUR                  U:X  d  M  Un  O   U(       a+  U R                  SX"R                  S9  U R                  S5        U R	                  5         g)zEnd the game with a winner.Nz	wins-gamer   z
game-ended)r   r\   r   rY   r   )r8   r   
winner_objr   s       r:   r   NineGame._end_game  sk    
((*Atty 
 +
 ((J )  ((6r<   c                 ,   / nU R                  5        HU  nUR                  UR                  UR                  [	        UR
                  5      UR                  [        USS5      45        MW     [        US S9n0 nU H  u  pVn  nXtU'   M     U(       a  US   S   OSn	[        U R                  5       [        R                  " 5       R                  5       U R                  U VVVV
Vs/ s H  u  pVpn[        UUU
US9PM     snn
nnnU	USS	.S
9$ s  snn
nnnf )z.Build the game result with Nine-specific data.is_virtual_botFc                     U S   $ rQ   rC   )xs    r:   r   ,NineGame.build_game_result.<locals>.<lambda>  s    QqTr<   r   r   r   zN/A)rX   player_namerZ   r   )winner_namefinal_scoresrounds_played)	game_type	timestampduration_ticksplayer_resultscustom_data)r   re   r\   rY   r   r   rZ   getattrr   r   rK   r   now	isoformatsound_scheduler_tickr   )r8   r   r   sorted_player_resultsr   p_idp_name
cards_leftr   r   rZ   r   s               r:   build_game_resultNineGame.build_game_result  s$    ((*A!!qvvs166{AHHgaAQSX6YZ + !'~> J.C*D*a#-  /D 6K+A.q1PUmmolln..044 @N @N;D!^ " &!#1	 @N  + ,!"
 	
s   %Dresultc           
         [         R                  " US5      /nUR                  R                  S0 5      nUR                  R                  S5      nU(       d  U$ [        UR	                  5       S S9nU H{  u  pxXu:X  aL  UR                  [         R                  " USUS95        UR                  [         R                  " USUS	95        MV  UR                  [         R                  " US
XxS95        M}     U$ )z$Format the end screen for Nine game.zgame-final-scores-headerr   r   c                     U S   $ )Nr   rC   )items    r:   r   ,NineGame.format_end_screen.<locals>.<lambda>  s    tAwr<   r   zgame-winner)r   znine-final-score)scorezgame-eliminated)r   r  )r   rl   r   r   itemsre   )	r8   r  ro   linesr   r   sorted_playersrY   r  s	            r:   format_end_screenNineGame.format_end_screen  s    !!&*DEF))--nbA((,,];L   2 2 4:NO .D"\--fmDQR\--f6HPZ[\  $$V->t^ !/ r<   c                     [        SS9nU$ )z(Create the turn action set for a player.turn)rY   )r   )r8   r   
action_sets      r:   create_turn_action_setNineGame.create_turn_action_set  s    F+
 r<   c                   > [         TU ]  U5      nUR                  [        SSSSSSSS95        UR                  [        S	SS
SSSSS95        SUR                  ;   a  UR                  R                  S5        UR                  R                  SS5        S	UR                  ;   a  UR                  R                  S	5        UR                  R                  SS	5        S H$  nUR                  U5      nU(       d  M  SUl        M&     U$ )z(Create the standard action set for Nine.check_sequences_status _action_check_sequences_status"_is_check_sequences_status_enabled!_is_check_sequences_status_hiddenr   Tr\   labelhandler
is_enabled	is_hidden	get_labelshow_in_actions_menucheck_hand_counts_status _action_check_hand_counts_status$_is_check_hand_counts_status_enabled#_is_check_hand_counts_status_hidden&_get_localized_check_hand_counts_labelr   r   )check_scorescheck_scores_detailedF)	r5   create_standard_action_setaddr   _orderremoveinsert
get_actionr$  )r8   r   r  r   existingr9   s        r:   r,  #NineGame.create_standard_action_set  s   W7?
 	+8?=@%)
	
 	-:A?B%)
	
 $z'8'88$$%=>  $<=%):)::$$%?@  $>? CI!,,Y7Hx05- C
 r<   c                 <  > [         TU ]  5         SU R                  ;   a  / U R                  S'   U R                  S[        R
                  " SS5      S/[        R                  SS9  U R                  S[        R
                  " SS	5      S
/[        R                  SS9  g)z!Define all keybinds for the game.scr   r   r  T)stateinclude_spectatorsenine-action-check-hand-countsr%  N)r5   setup_keybinds	_keybindsdefine_keybindr   rl   r   ACTIVEr7   s    r:   r;  NineGame.setup_keybinds  s      $.. "$DNN3 	T#@A%&%%# 	 	
 	T#BC'(%%# 	 	
r<   c                    U R                  US5      nU(       d  g[        S[        UR                  5      S-   5       H[  nSU 3nUR	                  U5      (       a  UR                  U5        XBR                  ;   d  M@  UR                  R                  U5        M]     [        UR                  S5       HQ  u  p5SU 3nU R                  XSS9u  pgUR                  [        USS	U(       a  SOS
[        R                  SSS95        MS     g)z0Update card slot actions based on player's hand.r  Nr   r   play_card_slot_T
check_onlyr  _action_play_cardnine-reason-generic_get_card_slot_labelFr  )get_action_setr   r   r   r1  r/  r.  	enumerate_can_play_cardr-  r   r   VISIBLE)r8   r   turn_setir   rg   is_playabler   s           r:   _update_card_actionsNineGame._update_card_actions(  s    &&vv6 q#fkk*Q./A)!-I""9--	*OO+&&y1 0 !a0GA)!-I "00$0ONKLL /(39N(004).
 1r<   c                 h   [        U[        5      (       d  g [        UR                  S5      S   5      S-
  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U R                  XF5      $ ! [        [
        4 a     gf = f)z)Get dynamic label for a card slot action.r  r   r   r   r   )r   r   r   split
ValueError
IndexErrorr   r   r   ro   r}   )r8   r   r   slotrg   r   ro   s          r:   rF  NineGame._get_card_slot_labelI  s    &*--	ys+B/014D !8ts6;;//{{4 }}V$ $$,,T:: J' 		s    B B10B1c                 &    U R                  U5        g)z)Update dynamic card actions for a player.N)rN  r   s     r:   _update_turn_actionsNineGame._update_turn_actionsX  s    !!&)r<   c                 L    U R                    H  nU R                  U5        M     g)z$Update card actions for all players.N)r.   rX  r   s     r:   r   !NineGame._update_all_turn_actions\  s    llF%%f- #r<   c                 &    U R                   S:w  a  gg)z2Check if check sequences status action is enabled.r   action-not-playingNr   r   s     r:   r  +NineGame._is_check_sequences_status_enablede      ;;)#'r<   c                 "    [         R                  $ )z7Check sequences status is always hidden (keybind only).r   HIDDENr   s     r:   r  *NineGame._is_check_sequences_status_hiddenk         r<   c                     g)z@Skip turn action is never enabled for direct player interaction.zaction-disabledrC   r   s     r:   _is_skip_turn_enabledNineGame._is_skip_turn_enabledo  s     r<   c                 "    [         R                  $ )z.Skip turn action is always hidden from the UI.rb  r   s     r:   _is_skip_turn_hiddenNineGame._is_skip_turn_hiddens  re  r<   c                 ^    UR                    H  nU R                  XSS9S   (       d  M    g   g)z(Check if the player has any valid moves.TrB  r   F)r   rI  r   s      r:   r   NineGame._has_valid_movew  s3    KKD""6D"A!DD   r<   c           
         U R                  U5      nU(       d  gUR                  n[        R                  " US5      n/ n[        [
        [        [        4 GH  nU R                  Xt5      nU R                  R                  R                  U5      n	U	(       a  U	R                  (       a  U	R                  (       az  U R                  U	R                  R                  U5      n
U R                  U	R                  R                  U5      nU
 SU 3nUR                  [        R                  " USXS95        M  UR                  [        R                  " USUS95        GM     U R!                  X5        g)z%Show game sequences status to player.Nz	nine-nonez - znine-status-sequence)ra   sequenceznine-status-no-sequencera   )r   ro   r   rl   r   r   r   r   rx   r/   	sequenceslow_card	high_cardrt   r`   re   
status_box)r8   r   r   r   ro   none_strr  ra   r|   sequence_statelow_card_namehigh_card_namesequence_strs                r:   r  'NineGame._action_check_sequences_status  s+   }}V$##FK8  [ID55dCI!__66::4@N."9"9n>V>V $ = =n>U>U>Z>Z\b c!%!>!>",,116" #0N3CD $$ 6Y \--f6OV_`a J" 	&r<   c                 |    U R                  U5      nU(       a  UR                  OSn[        R                  " US5      $ )z7Get localized label for the 'Check Hand Counts' action.r   r:  r   r   s        r:   r)  /NineGame._get_localized_check_hand_counts_label  s1    }}V$ $$(GHHr<   c                 &    U R                   S:w  a  gg)z-Check if check hand counts action is enabled.r   r]  Nr^  r   s     r:   r'  -NineGame._is_check_hand_counts_status_enabled  r`  r<   c                 "    [         R                  $ )z2Check hand counts is always hidden (keybind only).rb  r   s     r:   r(  ,NineGame._is_check_hand_counts_status_hidden  re  r<   c                     U R                  U5      nU(       d  gUR                  nU R                  5        H1  nUR                  SUR                  [        UR                  5      S9  M3     g)zAAnnounce the number of cards in each player's hand to the player.Nznine-status-player-hand-count)r   count)r   ro   r   r   rY   r   r   )r8   r   r   r   ro   r   s         r:   r&  )NineGame._action_check_hand_counts_status  sT    }}V$((*ALL8sSTSYSY{L[ +r<   c                 R    [        U[        5      (       d  gU R                  U5        g)zHandle skipping a turn.N)r   r   r   )r8   r   r   s      r:   _action_skip_turnNineGame._action_skip_turn  s"    &*-- 	++F3r<   c                 D   [        U[        5      (       d  gU R                  U:w  a*  U R                  U5      nU(       a  UR	                  S5        g [        UR                  S5      S   5      S-
  nUS:  d  U[        UR                  5      :  a  gUR                  U   nU R                  X5      u  pgU(       a  U R                  XU5        gU R                  U5      nU(       a+  U R                  XSR                  5      nUR	                  XxS9  gg! [         a     gf = f)z Handle playing a card from hand.Nznine-reason-not-your-turnr   rQ  r   r   )rg   )r   r   r   r   r   r   rR  rS  r   r   rI  
_play_cardr}   ro   )	r8   r   r   r   rU  card_to_playcan_playreason	card_names	            r:   rD  NineGame._action_play_card  s    &*--&(==(D89	ys+B/014D !8ts6;;//{{4(..vDOOF,7==(D 99,T	V4   		s    D 
DDrC  c           	      8   U R                  U5      nU(       a  UR                  OSnU R                  R                  (       dB  UR                  [
        :X  a  UR                  [        :X  d  S[        R                  " US5      4$ gUR                  [
        :X  a&  UR                  U R                  R                  ;  a  g UR                  U R                  R                  ;   a  U R                  R                  UR                     nUR                  (       au  UR                  (       ad  U R                  U5      nU R                  UR                  5      nU R                  UR                  5      n	XxS-
  :H  n
XyS-   :H  nU
(       d  U(       a  gU(       Gd  U R                  U5      (       d  S[        R                  " US5      4$ UR                  [
        :X  aV  UR                  U R                  R                  ;   a2  S[        R                  " USU R                  UR                  U5      S94$ UR                  U R                  R                  ;   a2  S[        R                  " USU R                  UR                  U5      S94$ S[        R                  " US	5      4$ g
)zC
Check if a card can be played.
Returns (bool, reason_message_key)
r   Fz nine-reason-must-play-nine-clubs)Tr  r   znine-reason-must-skipznine-reason-cannot-extendrp  rE  )Fr  )r   ro   r/   nine_of_clubs_playedr`   r   ra   r   r   rl   rq  rr  rs  rm   r   rx   )r8   r   rg   rC  r   ro   ro  card_nine_valuelow_nine_valuehigh_nine_valueis_one_loweris_one_highers               r:   rI  NineGame._can_play_card  s    }}V$ $$ 33II*tyyJ/Fl..v7YZZZ 99	!yy 9 99 9911100;H  X%7%7"&";";D"A!%!:!:8;L;L!M"&";";H<N<N"O  /12DD /Q3F F=# ''//l..v7NOOOi'DII9R9R,Rl../66tyy&I  
 doo777l../66tyy&I   l..v7LMMMr<   rU  c                    U R                  U5      nU(       a  UR                  OSnUR                  R                  U5        U R	                  UR                  5      Ul        U R
                  R                  (       dW  SU R
                  l        [        X3S9U R
                  R                  UR                  '   U R                  SXR                  S9  GO4UR                  [        :X  aR  [        X3S9U R
                  R                  UR                  '   U R                  SUUR                  UUR                  S9  OU R
                  R                  UR                     nU R                  U5      nUR                  (       a)  U R                  UR                  5      US-   :X  a  X6l        O9UR                   (       a(  U R                  UR                   5      US-
  :X  a  X6l        U R                  S	UUR                  UUR                  S9  U R"                  R%                  U5        U R'                  [(        R*                  " / S
Q5      5        U R-                  5         g)zExecute playing a card.r   T)rr  rs  zplays-nine-clubsr   zplays-nine-suit)r   r   rg   ra   r   zextend-sequence)zgame_cards/play1.oggzgame_cards/play2.oggzgame_cards/play3.oggzgame_cards/play4.oggN)r   ro   r   popr   r/   r  r    rq  ra   r   rY   r`   r   rm   rr  rs  r1   re   r   r   r   r   )r8   r   rU  rg   r   ro   ro  r  s           r:   r  NineGame._play_card%  s   }}V$ $$,,V[[93337DOO03@$3_DOO%%dii0(("6++ )  YY)#3@$3_DOO%%dii0((!%{{YY )  00;H"77=O !!--h.?.?@OVWDWW$(!""--h.@.@A_WXEXX%)"((!%{{YY )  	  &MM		
 	r<   c                 r   > [         TU ]  5         U R                  (       d  g[        R                  " U 5        g)zCalled every tick.N)r5   on_tickr2   r   r7   s    r:   r  NineGame.on_tickg  s'    $r<   c                    U R                   U:w  a  gU R                  R                  (       dR  [        UR                  5       H9  u  p#UR
                  [        :X  d  M  UR                  [        :X  d  M1  SUS-    3s  $    [        UR                  5       HI  u  p#UR
                  [        :X  d  M  UR                  U R                  R                  ;  d  MA  SUS-    3s  $    [        UR                  5       H  u  p#UR                  U R                  R                  ;   d  M+  U R                  R                  UR                     nU R                  U5      nUR                  (       a,  U R                  UR                  5      US-   :X  a
  SUS-    3s  $ UR                  (       d  M  U R                  UR                  5      US-
  :X  d  M  SUS-    3s  $    U R                  U5      (       d  gg)zBot AI decision making.NrA  r   	skip_turn)r   r/   r  rH  r   r`   r   ra   r   rq  rm   rr  rs  r   )r8   r   rL  rg   ro  r  s         r:   	bot_thinkNineGame.bot_thinkp  s   &( 33$V[[199	)dii:.E,QUG44 2
 !-GAyyI%$))4??;T;T*T(Q00 .
 !-GAyyDOO555??44TYY?"&";";D"A %%11(2C2CDZ[H[[,QUG44&&&11(2D2DE[\I\\,QUG44 ." ##F++r<   )r   r0   r1   r3   r2   r/   r   )r=   N)F)r   r   )Q__name__
__module____qualname____firstlineno____doc__r   listr.   r   __annotations__r   r/   r   r0   r1   r   r2   boolr3   r   rr   r6   r?   classmethodrF   rK   rN   r   rR   rV   r]   rh   rm   rt   rx   r}   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r,  r;  rN  rF  rX  r   r  r   r  rg  rj  r   r  r)  r'  r(  r&  r  rD  tuplerI  r  r  r  __static_attributes____classcell__)r9   s   @r:   r+   r+   X   s     !&d ;GT*;!)<J	<t,D$,$T:L$t*: K*.(3-. (       %S % %      Bs B# Bt BPZ B!$ !1 1# 1S #  S #  UT U3 U# UG6 Gc GVY G[d4j [T$Z [
$ $t $ EI#:#:0:T0A#:	#:R49 /b%
NHSM !(Z D HSM 3 4  "
: "
H
 C DI <Z I , ,	 ,\
4: $ B;6 ;c ;c ;*: *$ *. C$J ! !: !!F !sTz !!6 !j !j T 'V ' 'PT '<IV IPS IX[ I6 cDj !& !Z !	\v 	\# 	\RV 	\4 43 44 45 53 54 5J BG; ;(,;:>;	tSy	;z< <3 <d <t <D %
 %sTz % %r<   r+   )6dataclassesr   r   r   r   typingr   mashumaro.mixins.jsonr   baser	   r
   registryr   game_utils.actionsr   r   r   r   game_utils.bot_helperr   game_utils.game_resultr   r   messages.localizationr   core.ui.keybindsr   game_utils.cardsr   r   r   r   r   r   r   r   r7  r   r    RANK_SIX
RANK_SEVEN
RANK_EIGHTr   RANK_TEN	RANK_JACK
RANK_QUEEN	RANK_KINGRANK_ACErk   rd   rq   rw   r+   rC   r<   r:   <module>r     sA   (    4  $ J J . > 1 ,   +
 

		
	 aqbrrb
 
  j{j{{j
 ?		 {t {  {r<   