
    Ii              	         S r SSKJr  SSKJrJr  SSKJr  SSKrSSKJ	r	J
r
Jr  SSKJr  S	S
KJrJrJr  S	SKJr  S	SKJrJr  S	SKJrJrJrJr  S	SKJrJrJrJ r J!r!  S	SK"J#r#  S	SK$J%r%  S	SK&J'r'  SSK(J)r)  SSK*J+r+J,r,J-r-J.r.J/r/  SSK0J1r1J2r2  / SQr3SSSSSSSSS.r4/ SQr5S S!S"S#S.r6/ S$Qr7S%S&S'S$.r8/ S(Qr9S)S*S+S(.r:S,r;/ S-Qr</ S.Qr=/ S/Qr>/ S0Qr?S1r@S2rAS3rBS4rCS5rDS1rE\ " S6 S7\5      5       rF\ " S8 S9\
5      5       rG\\ " S: S;\	\#5      5       5       rHg)<a  
Pusoy Dos Game Implementation for PlayPalace v11.

Filipino card game where players race to empty their hand by playing
increasingly powerful card combinations.  Supports elimination and
points game modes, configurable instant wins, card passing, and
penalty tiers.
    )annotations)	dataclassfield)datetimeN   )GamePlayerGameOptions)register_game   )Action	ActionSet
Visibility)	BotHelper)
GameResultPlayerResult)	IntOption
MenuOption
BoolOptionoption_field)CardDeckDeckFactory	card_name
read_cards)TurnTimerMixin)PokerTurnTimer)Localization)KeybindState   )Comboevaluate_combodetect_instant_win
sort_cards
card_value)	bot_thinkbot_choose_give_cards)101520304560900zpusoydos-timer-10zpusoydos-timer-15zpusoydos-timer-20zpusoydos-timer-30zpusoydos-timer-45zpusoydos-timer-60zpusoydos-timer-90zpusoydos-timer-unlimited)eliminationlossespointspoints_eliminationzpusoydos-mode-eliminationzpusoydos-mode-losseszpusoydos-mode-pointsz pusoydos-mode-points-elimination)offsimplefullzpusoydos-passing-offzpusoydos-passing-simplezpusoydos-passing-full)standard
aggressiveflatzpusoydos-penalty-standardzpusoydos-penalty-aggressivezpusoydos-penalty-flatzgame_ninetynine/mus.ogg)zgame_cards/discard1.oggzgame_cards/discard2.oggzgame_cards/discard3.ogg)zgame_cards/play1.oggzgame_cards/play2.oggzgame_cards/play3.oggzgame_cards/play4.ogg)zgame_cards/shuffle1.oggzgame_cards/shuffle2.oggzgame_cards/shuffle3.ogg)zgame_cards/draw1.oggzgame_cards/draw2.oggzgame_cards/draw3.oggzgame_cards/draw4.oggzgame_uno/winround.oggzgame_uno/loseround.oggzgame_uno/wingame.oggzgame_coup/challengesuccess.oggzturn.oggc                     \ rS rSr% \" \" \\SSSSSSS95      rS	\	S
'   \" \
" SSSSSSSSS9S
S 4S9rS\	S'   \" \
" SSSSSSSSS9S
S 4S9rS\	S'   \" \
" SSS S!S"S#S$S%S9S
S& 4S9rS\	S''   \" \" \\S(SS)S*S+S,S95      rS	\	S-'   \" \" S.S/S0S1S2S395      rS4\	S5'   \" \" S6S/S7S8S9S395      rS4\	S:'   \" \" \\S;SS<S=S>S?S95      rS	\	S@'   \" \" \\SASSBSCSDSES9S
SF 4S9rS	\	SG'   \" \" S.S/SHSISJS39S
SK 4S9rS4\	SL'   SMrgN)OPusoyDosOptionsf   r0   choicezpusoydos-set-game-modezpusoydos-select-game-modez!pusoydos-option-changed-game-modezpusoydos-desc-game-mode)choiceschoice_labelsdefault	value_keylabelprompt
change_msgdescriptionstr	game_moder   r    
   countzpusoydos-set-rounds-to-winzpusoydos-enter-rounds-to-winz%pusoydos-option-changed-rounds-to-winzpusoydos-desc-rounds-to-win)r@   min_valmax_valrA   rB   rC   rD   rE   c                    U S:H  $ )Nr0    vs    9c:\Users\dbart\PlayPalace11\server\games\pusoydos\game.py<lambda>PusoyDosOptions.<lambda>   s	    Q--?    )visible_whenintrounds_to_winr   zpusoydos-set-losses-to-losezpusoydos-enter-losses-to-losez&pusoydos-option-changed-losses-to-losezpusoydos-desc-losses-to-losec                    U S:H  $ )Nr1   rM   rN   s    rP   rQ   rR      s    Q(]rS   losses_to_losed   i'  scorezpusoydos-set-target-scorezpusoydos-enter-target-scorez$pusoydos-option-changed-target-scorezpusoydos-desc-target-scorec                    U S;   $ N)r2   r3   rM   rN   s    rP   rQ   rR      
    Q2R-RrS   target_scorer/   zpusoydos-set-turn-timerzpusoydos-select-turn-timerz"pusoydos-option-changed-turn-timerzpusoydos-desc-turn-timer
turn_timerFenabledz!pusoydos-set-allow-2-in-straightsz,pusoydos-option-changed-allow-2-in-straightsz"pusoydos-desc-allow-2-in-straights)r@   rA   rB   rD   rE   boolallow_2_in_straightsTzpusoydos-set-instant-winsz$pusoydos-option-changed-instant-winszpusoydos-desc-instant-winsinstant_winsr4   zpusoydos-set-card-passingzpusoydos-select-card-passingz$pusoydos-option-changed-card-passingzpusoydos-desc-card-passingcard_passingr7   zpusoydos-set-penalty-tierzpusoydos-select-penalty-tierz$pusoydos-option-changed-penalty-tierzpusoydos-desc-penalty-tierc                    U S;   $ r\   rM   rN   s    rP   rQ   rR      r]   rS   penalty_tierzpusoydos-set-penalty-per-twoz'pusoydos-option-changed-penalty-per-twozpusoydos-desc-penalty-per-twoc                    U S;   $ r\   rM   rN   s    rP   rQ   rR      r]   rS   penalty_per_tworM   N)__name__
__module____qualname____firstlineno__r   r   GAME_MODE_CHOICESGAME_MODE_LABELSrG   __annotations__r   rV   rX   r^   TURN_TIMER_CHOICESTURN_TIMER_LABELSr_   r   rb   rc   CARD_PASSING_CHOICESCARD_PASSING_LABELSrd   PENALTY_TIER_CHOICESPENALTY_TIER_LABELSrf   rh   __static_attributes__rM   rS   rP   r;   r;   f   s   !%*!*.:1		
Is  &.1>5		
 "#?@M3  '/2?6		
 "#:;NC  %-0=4		
 "#RSL#  #&++/;2		
J  ".5E<	
"$  &-=4	
L$  %(--1=4		
L#  %(--1=4		
 "#RSL#  )0@7	
 "#RS	OT 	rS   r;   c                      \ rS rSr% \" \S9rS\S'   \" \S9r	S\S'   Sr
S\S	'   S
rS\S'   S
rS\S'   S
rS\S'   SrS\S'   S
rS\S'   S
rS\S'   SrS\S'   SrS\S'   Srg)PusoyDosPlayer   default_factory
list[Card]handzset[int]selected_cardsFra   passed_this_trickr   rU   
round_winsround_lossesrZ   
eliminatedpass_confirm_tickscards_to_give rF   
give_to_idgiving_cardsrM   N)ri   rj   rk   rl   r   listr}   ro   setr~   r   r   r   rZ   r   r   r   r   r   rv   rM   rS   rP   rx   rx      s{    T2D*2$S9NH9#t#JL#E3NJM3JL$rS   rx   c                    ^  \ rS rSr% S/r\" \S9rS\S'   \" \	S9r
S\S'   SrS	\S
'   SrS\S'   \" \S9rS\S'   SrS\S'   SrS\S'   SrS\S'   \" \S9rS\S'   SrS\S'   \" \S9rS\S'   \" \S9rS\S'   U 4S jr\SoS j5       r\SoS  j5       r\SoS! j5       r\SpS" j5       r\SpS# j5       r\SqS$ j5       rSrSsS% jjrStU 4S& jjrSuS' jr SvS( jr!SuS) jr"SwS* jr#SxS+ jr$SyS, jr%SxS- jr&SxS. jr'SzS/ jr(SxS0 jr)SuS1 jr*SuU 4S2 jjr+S{S3 jr,SuS4 jr-S|S5 jr.S}U 4S6 jjr/SuU 4S7 jjr0S~U 4S8 jjr1SSU 4S9 jjjr2SuU 4S: jjr3S~S; jr4SS< jr5SS= jr6SS> jr7SS? jr8SS@ jr9SSA jr:SSB jr;SSC jr<SSD jr=SSE jr>SuSF jr?SuSG jr@SuSH jrASuSI jrBSuSJ jrCSSK jrDSSL jrESSM jrFSSN jrGSSO jrHSSP jrISSQ jrJSSR jrKSSS jrLSST jrMSSU jrNSSV jrOSSW jrPSSX.     SSY jjrQSSX.SSZ jjrRSS[ jrSSS\ jrTSS] jrUSS^ jrVSS_ jrWSS` jrXSSa jrYSU 4Sb jjrZSU 4Sc jjr[SU 4Sd jjr\SSe jr]SSf jr^SSg jr_SSh jr`SSi jraSSj jrbSuSk jrcSSl jrdSSm jreSnrfU =rg$ )PusoyDosGame   confirm_destructive_actionsrz   list[PusoyDosPlayer]playersr;   optionsNzCombo | Nonecurrent_combo
str | Nonetrick_winner_idr|   trick_cardsTra   is_first_turnr   rU   hand_wait_ticksroundr   timerplayingrF   phase	list[str]finishing_orderprev_finishing_orderc                0   > [         TU ]  5         SU l        g )NF)super__post_init___timer_warning_playedself	__class__s    rP   r   PusoyDosGame.__post_init__  s    %*"rS   c                    g)Nz	Pusoy DosrM   clss    rP   get_namePusoyDosGame.get_name  s    rS   c                    g)NpusoydosrM   r   s    rP   get_typePusoyDosGame.get_type!  s    rS   c                    g)Nzcategory-playauralrM   r   s    rP   get_categoryPusoyDosGame.get_category%  s    #rS   c                    g)Nr   rM   r   s    rP   get_min_playersPusoyDosGame.get_min_players)      rS   c                    g)N   rM   r   s    rP   get_max_playersPusoyDosGame.get_max_players-  r   rS   c                
    / SQ$ )N)winsratinggames_playedrM   r   s    rP   get_supported_leaderboards'PusoyDosGame.get_supported_leaderboards1  s    11rS   c                    [        XUS9$ )N)idnameis_bot)rx   )r   	player_idr   r   s       rP   create_playerPusoyDosGame.create_player5  s    fEErS   c                   > [         TU ]  5       n[        U R                   Vs/ s H  o"R                  (       a  M  UPM     sn5      nU R
                  R                  S:X  a  US;  a  UR                  S5        U$ s  snf )Nr6   )r   r   z#pusoydos-error-full-passing-players)r   prestart_validatelenr   is_spectatorr   rd   append)r   errorspactive_countr   s       rP   r   PusoyDosGame.prestart_validate8  sb    *,t||J|!>>A|JK<<$$.<v3MMM?@ Ks
   A;A;c                   SU l         U R                  5         SU l        SU l        / U l        / U l        U R                  5        H  nSUl        SUl        SUl	        SUl
        M!     SU R                  l        U R                  R                  U R                  5        Vs/ s H  oR                  PM     sn5        U R                  [         5        U R#                  5         g s  snf )Nr   Tr   F
individual)status_sync_table_statusgame_activer   r   r   _playing_playersr   r   rZ   r   _team_manager	team_modesetup_teamsr   
play_musicSOUND_MUSIC_start_new_handr   r   s     rP   on_startPusoyDosGame.on_startC  s    !
!$&!&&(AALANAG AL	 ) (4$&&8M8M8O'P8O18O'PQ$ (Qs   C!c                    U R                    Vs/ s HB  n[        U[        5      (       d  M  UR                  (       a  M-  UR                  (       a  M@  UPMD     sn$ s  snf )z;Players still in the game (not eliminated, not spectators).)r   
isinstancerx   r   r   r   s     rP   r   PusoyDosGame._playing_players[  sO     \\
!!^, 56^^ LMLL !
 	
 
s   AAAAc           
        U =R                   S-  sl         SU l        S U l        S U l        / U l        / U l        U R                  5       nU R                  SU R                   S9  [        U5      n[        R                  " 5       u  p4US:X  aC  UR                   Vs/ s H&  oUR                  S:X  a  UR                  S:X  a  M$  UPM(     snUl        UR                  5         U HG  n/ Ul        UR                   R#                  5         SUl        SUl        SUl        S	Ul        SUl        MI     [        UR                  5      U-  n[/        U5       H@  nU H7  nUR1                  5       nU(       d  M  UR                  R3                  U5        M9     MB     U H  n[5        UR                  5      Ul        M     U R7                  [8        R:                  " [<        5      S
SS9  U R7                  [8        R:                  " [>        5      SSS9  U R7                  [8        R:                  " [>        5      SSS9  U H`  nU RA                  U5      n	U	(       d  M  U	RC                  SS[        UR                  5      [E        UR                  U	RF                  5      S9  Mb     U RH                  RJ                  (       a3  U RH                  RL                  S:X  a  U RO                  U5      n
U
(       a  g U RH                  RL                  S:w  a3  U R                   S:  a#  U RP                  (       a  U RS                  U5        g U RU                  U5        g s  snf )Nr    Tzpusoydos-new-hand)r   r   r   Fr   r   rH   rY   )volume      zpusoydos-dealttable)bufferrI   cardsr4   )+r   r   r   r   r   r   r   broadcast_lr   r   standard_deckr   ranksuitshuffler}   r~   clearr   r   r   r   r   rangedraw_oner   r$   schedule_soundrandomr=   SOUND_SHUFFLE
SOUND_DEALget_userspeak_lr   localer   rc   rd   _check_instant_winsr   _start_card_passing_begin_play)r   activendeck_cr   cards_per_playercarduser	win_founds              rP   r   PusoyDosGame._start_new_handc  s   

a
!!#!&&(,DJJ? K++-6%)ZZUZ!RS!ZUDJAAF""$"'A#$A AOAL"AN  tzz?a/'(A}}4FFMM$'  ) A'AF  	FMM-8"SIFMM*5r#FFMM*5r#FA==#Dt$"aff+$QVVT[[9	    <<$$)B)Be)K008I <<$$-$**q.TE^E^$$V, c Vs   #M Mc                B   U H  n[        UR                  U R                  R                  S9nU(       d  M4  SSSS.R	                  US5      nU R                  [        5        U R                  XBR                  S9  U R                  U5        U R                  5           g   g)	zGCheck all players for instant win hands. Returns True if one was found.rb   zpusoydos-instant-win-dragonzpusoydos-instant-win-four-twoszpusoydos-instant-win-six-pairs)dragon	four_twos	six_pairsplayerTF)r#   r}   r   rb   get
play_soundSOUND_INSTANT_WINr   r   _player_wins_round
_end_round)r   r   r   win_typemsg_keys        rP   r    PusoyDosGame._check_instant_wins  s    A)T\\-N-NH x;!A!A #h =>	   12   8''*!   rS   c                h   SU l         U R                  S5        U Vs1 s H  o"R                  iM     nnU R                   Vs/ s H  oDU;   d  M
  UPM     nn[	        U5      S:  a  U R                  U5        gU R                  R                  S:X  a  U R                  US   US   S5        O[U R                  R                  S	:X  aA  U R                  US   US   S5        [	        U5      S
:  a  U R                  US   US   S5        U R                  U5        U R                  U5        gs  snf s  snf )zHInitiate the card passing phase based on previous round finishing order.rd   zpusoydos-passing-phaser   Nr5   r   r    r6   r   )r   r   r   r   r   r   r   rd   _setup_exchange_auto_give_loser_cards_process_card_passing)r   r   r   
active_idspid
prev_orders         rP   r    PusoyDosGame._start_card_passing  s   #
12 %++FqddF
+%)%>%>T%>cBSc%>
Tz?QV$ <<$$0  A
2B\\&&&0  A
2B:!#$$Z]JrNAF 	##F+ 	""6*- ,Ts   D*	D/D/c                   U R                  U5      nU R                  U5      nU(       a  U(       d  g[        UR                  5      U* S nU H9  nUR                  R                  U5        UR                  R	                  U5        M;     U R                  SUR                  UR                  US9  U R                  U5      nU(       a0  [        XhR                  5      n	UR                  SSXR                  S9  X4l        X$l        SUl        g)z0Set up a card exchange between winner and loser.Nzpusoydos-loser-gives)loserwinnerrI   pusoydos-received-cardsr   r   r   senderT)_get_pusoy_playerr$   r}   remover   r   r   r   r   r   r   r   r   r   )
r   	winner_idloser_idrI   r   r  loser_highestr  winner_user	cards_strs
             rP   r  PusoyDosGame._setup_exchange  s    ''	2&&x0U #5::.vw7 "DJJd#KKt$ "
 	/uzz&++]bc mmF+"=2D2DEI)'S]S]   
  %$"rS   c                    g)z8Notify players about the automatic loser card transfers.NrM   )r   r   s     rP   r  #PusoyDosGame._auto_give_loser_cards  s    rS   c                   U H|  nUR                   (       d  M  UR                  S:  d  M(  UR                  (       a3  [        UR                  UR                  5      nU R                  X#5        Ml  U R                  5           g   SU l        U H  n[        UR                  5      Ul        M     U R                  S5        U R                  U5        g)z=Check if all card passing decisions are made. If so, proceed.r   Nr   zpusoydos-cards-exchanged)r   r   r   r'   r}   _complete_giverebuild_all_menusr   r$   r   r   )r   r   r   give_idss       rP   r  "PusoyDosGame._process_card_passing  s    A~~~!//A"5884QVVQ__MH''4 **,  
A'AF  	34 rS   c                   U R                  UR                  5      nU(       d  gUR                   Vs/ s H  oDR                  U;   d  M  UPM     nnU H9  nUR                  R	                  U5        UR                  R                  U5        M;     U R                  SUR                  UR                  [        U5      S9  U R                  U5      nU R                  U5      nU(       a/  UR                  SS[        XWR                  5      UR                  S9  U(       a/  UR                  SS[        XXR                  5      UR                  S9  S	Ul        S
Ul        SUl        gs  snf )z0Transfer selected cards from giver to recipient.Nzpusoydos-winner-gives-back)r   r  rI   zpusoydos-passed-cardsr   )r   r   	recipientr!  r"  r   r   F)r$  r   r}   r   r%  r   r   r   r   r   r   r   r   r   r   )	r   givercard_idsr4  r   given_cardsr  
giver_userrecipient_users	            rP   r/  PusoyDosGame._complete_give  s>   **5+;+;<	"'**A*Q0@q*ADJJd#NN!!$'  
 	(::..k"	 	 	
 ]]5)
y1' .?.?@#..	   "") .C.CDzz	 #   "E Bs   E#	E#c                T   SU l         SnU H(  n[        S UR                   5       5      (       d  M&  Un  O   U(       dA  SnU H9  nUR                  (       d  M  [        UR                  S   5      nXT:  d  M5  UnUnM;     U R	                  U5        U(       a  U R
                  R                  UR                  5      nX`l        [        S UR                   5       5      (       a  U R                  SUR                  S9  OU R                  S	UR                  S9  U R                  5         g)
z/Find the starting player and begin normal play.r   Nc              3  j   #    U  H)  oR                   S :H  =(       a    UR                  S:H  v   M+     g7fr   r   Nr   r   .0r   s     rP   	<genexpr>+PusoyDosGame._begin_play.<locals>.<genexpr>B  s&     ?166Q;.166Q;.   13i  r   c              3  j   #    U  H)  oR                   S :H  =(       a    UR                  S:H  v   M+     g7fr=  r>  r?  s     rP   rA  rB  T  s(     J8I166Q;.166Q;.8IrC  zpusoydos-first-playerr
  zpusoydos-first-player-lowest)r   anyr}   r%   set_turn_playersturn_player_idsindexr   
turn_indexr   r   _start_turn)r   r   start_playerr   
lowest_valvalidxs          rP   r   PusoyDosGame._begin_play;  s    
 A????  
 J666$QVVAY/C'%(
'(  	f%&&,,\__=C!OJ8I8IJJJ  !8ARAR S  !?HYHY ZrS   c                  ^  T R                   nU(       a  [        U[        5      (       d  g T R                  5        H
  nSUl        M     T R                  5        Vs/ s H!  o"R
                  (       a  M  UR                  PM#     nnT R                  (       a.  T R                  U;  a  T R                  b  UR                  T l        T R                  UR                  :X  a[  T R                  b  T R                  SUR                  S9  S T l        / T l        S T l        T R                  5        H
  nSUl        M     OUR                  (       a  [        U 4S jT R                  5        5       5      nU(       af  T R                  T R                  5      nU(       a"  UR                  T R                  ;   a  UT l         OUR                  T l        T R!                  5         g T R#                  SS9  T R!                  5         g T R%                  5         UR&                  (       a*  [(        R*                  " U[,        R.                  " SS5      S	9  T R1                  5         T R3                  5         g s  snf )
Nr   zpusoydos-trick-wonr
  Fc              3     >#    U  HI  nUR                   TR                  :w  d  M  UR                   TR                  ;   d  M;  UR                  v   MK     g 7fN)r   r   rG  r   )r@  r   r   s     rP   rA  +PusoyDosGame._start_turn.<locals>.<genexpr>}  sI      0A444/// $45DDD<P<P4P $##0s   AAAannounce   2   )ticks)current_playerr   rx   r   r   r   r   r   r   r   r   r   r   allget_player_by_idrG  rJ  advance_turnannounce_turnr   r   jolt_botr   randintstart_turn_timerr0  )r   r  r   r  
all_passedr   s   `     rP   rJ  PusoyDosGame._start_turn_  s   $$Z?? &&(A#$A  ) %)$9$9$;P$;q<<dadd$;
P  $$J6"".#)99D 699,!!-  !5fkk J!%D!D#'D **,&+# - %% ..0 J
 ..t/C/CDfii4+?+??*0D' ,299D(  "u-==vV^^B-CD [ Qs   I&3I&c                  > [         TU ]  5         U R                  5         U R                  (       d  g U R                  S:  a6  U =R                  S-  sl        U R                  S:X  a  U R                  5         g U R                  5        H*  nUR                  S:  d  M  U=R                  S-  sl        M,     U R                  5         [        R                  " U 5        g )Nr   r    )
r   on_tickprocess_scheduled_soundsr   r   r   r   r   on_tick_turn_timerr   )r   r   r   s     rP   rd  PusoyDosGame.on_tick  s    %%'!#  A% ##q($$& &&(A##a'$$)$ ) 	!$rS   c                   U R                   S:  a  g U R                  S:X  ar  UR                  (       aa  UR                  S:  aQ  [	        UR
                  UR                  5      nU R                  X5        U R                  U R                  5       5        g U R                  S:w  a  g [        X5      nU(       d  g[        U5      Ul        g)Nr   rd   r   passplay_selected)r   r   r   r   r'   r}   r/  r  r   r&   r   r~   )r   r  r1  idss       rP   r&   PusoyDosGame.bot_think  s    !# ::'F,?,?FDXDX[\D\,V[[&:N:NOH1&&t'<'<'>?::"% #CrS   c                    U R                   n[        U[        5      (       d  g U R                  (       d5  [	        X5      nU(       a#  [        U5      Ul        U R                  US5        g U R                  US5        g )Nrj  ri  )	rY  r   rx   r   r&   r   r~   _action_play_selected_action_pass)r   r  rk  s      rP   _on_turn_timeoutPusoyDosGame._on_turn_timeout  sb    $$&.11!!D)C(+C%**6?C&&)rS   c                   U R                  U5      nU(       a  UR                  OSn[        SS9nUR                   H.  nUR	                  [        SUR                   3SSSSS	S
S95        M0     UR	                  [        SSSSSSS
S95        UR	                  [        S[        R                  " US5      SSSS
S95        UR                  (       a.  UR                  S:  a  UR	                  [        SSSSSSS
S95        U$ )Nenturn)r   toggle_select_r   _action_toggle_select_is_card_toggle_enabled_is_card_toggle_hidden_get_card_labelFr   rB   handler
is_enabled	is_hidden	get_labelshow_in_actions_menurj  rn  _is_play_selected_enabled_is_turn_action_hidden_get_play_selected_labelri  pusoydos-passro  _is_pass_enabled_is_pass_hiddenr   rB   r{  r|  r}  r  r   confirm_give_action_confirm_give_is_give_enabled_is_give_hidden_get_give_label)r   r   r   r}   addr   r   r   r  r   r   )r   r  r  r   
action_setr  s         rP   create_turn_action_set#PusoyDosGame.create_turn_action_set  s   }}V$ $$F+
KKDNN'y1386/).
   	"/624%*
	
 	"&&v?&-+%*		
 6#7#7!#;NN%21//).
 rS   c                   > [         TU ]  U5      nU R                  U5      nU(       a  UR                  OSnUR	                  [        S[        R                  " US5      SSSSS95        UR	                  [        S	[        R                  " US
5      SSSS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$ )Nrs  check_trickzpusoydos-check-trick_action_check_trick_is_check_enabled_is_check_hiddenT)r   rB   r{  r|  r}  include_spectators	read_handzpusoydos-read-hand_action_read_hand_is_read_hand_enabled_is_read_hand_hidden)r   rB   r{  r|  r}  read_card_countszpusoydos-read-card-counts_action_read_card_countscheck_turn_timerzpusoydos-check-turn-timer_action_check_turn_timer)r   create_standard_action_setr   r   r  r   r   r  )r   r  r  r  r   r   s        rP   r  'PusoyDosGame.create_standard_action_set  s   W7?
}}V$ $$ "&&v/EF-.,#'		
 	"&&v/CD+20	
 	%"&&v/JK2.,#'		
 	%"&&v/JK2.,#'		
 rS   c                >  > [         TU ]  5         U R                  SSS/[        R                  S9  U R                  SSS/[        R                  S9  U R                  SS	S
/SS9  U R                  SSS/SS9  U R                  SSS/SS9  U R                  SSS/SS9  g )Nspacezpusoydos-key-playrj  )stater   zpusoydos-key-passri  r   zpusoydos-key-trickr  T)r  hzpusoydos-key-handr  Fezpusoydos-key-countsr  zshift+tzpusoydos-key-timerr  )r   setup_keybindsdefine_keybindr   ACTIVEr   s    rP   r  PusoyDosGame.setup_keybinds;  s     (?*;<CVCV 	 	
 	C!4vhlFYFYZC!5[_`C!4{mX]^&);(<QU 	 	
 	+.@-AVZ 	 	
rS   c                F   > U R                  U5        [        TU ]	  U5        g rR  )_sync_turn_actionsr   rebuild_player_menur   r  r   s     rP   r   PusoyDosGame.rebuild_player_menuJ  s    '#F+rS   c                B   > U R                  U5        [        TU ]	  XS9  g )N)selection_id)r  r   update_player_menu)r   r  r  r   s      rP   r  PusoyDosGame.update_player_menuN  s!    '"6"ErS   c                j   > U R                    H  nU R                  U5        M     [        TU ]  5         g rR  )r   r  r   r0  r  s     rP   r0  PusoyDosGame.rebuild_all_menusR  s*    llF##F+ #!#rS   c                   [        U[        5      (       d  g U R                  US5      nU(       d  g UR                  S5        UR	                  S5        UR	                  S5        UR	                  S5        U R
                  S:w  d"  UR                  (       d  UR                  (       a  g U R                  S:  a  g U R                  S:X  a~  UR                  (       am  UR                  S:  a]  UR                   H.  nUR                  [        SUR                   3S	S
SSSSS95        M0     UR                  [        SS	SSSSSS95        g U R                  S:w  a  g UR                   H.  nUR                  [        SUR                   3S	S
SSSSS95        M0     U R                   U:X  a`  UR                  [        SS	SSSSSS95        UR                  [        S["        R$                  " U R'                  U5      S5      SSSSS95        g g )Nrt  ru  rj  ri  r  r   r   rd   r   rv  rw  rx  ry  Frz  r  r  r  r  rn  r  r  r  r  ro  r  r  r  )r   rx   get_action_setremove_by_prefixr%  r   r   r   r   r   r   r   r}   r  r   r   rY  r   r  _player_locale)r   r  turn_setr  s       rP   r  PusoyDosGame._sync_turn_actionsW  s   &.11&&vv6!!"23(';;)#v':':f>O>O!# ::'F,?,?FDXDX[\D\+DGG95  7#<":"3-2
 $ LL%21//).
 ::" KKDLL'y1386/).
   &(LL&3:68).
 LL&**4+>+>v+FX*1/).	 )rS   c                @   U R                  U5      nU(       d  g  [        UR                  S5      S   5      nXCR                  ;   a  UR                  R                  U5        OUR                  R                  U5        U R                  U5        g ! [         a     g f = f)Nr   r  )_require_pusoy_playerrU   split
ValueErrorr~   r%  r  r  )r   r  	action_idr   card_ids        rP   rv  "PusoyDosGame._action_toggle_select  s    &&v.	)//#.r23G &&&##G,  )"  		s   B 
BBc                   U R                  U5      nU(       d  g UR                  (       d  U R                  US5        g UR                   Vs/ s H   oDR                  UR                  ;   d  M  UPM"     nn[        XPR                  R                  S9nU(       d  U R                  US5        g U R                  (       aO  [        S UR                   5       5      n[        S U 5       5      nU(       a  U(       d  U R                  US5        g U R                  (       a  [        UR                  5      [        U R                  R                  5      :w  a/  U R                  US[        U R                  R                  5      S9  g UR                  U R                  5      (       d  U R                  US	5        g U H  nUR                  R                  U5        M      UR                  R                  5         X`l
        XPl        UR                  U l        S
U l        [        U5      S:  a*  U R%                  [&        R(                  " [*        5      5        O)U R%                  [&        R(                  " [,        5      5        U R/                  X65        [        UR                  5      S:X  a  U R1                  SUR2                  S9  [        UR                  5      S:X  a  U R5                  U5        g U R7                  S
S9  U R9                  5         g s  snf )Nzpusoydos-error-no-cardsr  zpusoydos-error-invalid-comboc              3  j   #    U  H)  oR                   S :H  =(       a    UR                  S:H  v   M+     g7fr=  r>  r?  s     rP   rA  5PusoyDosGame._action_play_selected.<locals>.<genexpr>  s&     "O166Q;#>166Q;#>rC  c              3  j   #    U  H)  oR                   S :H  =(       a    UR                  S:H  v   M+     g7fr=  r>  r?  s     rP   rA  r    s&     #RAFFaK$?AFFaK$?rC  zpusoydos-error-first-turn-3czpusoydos-error-wrong-lengthrI   zpusoydos-error-lower-comboFr    zpusoydos-one-cardr
  r   rT  )_require_active_turn_playerr~   _send_errorr}   r   r"   r   rb   r   rE  r   r   r   beatsr%  r   r   r   r  r   r=   SOUND_PLAY_MULTISOUND_PLAY_SINGLE_broadcast_playr   r   _player_finishesr\  rJ  )	r   r  r  r   r   selectedcomboplayer_has_threehas_three_in_plays	            rP   rn  "PusoyDosGame._action_play_selected  s\   ,,V4Q 9: vvBv!1A1A)AAvBxll>_>_`Q >? ""O"OO ##R#R R(9  $BC 5;;3t'9'9'?'?#@@  4C@R@R@X@X<Y !  ;;t1122  $@A AFFMM! 	 "# tt" x=1OOFMM*:;<OOFMM*;<=Q&qvv;!0@qvv;!!!!$5)i Cs   L-Lc                .   U R                  U5      nU(       d  g U R                  (       d  U R                  US5        g UR                  (       do  UR                  S:X  a_  U R                  U5      nU(       aG  UR                  R                  SU R                  5       S9nU(       a  SUl        UR                  SSS9  g SUl        S	Ul
        U R                  U5        UR                  R                  5         U R                  S
S9  U R                  5         g )Npusoydos-error-must-playr   r   )	game_type   zpusoydos-confirm-passr   r   TFrT  )r  r   r  r   r   r   preferencesget_effectiver   r   r   _broadcast_passr~   r   r\  rJ  )r   r  r  r   r  wants_confirms         rP   ro  PusoyDosGame._action_pass  s    ,,V4!!Q :; xxA00A5==#D $ 0 0 > >1T]]_ !? ! !+.A(LL!8LI "Q	 5)rS   c                n   U R                  U5      nU(       a  UR                  (       d  gUR                   Vs/ s H   oDR                  UR                  ;   d  M  UPM"     nn[        U5      UR                  :w  aM  U R                  UR                  5      nU(       a  UR                  OSnU R                  USUR                  US9  gU R                  X5 Vs/ s H  oDR                  PM     sn5        UR                  R                  5         U R                  U R                  5       5        gs  snf s  snf )z1Confirm card selection during card passing phase.N?pusoydos-select-cards-to-giverI   r4  )r  r   r}   r   r~   r   r   r$  r   r   r  r/  r   r  r   )r   r  r  r   r   r  r4  rnames           rP   r  !PusoyDosGame._action_confirm_give  s    &&v. vvBv!1A1A)AAvBx=AOO+..q||<I&/INNSE2!//UZ   Ah7hh78	 ""4#8#8#:; C  8s   D-D-D2
c                   U R                  U5      nU(       d  g U R                  (       d  UR                  SSS9  g U R                  U R                  5      nU(       a  UR
                  O [        R                  " UR                  S5      n[        R                  " UR                  SU R                  R                   35      n[        U R                  UR                  5      nUR                  SSUUUS9  g )Nzpusoydos-trick-emptyr   r  zunknown-playerpusoydos-combo-zpusoydos-trick-statusr   r  r  r   )r   r   r   r[  r   r   r   r  r   	type_namer   r   )r   r  r  r  trick_winnerwinner_name
combo_namer*  s           rP   r   PusoyDosGame._action_check_trick/  s    }}V$!!LL/L@,,T-A-AB!-L<3C3CDKKQa3b 	 "%%dkk_TEWEWEaEaDb3cd
t//=	# 	 	
rS   c                    [        U[        5      (       d  g U R                  U5      nU(       a0  UR                  SS[	        UR
                  UR                  5      S9  g g )Nzpusoydos-your-handr   )r   r   )r   rx   r   r   r   r}   r   )r   r  r  r  s       rP   r  PusoyDosGame._action_read_handF  sR    &.11}}V$LL$WJv{{TXT_T_<`   rS   c                V   U R                  U5      nU(       d  g / nU R                  5        HR  nUR                  U R                  ;   d  M  UR	                  UR
                   S[        UR                  5       35        MT     U(       a!  UR                  SR                  U5      5        g g )N , )
r   r   r   rG  r   r   r   r}   speakjoin)r   r  r  r  partsr   s         rP   r  %PusoyDosGame._action_read_card_countsO  s    }}V$&&(Attt+++xqQVV67 ) JJtyy'( rS   c                    U R                  U5      nU(       d  g U R                  R                  5       nUS::  a  UR                  SSS9  g UR                  SSUS9  g )Nr   zpusoydos-timer-disabledr   r  zpusoydos-timer-remaining)r   seconds)r   r   seconds_remainingr   )r   r  r  r  	remainings        rP   r  %PusoyDosGame._action_check_turn_timer\  sS    }}V$JJ002	>LL27LCLL3GYLWrS   c                   U R                   R                  UR                  5        U R                  U5        U R	                  5        Vs/ s H=  nUR                  U R                   ;  d  M  UR                  U R
                  ;   d  M;  UPM?     nnUR                  S S9  U H(  nU R                   R                  UR                  5        M*     U R                  5         gs  snf )u7   A player emptied their hand — round ends immediately.c                b    [        U R                  5      [        S U R                   5       SS94$ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frR  )r%   r?  s     rP   rA  BPusoyDosGame._player_finishes.<locals>.<lambda>.<locals>.<genexpr>u  s     7Vv!
1vs   r   )r@   )r   r}   maxr   s    rP   rQ   /PusoyDosGame._player_finishes.<locals>.<lambda>u  s#    c!&&k37Vqvv7V`a3b%crS   keyN)r   r   r   r  r   rG  sortr  )r   r  r   r  s       rP   r  PusoyDosGame._player_finishesj  s    ##FII.'
 **,
,tt4/// 45DDD<P<P4P , 	 

 	cdA  ''-  	
s   	C+CCc                    U=R                   S-  sl         U R                  [        5        U R                  R                  S;   a  U R                  SUR                  S9  gU R                  SUR                  S9  g)z"Record a round win for the player.r    )r0   r3   zpusoydos-round-winnerr
  zpusoydos-player-goes-outN)r   r  SOUND_WIN_ROUNDr   rG   r   r   r   r  s     rP   r  PusoyDosGame._player_wins_round{  sb    Q(<<!!%JJ4V[[I7LrS   c                Z   [        U R                  5      U l        U R                  R                  S:X  a  U R                  5         gU R                  R                  S:X  a  U R                  5         gU R                  R                  S:X  a  U R                  5         gU R                  5         g)z*Process end of round for either game mode.r2   r1   r3   N)	r   r   r   r   rG   _end_round_points_end_round_losses_end_round_points_elimination_end_round_elimination)r   s    rP   r  PusoyDosGame._end_round  s|    $()=)=$>!<<!!X-""$\\##x/""$\\##';;..0'')rS   c                j   U R                   (       a  U R                   S   OSnU(       a  U R                  U5      OSn/ nSnU R                  5        Hc  nUR                  U:X  a  M  U R	                  U5      nU(       a  U=R
                  U-  sl        XF-  nUR                  UR                  U45        Me     U(       aX  U(       aQ  [        S U 5       5      nSR                  S U 5       5      nU R                  SUR                  UUUR
                  S9  U R                  5         U(       ao  UR
                  U R                  R                  :  aK  U R                  [        5        U R                  SUR                  UR
                  S	9  U R!                  5         gS
U l        U R%                  5         g)z6Points mode: calculate penalties and check for winner.r   Nc              3  *   #    U  H	  u  pUv   M     g 7frR  rM   )r@  r   ptss      rP   rA  1PusoyDosGame._end_round_points.<locals>.<genexpr>  s     377s   r  c              3  4   #    U  H  u  pU S U 3v   M     g7f)z from NrM   )r@  r   r  s      rP   rA  r    s     !P94SEv"6s   zpusoydos-penalty-summary)r  	breakdowngainedtotalzpusoydos-points-winnerr  rZ   rY   )r   r$  r   r   _calculate_penaltyrZ   r   r   sumr  r   _sync_team_scoresr   r^   r  SOUND_WIN_GAMEfinish_gamer   r0  )	r   r&  r   entriesr  r   penaltyr  r  s	            rP   r  PusoyDosGame._end_round_points  sg   /3/C/CD((+	6?''	2T&&(Atty --a0G'ENNAFFG,- ) g3733F		!P!PPI*{{#ll   	  flldll&?&??OON+5fkkQWQ]Q]^% rS   c                D   U R                   (       d  SU l        U R                  5         gU R                   S   nU R                  U5      nU(       a  U=R                  S-  sl        U R                  [        5        U R                  SUR                  UR                  S9  UR                  U R                  R                  :  a6  U R                  SUR                  UR                  S9  U R                  5         gU R                  5         SU l        U R                  5         g)zSLosses mode: last-place player takes a loss. First to target losses loses the game.rY   Nr  r    zpusoydos-round-loserr  rI   zpusoydos-losses-game-over)r   r   r0  r$  r   r  SOUND_LOSE_ROUNDr   r   r   rX   r  r  )r   r'  r  s      rP   r	  PusoyDosGame._end_round_losses  s    ###)D ""$''+&&x0!#OO,-3EJJeN`N`a!!T\\%@%@@  /

%J\J\ !    " % rS   c                    U R                   (       a  U R                   S   OSnU R                  5        H`  nUR                  U:X  a  M  U R                  U5      nU=R                  U-  sl        U R                  SUR                  X2R                  S9  Mb     / nU R                  5        HT  nUR                  U R                  R                  :  d  M)  UR                  (       a  M<  SUl	        UR                  U5        MV     U H=  nU R                  [        5        U R                  SUR                  UR                  S9  M?     U R                  5       nU(       a  U R                  S[        U5      S	9  [        U5      S
::  aU  U(       a  US   OSnU(       a/  U R                  [        5        U R                  SUR                  S9  U R                  5         gU R!                  5         SU l        U R%                  5         g)zZPoints elimination: losers get points, reaching target eliminates you, last standing wins.r   Nzpusoydos-points-elim-penalty)r  r2   r  Tzpusoydos-points-elim-eliminatedr  pusoydos-players-remainingr  r    zpusoydos-points-elim-winnerr
  rY   )r   r   r   r  rZ   r   r   r   r^   r   r   r  SOUND_ELIMINATEDr   r  r  r  r   r0  )r   r&  r   r  newly_eliminatedr  r   s          rP   r
  *PusoyDosGame._end_round_points_elimination  s   /3/C/CD((+	&&(Atty --a0GGGwG.qvvgU\U\   ) &&(Aww$,,333ALLL# ''* )
 "AOO,->qvvUVU\U\] " ))+	9YPy>Q%.Yq\DF/  !>v{{ S % rS   c                   / nU R                  5        HT  nUR                  U R                  R                  :  d  M)  UR                  (       a  M<  SUl        UR                  U5        MV     U H=  nU R                  [        5        U R                  SUR                  UR                  S9  M?     U R                  5       nU(       a  U R                  S[        U5      S9  [        U5      S::  aU  U(       a  US   OSnU(       a/  U R                  [        5        U R                  S	UR                  S
9  U R                  5         gU R                  5         SU l        U R                  5         g)z<Elimination mode: check if any player reached required wins.Tzpusoydos-player-eliminatedr  r#  r  r    r   Nzpusoydos-last-playerr
  rY   )r   r   r   rV   r   r   r  r$  r   r   r   r   r  r  r   r0  )r   r%  r   r  r  s        rP   r  #PusoyDosGame._end_round_elimination  s#   &&(A||t||999!,,,# ''* )
 "AOO,-9!&&PQP\P\] " ))+	9YPy>Q$-IaL4E 01  !7

 K % rS   c                   [        UR                  5      nUS:X  a  gUnU R                  R                  nUS:X  a  SnO8US:X  a  US:  a  SnO)US:  a  SnO US	:  a  S
nOSnOUS:  a  SnOUS:  a  S
nOSnX5-  nU R                  R                  (       a3  [        S UR                   5       5      n[        U5       H  nUS
-  nM
     U$ )z>Calculate point penalty for a player based on remaining cards.r   r9   r    r8      r   rH   r      r   c              3  H   #    U  H  oR                   S :X  d  M  Sv   M     g7f)r   r    N)r   r?  s     rP   rA  2PusoyDosGame._calculate_penalty.<locals>.<genexpr>8  s     B{!ffkAA{s   "	")r   r}   r   rf   rh   r  r   )	r   r  
cards_leftbasetier
multiplierr  	twos_heldr   s	            rP   r  PusoyDosGame._calculate_penalty  s    %
?  ||((6>J\!R
r!
q

R
r!

# <<''Bv{{BBI9%1 & rS   c                f    U(       d  g U R                  U5      n[        U[        5      (       a  U$ S $ rR  )r[  r   rx   )r   r   r   s      rP   r$  PusoyDosGame._get_pusoy_playerB  s/    !!),q.11q;t;rS   c                x    [        U[        5      (       d  g UR                  (       d  UR                  (       a  g U$ rR  )r   rx   r   r   r  s     rP   r  "PusoyDosGame._require_pusoy_playerH  s+    &.11&"3"3rS   c                Z    U R                  U5      nU(       d  g U R                  U:w  a  g U$ rR  )r  rY  )r   r  r   s      rP   r  (PusoyDosGame._require_active_turn_playerO  s.    &&v.!#rS   c                `    U R                  U5      nU(       a  UR                  " U4SS0UD6  g g )Nr   r   )r   r   )r   r  r  kwargsr  s        rP   r  PusoyDosGame._send_errorW  s.    }}V$LL;;F; rS   c                N    U R                  U5      nU(       a  UR                  $ S$ )Nrs  )r   r   r   r  r  s      rP   r  PusoyDosGame._player_locale\  s!    }}V$"t{{,,rS   c                  ^ [        U[        5      (       d  U$  [        UR                  S5      S   5      m[        U4S jUR                   5       S 5      nU(       d  U$ U R                  U5      n[        X45      nTUR                  ;   a  [        R                  " USUS9$ [        R                  " USUS9$ ! [         a    Us $ f = f)Nr   r  c              3  J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frR  )r   )r@  r   r  s     rP   rA  /PusoyDosGame._get_card_label.<locals>.<genexpr>g  s     ?1ttwQQs   #	#zpusoydos-card-selected)r  zpusoydos-card-unselected)r   rx   rU   r  r  nextr}   r  r   r~   r   r  )r   r  r  r  r   r   r  s         @rP   ry  PusoyDosGame._get_card_label`  s    &.11	)//#.r23G ??F$$V,&f+++##F,D4PP(BNN  		s   B8 8CCc                   [        U[        5      (       d  U$ U R                  U5      nUR                  (       d  [        R
                  " US5      $ UR                   Vs/ s H   oDR                  UR                  ;   d  M  UPM"     nn[        XPR                  R                  S9nU(       d  [        R
                  " US5      $ [        R
                  " USUR                   35      n[        R
                  " USUS9$ s  snf )Nzpusoydos-play-noner  zpusoydos-play-invalidr  zpusoydos-play-combo)r  )r   rx   r  r~   r   r  r}   r   r"   r   rb   r  )r   r  r  r   r   r  r  r  s           rP   r  %PusoyDosGame._get_play_selected_labelq  s    &.11$$V,$$##F,@AA%{{L{!ddf6K6K.KA{Lxll>_>_`##F,CDD!%%f?P.QR
(=ZPP Ms   C= C=c                    [        U[        5      (       d  U$ U R                  U5      n[        UR                  5      nUR
                  nU R                  UR                  5      nU(       a  UR                  OSn[        R                  " USXWS9$ )Nr  r  r  )r   rx   r  r   r~   r   r$  r   r   r   r  )r   r  r  r   selected_countneededr4  r  s           rP   r  PusoyDosGame._get_give_label  s~    &.11$$V,V223%%**6+<+<=	"+	36
 	
rS   c                    [        U[        5      (       d  gUR                  (       d  g[        UR                  5      nX!R
                  :w  a  gg )Naction-not-playingr  )r   rx   r   r   r~   r   )r   r  r  s      rP   r  PusoyDosGame._is_give_enabled  s@    &.11'""'v,,-+++2rS   c                    [        U[        5      (       a  UR                  (       d  [        R                  $ [        R
                  $ rR  )r   rx   r   r   HIDDENVISIBLEr  s     rP   r  PusoyDosGame._is_give_hidden  s/    &.119L9L$$$!!!rS   c                    U R                   S:w  a  gUR                  (       a  gU R                  U:w  a  gU R                  S:  a  gg )Nr   rL  action-spectatorzaction-not-your-turnr   action-wait)r   r   rY  r   r  s     rP   _is_turn_action_enabled$PusoyDosGame._is_turn_action_enabled  sB    ;;)#'%&()!# rS   c                   U R                   S:w  d  UR                  (       a  [        R                  $ U R                  S:  a  [        R                  $ U R
                  U:w  a  [        R                  $ [        R                  $ Nr   r   )r   r   r   rO  r   rY  rP  r  s     rP   r  #PusoyDosGame._is_turn_action_hidden  sb    ;;)#v':':$$$!#$$$&($$$!!!rS   )r  c               l    U R                   S:w  a  gUR                  (       a  gU R                  S:  a  gg )Nr   rL  rS  r   rT  )r   r   r   r   r  r  s      rP   rw  $PusoyDosGame._is_card_toggle_enabled  s3     ;;)#'%!# rS   c                  U R                   S:w  d  UR                  (       a  [        R                  $ U R                  S:  a  [        R                  $ [        U[        5      (       d  [        R                  $ [        R                  $ rX  )r   r   r   rO  r   r   rx   rP  r[  s      rP   rx  #PusoyDosGame._is_card_toggle_hidden  sa    ;;)#v':':$$$!#$$$&.11$$$!!!rS   c                $    U R                  U5      $ rR  )rU  r  s     rP   r  &PusoyDosGame._is_play_selected_enabled  s    ++F33rS   c                H    U R                   (       d  gU R                  U5      $ )Nr  )r   rU  r  s     rP   r  PusoyDosGame._is_pass_enabled  s    !!-++F33rS   c                f    U R                   (       d  [        R                  $ U R                  U5      $ rR  )r   r   rO  r  r  s     rP   r  PusoyDosGame._is_pass_hidden  s(    !!$$$**622rS   c                &    U R                   S:w  a  gg Nr   rL  r   r  s     rP   r  PusoyDosGame._is_check_enabled      ;;)#'rS   c                    U R                  U5      nU(       aA  [        USS5      S:X  a0  U R                  S:X  a  [        R                  $ [        R
                  $ [        R
                  $ Nclient_typer   webr   )r   getattrr   r   rP  rO  r>  s      rP   r  PusoyDosGame._is_check_hidden  sQ    }}V$GD-4=)-	)A:%%XzGXGXX   rS   c                H    UR                   (       a  gU R                  U5      $ )NrS  )r   r  r  s     rP   r  "PusoyDosGame._is_read_hand_enabled  s    %%%f--rS   c                f    UR                   (       a  [        R                  $ U R                  U5      $ rR  )r   r   rO  r  r  s     rP   r  !PusoyDosGame._is_read_hand_hidden  s(    $$$$$V,,rS   c                   > U R                  U5      nU(       a!  [        USS5      S:X  a  [        R                  $ [        TU ]  U5      $ )Nrl  r   rm  )r   rn  r   rP  r   _is_whos_at_table_hiddenr   r  r  r   s      rP   ru  %PusoyDosGame._is_whos_at_table_hidden  s@    }}V$GD-4=%%%w/77rS   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      $ rk  )r   rn  r   r   rP  rO  r   _is_whose_turn_hiddenrv  s      rP   ry  "PusoyDosGame._is_whose_turn_hidden  sV    }}V$GD-4=)-	)A:%%XzGXGXXw,V44rS   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      $ rk  )r   rn  r   r   rP  rO  r   _is_check_scores_hiddenrv  s      rP   r|  $PusoyDosGame._is_check_scores_hidden  sV    }}V$GD-4=)-	)A:%%XzGXGXXw.v66rS   c           	        U R                    H  nU R                  U5      nU(       d  M  [        R                  " UR                  SUR
                   35      n[        UR                  UR                  5      nUR
                  S:X  a  UR                  SSUR                  US9  M  UR                  SSUR                  UUS9  M     g )Nr  singlezpusoydos-player-plays-singler   )r   r  r  zpusoydos-player-plays-combor  )
r   r   r   r  r   r  r   r   r   r   )r   r  r  r   r  r  r*  s          rP   r  PusoyDosGame._broadcast_play   s    A==#D%))$++HY7Z[J"5;;<I(*2"!;;"	   1"!;;$#   rS   c                    U R                    H8  nU R                  U5      nU(       d  M  UR                  SSUR                  S9  M:     g )Nzpusoydos-player-passesr   )r   r  )r   r   r   r   )r   r  r   r  s       rP   r  PusoyDosGame._broadcast_pass  s;    A==#DLL1'&++LV	 rS   c                &    U R                   S:w  a  gg rf  rg  r  s     rP   _is_check_scores_enabled%PusoyDosGame._is_check_scores_enabled#  ri  rS   c                $    U R                  U5      $ rR  )r  r  s     rP   !_is_check_scores_detailed_enabled.PusoyDosGame._is_check_scores_detailed_enabled(  s    ,,V44rS   c                `   U R                  U5      nU(       d  g / nU R                  R                  S:X  ak  U R                  5        H.  nUR	                  UR
                   SUR                   S35        M0     UR                  U(       a  SR                  U5      OSSS9  g U R                  R                  S:X  ak  U R                  5        H.  nUR	                  UR
                   SUR                   S	35        M0     UR                  U(       a  SR                  U5      OSSS9  g U R                  R                  S
:X  ax  [        U R                  5       S S9nU H-  nUR	                  UR
                   SUR                   35        M/     UR                  U(       a  SR                  U5      S-   OSSS9  g [        U R                  5       S S9nU H-  nUR	                  UR
                   SUR                   35        M/     UR                  U(       a  SR                  U5      S-   OSSS9  g )Nr0   : z winsz; No scores yet.r   r  r1   z lossesr3   c                    U R                   $ rR  rZ   r  s    rP   rQ   3PusoyDosGame._action_check_scores.<locals>.<lambda>9  s    AGGrS   r  z. .c                    U R                   * $ rR  r  r  s    rP   rQ   r  >  s
    QWWHrS   )r   r   rG   r   r   r   r   r  r  r   sortedrZ   )r   r  r  r  r  r   r   s          rP   _action_check_scores!PusoyDosGame._action_check_scores+  s   }}V$<<!!]2**,xr!,,u=> -JJ5tyy'6FwJW\\##x/**,xr!..)9AB -JJ5tyy'6FwJW\\##';;T224:KLGxr!''34 JJtyy'#-<LU\J]T224:LMGxr!''34 JJtyy'#-<LU\J]rS   c                   U R                  U5      nU(       d  g / nU R                  R                  S:X  aR  U R                  5        H<  nUR                  nUS:X  a  SOSnUR                  UR                   SU SU 35        M>     GOU R                  R                  S:X  aQ  U R                  5        H<  nUR                  nUS:X  a  SOSnUR                  UR                   SU SU 35        M>     OU R                  R                  S	:X  aL  [        U R                  5       S
 S9 H.  nUR                  UR                   SUR                   S35        M0     OK[        U R                  5       S S9 H.  nUR                  UR                   SUR                   S35        M0     U R                  X(       a  U5        g S/5        g )Nr0   r    winr   r  r  r1   lossr3   c                    U R                   $ rR  r  r  s    rP   rQ   <PusoyDosGame._action_check_scores_detailed.<locals>.<lambda>S  s    177rS   r  z pointsc                    U R                   * $ rR  r  r  s    rP   rQ   r  V  s
    AGG8rS   r  )r   r   rG   r   r   r   r   r   r  rZ   
status_box)	r   r  r  r  linesr   r   rB   r1   s	            rP   _action_check_scores_detailed*PusoyDosGame._action_check_scores_detailedC  s   }}V$<<!!]2**,||!%xr$q89 - \\##x/**,"(A+8xr&5':; - \\##';;D1139JKxr!''':; L D1139KLxr!''':; MG5E4FGrS   c                   U R                   R                   H
  nSUl        M     U R                   H  nU R                   R	                  UR
                  5      nU(       d  M1  [        U[        5      (       d  MH  U R                  R                  S:X  a  UR                  Ul        Mu  U R                  R                  S:X  a  UR                  Ul        M  UR                  Ul        M     g )Nr   r0   r1   )r   teamstotal_scorer   get_teamr   r   rx   r   rG   r   r   rZ   )r   teamr   s      rP   r  PusoyDosGame._sync_team_scoresZ  s    &&,,D D -A%%..qvv6Dt
1n55<<))]:'(||D$\\++x7'(~~D$'(wwD$ rS   c                   U R                    Vs/ s H  oR                  (       a  M  UPM     nnU R                  R                  S:X  a  [	        US S9nU(       a  US   OS nOU R                  R                  S:X  a  [	        US S9nU(       a  US   OS nOMU R                  R                  S:X  a  [	        US S9nU(       a  US   OS nO[	        US	 S9nU(       a  US   OS n[        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 R                  R                  U(       a  UR                  OS U(       a  UR                  /O/ U Vs0 s H  oR                  UR                   _M     snU Vs0 s H  oR                  UR"                  _M     snU Vs0 s H  oR                  UR$                  _M     snS.S9$ s  snf s  snf s  snf s  snf s  snf )Nr0   c                >    U R                   (       + U R                  * 4$ rR  )r   r   r  s    rP   rQ   0PusoyDosGame.build_game_result.<locals>.<lambda>q  s    q||;Kall]:[rS   r  r   r1   c                    U R                   $ rR  )r   r  s    rP   rQ   r  v  s    !..rS   r3   c                2    U R                   U R                  4$ rR  )r   rZ   r  s    rP   rQ   r  z  s    1<<:QrS   c                    U R                   * $ rR  r  r  s    rP   rQ   r  }  s
    177(rS   )r   player_namer   )rG   r  
winner_idsfinal_scores
final_winsfinal_losses)r  	timestampduration_ticksplayer_resultscustom_data)r   r   r   rG   r  r   r   r   now	isoformatsound_scheduler_tickr   r   r   r   replaced_humanrZ   r   r   )r   r   r   sorted_playersr   s        rP   build_game_resultPusoyDosGame.build_game_resultk  s   !\\@\!\@<<!!]2 $F0[\N*8^A&dF\\##x/ $F0HIN*8^A&dF\\##';;#F0QRN*8^A&dF#F0BCN*8^A&dFmmolln..044    A dd !88<A,<,<(<
   "\\33.4v{{$-3vyyk:@ A&Q& A=CDVvvq||3VDAG HA!7 H
 	
) A0 !BD Hs#   H+H+)AH08 H5 H: H?c                :   [         R                  " US5      /nUR                  R                  SS5      nUS:X  av  UR                  R                  S0 5      n[        UR	                  5       S SS9n[        US5       H.  u  nu  pUR                  [         R                  " US	XxU	S
95        M0     U$ US:X  au  UR                  R                  S0 5      n
[        U
R	                  5       S S9n[        US5       H.  u  nu  pUR                  [         R                  " USXxUS95        M0     U$ US:X  au  UR                  R                  S0 5      n[        UR	                  5       S S9n[        US5       H.  u  nu  pUR                  [         R                  " USXxUS95        M0     U$ UR                  R                  S0 5      n[        UR	                  5       S SS9n[        US5       H.  u  nu  pUR                  [         R                  " USXxUS95        M0     U$ )Nzgame-final-scoresrG   r0   r  c                    U S   $ Nr    rM   items    rP   rQ   0PusoyDosGame.format_end_screen.<locals>.<lambda>  s    arS   T)r   reverser    zpusoydos-line-format-wins)r   r  r   r1   r  c                    U S   $ r  rM   r  s    rP   rQ   r    s	    4PQ7rS   r  zpusoydos-line-format-losses)r   r  r1   r3   r  c                    U S   $ r  rM   r  s    rP   rQ   r        $q'rS   zpusoydos-line-format)r   r  rZ   c                    U S   $ r  rM   r  s    rP   rQ   r    r  rS   )r   r  r  r  items	enumerater   )r   resultr   r  moder  r  ir   r   r  r1   r  sorted_scoresrZ   s                  rP   format_end_screenPusoyDosGame.format_end_screen  s!   !!&*=>?!!%%k=A= ++//bAJ#J$4$4$6<PZ^_N#,^Q#?<D $$ ;!W[ $@B 7 X!--11."EL#L$6$6$8>RSN%.~q%A!>D $$ =A[a &B0 % ))!--11."EL"<#5#5#7=QRM$-mQ$? =D $$ 6QSX %@  "--11."EL"<#5#5#7=Q[_`M$-mQ$? =D $$ 6QSX %@ rS   )r   r   rY  r   r   r   r   r   r   r   r   r   r   rI  )returnrF   )r  rU   )r  r   )F)r   rF   r   rF   r   ra   r  rx   )r  r   )r  None)r  r   )r   r   r  ra   )r   r   r  r  )r&  rF   r'  rF   rI   rU   r  r  )r5  rx   r6  z	list[int]r  r  )r  rx   r  r   )r  rx   r  r   )r  r	   r  r   )r  r	   r  r  rR  )r  r	   r  r   r  r  )r  r	   r  rF   r  r  )r  rx   r  r  )r  rx   r  rU   )r   r   r  PusoyDosPlayer | None)r  r	   r  r  )r  rx   r  rF   r  r  )r  r	   r  rF   )r  r	   r  rF   r  rF   )r  r	   r  r   )r  r	   r  r   )r  r	   r  r   r  r   )r  r	   r  r   r  r   )r  'Player'r  r   )r  rx   r  r!   r  r  )r  r  r  r   )r  r  r  rF   r  r  )r  r   )r  r   r   rF   r  r   )hri   rj   rk   rl   relevant_preferencesr   r   r   ro   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r/  r   rJ  rd  r&   rp  r  r  r  r  r  r0  r  rv  rn  ro  r  r  r  r  r  r  r  r  r  r	  r
  r  r  r$  r  r  r  r  ry  r  r  r  r  rU  r  rw  rx  r  r  r  r  r  r  r  ru  ry  r|  r  r  r  r  r  r  r  r  r  rv   __classcell__)r   s   @rP   r   r      s    ::$)$$?G!?$_EG_E"&M<&"&OZ&#D9K9M4OSE3N!.AE>A E3 "'t!<OY< ',D&A)A+     $ $     2 2F0
B!H(+<#>!*(#TH7!r (**&6p-^
,F F$
Sr# =~:<&
.)X"M*%!N!2&!P!:&X<<
-O"Q$

"	" :>		,6			 QU "44
3

!.
-
8570W
5^0H./")
V( (rS   r   )I__doc__
__future__r   dataclassesr   r   r   r   r/  r   r	   r
   registryr   game_utils.actionsr   r   r   game_utils.bot_helperr   game_utils.game_resultr   r   game_utils.optionsr   r   r   r   game_utils.cardsr   r   r   r   r   game_utils.turn_timer_mixinr   game_utils.poker_timerr   messages.localizationr   server.core.ui.keybindsr   	evaluatorr!   r"   r#   r$   r%   botr&   r'   rp   rq   rm   rn   rr   rs   rt   ru   r   r  r  r   r   r  r   r  r  SOUND_YOUR_TURNr$  r;   rx   r   rM   rS   rP   <module>r     sq   # (   , , $ ? ? . > Q Q N N 9 4 1 0 X X 1 E 






	#	  N .$$<	  1 !'#  : +/#  ( 
  b
 *+ '4 *  tk t tx V  , B4 B  BrS   