
    i                       S r SSKJr  SSKrSSKJrJ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  SSKJrJrJr  SSKJrJr  SSKJr  SSKJr  SSK J!r!  SSK"J#r#  SSK$J%r%  SSK&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.  SSK/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=  SSK>J?r?  Sr@/ SQrA/ SQrB/ SQrC/ SQrDSrESrFSrGSrH\\ " S  S!\\5      5       5       rIg)"z0Phase 10 game implementation for PlayPalace v11.    )annotationsN)	dataclassfield   )GamePlayerGameOptions)register_game   )Action	ActionSet
Visibility)ActionGuardMixin)	BotHelper)CardDeckDeckFactory)
GameResultPlayerResult)PokerTurnTimer)Localization)KeybindState)Bot)User   )Phase10PlayerPhase10Options
TableGroupPhaseRequirementPHASESP10_RANK_WILDP10_RANK_SKIPEVEN_PHASES)is_wildis_skipp10_card_namep10_cards_namereq_descriptionphase_description
score_hand
score_cardvalidate_groupcan_hit_groupfind_phase_assignmentactive_phases
next_phasestarting_phase	bot_thinkzgame_ninetynine/mus.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.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_pig/roundstart.oggzgame_uno/winround.oggzgame_uno/wingame.oggzgame_pig/turn.oggc                    ^  \ rS rSr% Sr\" \S9rS\S'   \" \	S9r
S\S'   \" \S9rS\S	'   \" \S9rS
\S'   \" \S9rS\S'   SrS\S'   SrS\S'   SrS\S'   \" \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9rS#\S$'   SrS\S%'   \" \S9rS#\S&'   S'rS\S('   \" \S9r S)\S*'   Sr!S\S+'   SsU 4S, jjr"\#StS- j5       r$\#StS. j5       r%\#StS/ j5       r&\#SuS0 j5       r'\#SuS1 j5       r(SvSwS2 jjr)SxS3 jr*SxS4 jr+SyS5 jr,SzS6 jr-S{S7 jr.S|U 4S8 jjr/SsU 4S9 jjr0S}U 4S: jjr1S~SU 4S; jjjr2SsU 4S< jjr3S}S= jr4SS> jr5SS? jr6SS@ jr7SSA jr8SSB.SSC jjr9SSB.SSD jjr:SSE jr;SSF jr<SsSG jr=SsU 4SH jjr>SSI jr?SsSJ jr@SsSK jrASsSL jrBSsSM jrCSSN jrDSSO jrESSP jrFSSQ jrGSSR jrHSSS jrISST jrJSSU jrKSSV jrLSSW jrMSSX jrNSSY jrOSSZ jrPSS[ jrQSS\ jrRSS] jrSSS^ jrTSS_ jrUSS` jrVSSa jrWSSb jrXSSc jrYSSd jrZSSe jr[SSf jr\SSg jr]SSh jr^SSi jr_SSj jr`SSk jraSSl jrbSSm jrcSsSn jrdSsSo jreSsSp jrfSSq jrgSrrhU =ri$ )Phase10GameE   z7Phase 10: complete all 10 phases before your opponents.)default_factorylist[Phase10Player]playersr   optionsr   deckz
list[Card]discard_pilezlist[TableGroup]table_groupsFboolturn_has_drawnlay_down_activer   intlay_down_group_indexzlist[list[int]]lay_down_stagedz	list[int]lay_down_current
hit_activeNz
int | Nonehit_card_idskip_discard_activeskip_pending_card_iddealer_indexnext_round_wait_ticksintro_wait_ticksz	list[str]skip_targets_this_handtiebreaker_modetiebreaker_player_ids
   fixed_hands_remainingr   timer_timer_warning_playedc                0   > [         TU ]  5         SU l        g )NF)super__post_init__rS   self	__class__s    8C:\Users\dbart\PlayPalace11\server\games\phase10\game.pyrV   Phase10Game.__post_init__x   s    %*"    c                    g)NzPhase 10 clss    rZ   get_namePhase10Game.get_name   s    r\   c                    g)Nphase10r^   r_   s    rZ   get_typePhase10Game.get_type   s    r\   c                    g)Nzcategory-card-gamesr^   r_   s    rZ   get_categoryPhase10Game.get_category   s    $r\   c                    g)Nr   r^   r_   s    rZ   get_min_playersPhase10Game.get_min_players       r\   c                    g)N   r^   r_   s    rZ   get_max_playersPhase10Game.get_max_players   rm   r\   c                    [        XUS9$ )N)idnameis_bot)r   )rX   	player_idrt   ru   s       rZ   create_playerPhase10Game.create_player   s    	VDDr\   c                4    [        U[        5      (       a  U$ S $ N)
isinstancer   rX   players     rZ   _get_p10_playerPhase10Game._get_p10_player   s    #FM::vDDr\   c                |    U R                  U5      nU(       a  UR                  (       a  g U R                  U:w  a  g U$ rz   )r~   is_spectatorcurrent_player)rX   r}   ps      rZ   _require_current_player#Phase10Game._require_current_player   s4      (ANN!#r\   c                N    U R                  U5      nU(       a  UR                  $ S$ )Nen)get_userlocale)rX   r}   users      rZ   _player_localePhase10Game._player_locale   s!    }}V$"t{{,,r\   c                    U R                    Vs/ s H/  n[        U[        5      (       d  M  UR                  (       a  M-  UPM1     sn$ s  snf rz   )r9   r{   r   r   )rX   r   s     rZ   _active_playersPhase10Game._active_players   s2    <<_<a:a+GPQP^P^<___s   AAAc                    [        SS9nU$ )Nturn)rt   )r   )rX   r}   
action_sets      rZ   create_turn_action_set"Phase10Game.create_turn_action_set   s    F+
 r\   c                  > [         TU ]  U5      nU R                  U5      n[        S[        R
                  " US5      SSSS9[        S[        R
                  " US5      S	SSS
S9[        S[        R
                  " US5      SSSS
S9[        S[        R
                  " US5      SSSS9[        S[        R
                  " US5      SSSS
S9[        S[        R
                  " US5      SSSS
S9/n[        U5       Hy  nUR                  U5        UR                  UR                  ;   a%  UR                  R                  UR                  5        UR                  R                  SUR                  5        M{     U$ )N	read_handzphase10-read-hand-action_action_read_hand_is_playing_enabled_is_playing_hiddenrs   labelhandler
is_enabled	is_hiddenread_discardzphase10-read-discard-action_action_read_discardT)rs   r   r   r   r   include_spectators
read_tablezphase10-read-table-action_action_read_tablecheck_phasezphase10-check-phase-action_action_check_phaseread_countszphase10-read-counts-action_action_read_countscheck_turn_timerzphase10-turn-timer-action_action_check_turn_timerr   )rU   create_standard_action_setr   r   r   getreversedaddrs   _orderremoveinsert)rX   r}   r   r   local_actionsactionrY   s         rZ   r   &Phase10Game.create_standard_action_set   s   W7?
$$V,"&&v/IJ+0. !"&&v/LM.0.#' "&&v/JK,0.#'  "&&v/KL-0.  "&&v/KL-0.#' %"&&v/JK20.#'O/
` }-FNN6"yyJ---!!((3$$Q		2	 .
 r\   c                F  > [         TU ]  5         U R                  SSS/[        R                  S9  U R                  SSS/[        R                  S9  U R                  SS	S
/[        R                  S9  U R                  SS/ SQ[        R                  S9  U R                  SS/ SQ[        R                  S9  U R                  SSS/[        R                  S9  U R                  SSS/[        R                  S9  U R                  SSS/[        R                  SS9  U R                  SSS/[        R                  SS9  U R                  SS S!/[        R                  S9  U R                  S"S#S$/[        R                  SS9  U R                  S%S&S'/[        R                  SS9  g )(NspaceDraw	draw_deck)statedzDraw from discarddraw_discardlzLay down phaselay_down_phaseenterzConfirm group / select)confirm_groupselect_card_for_hitselect_hit_groupselect_skip_targetescapezCancel mode)cancel_lay_down
cancel_hitcancel_skiphHithitrz	Read handr   czRead discard topr   T)r   r   gzRead table groupsr   r   zCheck phase statusr   ezRead card countsr   zshift+tz
Turn timerr   )rU   setup_keybindsdefine_keybindr   ACTIVErW   s    rZ   r   Phase10Game.setup_keybinds   s    GVk],BUBUVC!4~6FlNaNabC!14D3E\M`M`aG%=  @R  Zf  Zm  Zm  	nHm5emy  nA  nA  	BC|7J7JKC{m<CVCVWC!3n5E\M`M`uyzC!4|nLL_L_txyC!5lNaNabC!3m_LL_L_txyI|6H5IQ]QdQdy}~r\   c                J   > U R                  U5        [        TU ]  " U40 UD6  g rz   )_sync_turn_actionsrU   rebuild_player_menu)rX   r}   kwargsrY   s      rZ   r   Phase10Game.rebuild_player_menu  s#    '#F5f5r\   c                N   > U R                  U5        [        TU ]  " U4SU0UD6  g )Nselection_id)r   rU   update_player_menu)rX   r}   r   r   rY   s       rZ   r   Phase10Game.update_player_menu  s(    '"6OOOr\   c                j   > U R                    H  nU R                  U5        M     [        TU ]  5         g rz   )r9   r   rU   rebuild_all_menus)rX   r}   rY   s     rZ   r   Phase10Game.rebuild_all_menus  s*    llF##F+ #!#r\   c                	   U R                  U5      nU(       d  g U R                  US5      nU(       d  g UR                  S5        UR                  S5        UR                  S5        S H  nUR                  U5        M     U R                  S:w  d  UR
                  (       a  g U R                  U:H  nU R                  U5      n[        UR                  S S9nU H.  nUR                  [        SUR                   3S	S
SSSSS95        M0     U(       d  g U R                  (       a  U R                  5        HR  n	U	R                  UR                  :w  d  M  UR                  [        SU	R                   3U	R                  SSSS95        MT     UR                  [        S[         R"                  " US5      SSSS95        g U R$                  (       a  U R&                  b  [)        U R*                  5       HU  u  pU R-                  UR.                  5      nU(       a  UR                  OSnUR                  [        SU
 3S	SSSSS95        MW     UR                  [        S[         R"                  " US5      SSSS95        g U R$                  (       a?  U R&                  c2  UR                  [        S[         R"                  " US5      SSSS95        g U R0                  (       a  U R3                  U5      n[5        U5      nU R6                  S-   nUR                  [        S[         R"                  " US UUS!9S"SSS95        UR                  [        S#[         R"                  " US$5      S%SSS95        g U R8                  (       d  UR                  [        S&[         R"                  " US'5      S(SSS95        U R:                  (       ah  [=        U R:                  S)   5      (       dJ  [?        U R:                  S)   U5      nUR                  [        S*[         R"                  " US+US,9S-SSS95        g g g UR@                  (       da  U R3                  U5      n[C        URD                  U5      nUR                  [        S.[         R"                  " US/URD                  S09S1SSS95        UR@                  (       aD  U R*                  (       a2  UR                  [        S2[         R"                  " US35      S4SSS95        g g g )5Nr   card_
hit_group_skip_target_)r   r   r   r   r   r   r   r   r   r   r   playingc                H    U R                   U R                  U R                  4$ rz   )ranksuitrs   r   s    rZ   <lambda>0Phase10Game._sync_turn_actions.<locals>.<lambda>/  s    AFFAFFADD3Ir\   key _action_card_selected_is_card_enabled_is_card_hidden_get_card_labelF)rs   r   r   r   r   	get_labelshow_in_actions_menu_action_select_skip_target_is_turn_action_enabled_is_turn_action_hiddenr   r   zphase10-skip-cancel-action_action_cancel_skip?_action_select_hit_group_get_hit_group_label)rs   r   r   r   r   r   r   zphase10-hit-cancel-action_action_cancel_hitr   r   zphase10-confirm-group-action)currenttotal_action_confirm_lay_down_groupr   zphase10-cancel-lay-down-action_action_cancel_lay_downr   zphase10-draw-deck-action_action_draw_deckrI   r   zphase10-draw-discard-actioncard_action_draw_discardr   zphase10-lay-down-actionphase_action_start_lay_downr   zphase10-hit-action_action_start_hit)#r~   get_action_setremove_by_prefixr   statusr   r   r   sortedhandr   r   rs   rG   r   rt   r   r   rE   rF   	enumerater=   get_player_by_idowner_idr@   _current_phase_reqslenrB   r?   r<   r%   r&   phase_laid_downr)   current_phase)rX   r}   r   turn_set	action_id
is_currentr   sorted_handr   otherigroupowner
owner_namereqsr   r   top_namedescs                      rZ   r   Phase10Game._sync_turn_actions  s     (&&q&1 	!!'*!!,/!!.1
I OOI&
 ;;)#q~~((A-
$$Q' QVV)IJDLL477)$/-++%*     ##--/88qtt#LL)%((4#jj <#<":"  0 LL "&&v/KL-42  ??t//;%d&7&78--enn=+0UZZc
V#A3'6864  9 LL"&&v/JK,42  ??t//7LL"&&v/JK,42  ++A.DIE//!3GLL""&&:#5 942	 	 LL$"&&v/OP142   ""LL"&&v/IJ+42    1B1B21F)G)G():):2)>GV%&**63PW_`286  *H  $$//2(&AV'&**63LTUTcTcd486    T%6%6V&**63GH/86  &7 r\   c                  ^
 U R                  U5      nU R                  U5      nU(       d  U$ [        UR                  S5      S   5      m
[	        U
4S jUR
                   5       S 5      nU(       d  U$ [        XT5      nU R                  (       ah  U R                   VVs1 s H  ow  H  oiM     M     n	nnT
U	;   a  [        R                  " USUS9$ T
U R                  ;   a  [        R                  " USUS9$ U$ s  snnf )N_rI   c              3  J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frz   rs   .0r   card_ids     rZ   	<genexpr>.Phase10Game._get_card_label.<locals>.<genexpr>       :1$$'/QQ   #	#zphase10-card-label-stagedr   zphase10-card-label-selected)r~   r   rA   splitnextr	  r&   r@   rC   r   r   rD   )rX   r}   r  r   r   r   rt   r  cid
staged_idsr$  s             @rZ   r   Phase10Game._get_card_label  s      ($$V,iooc*2./::DAT*+/+?+?Q+?%5C#5#+?JQ*$#''0KRVWW$///#''0MTXYY Rs   C9c           	        U R                  U5      n[        UR                  S5      S   5      nU[        U R                  5      :  a  U$ U R                  U   nU R                  UR                  5      nU(       a  UR                  OSn[        UR                  U5      n[        UR                  U5      n	[        R                  " USUUR                  S-   U	US9$ )Nr  rI   r   phase10-table-group-entryr   r  indexreqcards)r   rA   r)  r  r=   r  r  rt   r'   r3  r(   requirementr   r   group_index)
rX   r}   r  r   idxr  r  r  	cards_strreq_strs
             rZ   r    Phase10Game._get_hit_group_label  s    $$V,)//#&r*+#d''((!!#&%%enn5#(UZZc
"5;;7	!%"3"3V</##a'
 	
r\   c                &    U R                   S:w  a  gg Nr   zaction-not-playingr  r|   s     rZ   r   Phase10Game._is_playing_enabled      ;;)#'r\   c                b    U R                   S:X  a  [        R                  $ [        R                  $ Nr   r  r   VISIBLEHIDDENr|   s     rZ   r   Phase10Game._is_playing_hidden  $    %)[[I%=z!!T:CTCTTr\   )r  c                   U R                  U5      nU(       a  U R                  S:w  a  gUR                  (       a  gU R                  U:X  a  g gr;  )r~   r  r   r   )rX   r}   r  r   s       rZ   r   Phase10Game._is_card_enabled  sA      (DKK9,'>>'!##r\   c               "    [         R                  $ rz   r   rB  )rX   r}   r  s      rZ   r   Phase10Game._is_card_hidden  s    !!!r\   c                    g)uH   Always enabled — these actions are only added when the mode is active.Nr^   r|   s     rZ   r   #Phase10Game._is_turn_action_enabled  s    r\   c                "    [         R                  $ )uH   Always visible — these actions are only added when the mode is active.rI  r|   s     rZ   r   "Phase10Game._is_turn_action_hidden  s    !!!r\   c                   SU l         U R                  5         SU l        SU l        SU l        / U l        SU l        U R                  5       n[        U R                  R                  5      nU H  nX#l        SUl        SUl        SUl        M      SU R                  l        U R                  R#                  U Vs/ s H  o3R$                  PM     sn5        U R'                  [(        5        SU l        g s  snf )Nr   Tr   FrP   
individual   )r  _sync_table_statusgame_activeroundrN   rO   rQ   r   r1   r:   even_phases_onlyr  r  scoreskipped_team_manager	team_modesetup_teamsrt   
play_musicSOUND_MUSICrL   )rX   activespr   s       rZ   on_startPhase10Game.on_start  s    !
$%'"%'"%%'DLL99:A O %AAGAI	  (4$&&'?1'?@$ & (@s   8C1c                  > [         TU ]  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
                  S:  a6  U =R
                  S-  sl        U R
                  S:X  a  U R	                  5         g U R                  R                  5       (       a  U R                  5         U R                  5         [        R                  " U 5        g )Nr   r   )rU   on_tickrS  rL   _start_new_handrK   rR   tick_handle_turn_timeout_maybe_play_timer_warningr   rW   s    rZ   rb  Phase10Game.on_tick  s      1$!!Q&!$$)$$&%%)&&!+&))Q.$$&::??%%'&&($r\   c                    [        X5      $ rz   r2   r|   s     rZ   r3   Phase10Game.bot_think/  s    &&r\   c                   U =R                   S-  sl         / U l        / U l        SU l        SU l        / U l        / U l        SU l        S U l        SU l	        S U l
        [        R                  " 5       u  U l        n/ U l        U R                  (       a<  U R!                  5        Vs/ s H   o"R"                  U R$                  ;   d  M  UPM"     nnOU R!                  5       nU H  n/ Ul        SUl        SUl        M     [-        S5       HJ  nU HA  nU R                  R/                  5       nU(       d  M&  UR&                  R1                  U5        MC     ML     U R2                  (       a+  U R4                  S-   [7        U R2                  5      -  U l        OSU l        U R9                  USS9  U R2                  (       a*  U R4                  S-   [7        U R2                  5      -  U l        U R                  R/                  5       nU(       a  U R                  R1                  U5        U R=                  [>        R@                  " [B        5      5        U RE                  [>        R@                  " [F        5      S5        U RI                  SU R                   S9  U(       a  Sn[K        XV5      n[M        U5      (       aX  U RN                  nU(       a  URP                  OS	n	U RI                  S
U	S9  U(       a  U RS                  U5      n
U
(       a  SU
l        OU RI                  SUS9  U R=                  [T        5        U RW                  5         U RY                  5         g s  snf )Nr   FrP   r   )reset_indexzphase10-new-handrT  r   r   zphase10-start-discard-skipr}   Tzphase10-start-discardr   )-rT  r=   rM   r?   r@   rC   rD   rE   rF   rG   rH   r   phase10_deckr;   r<   rN   r   rs   rO   r	  r  rW  rangedraw_oneappendturn_player_idsrJ   r  set_turn_players
turn_index
play_soundrandomchoiceSOUND_SHUFFLEschedule_sound
SOUND_DRAWbroadcast_lr&   r%   r   rt   r~   SOUND_ROUND_STARTr   _start_turn)rX   r  r   r]  r   
start_cardr   	card_namefirst
first_name	p10_firsts              rZ   rc  Phase10Game._start_new_hand2  s   

a
&(# $$! "#( $(! #//1	1!%!5!5!7^!7A444C]C];]a!7F^F))+FAAF %AAI 
 rAyy))+4FFMM$'   !%!2!2Q!6#d>R>R:S SD !Df%8#0014D<P<P8QQDO YY'')
$$Z0m45FMM*5r:+4::>F%j9Iz""+++0UZZc
  !=j Q $ 4 4U ;I ,0	)  !8y I)* k _s   #MMc                   U R                   nU(       a  U R                  U5      OS nU(       d  g SU l        SU l        / U l        / U l        SU l        S U l        SU l        S U l	        SU l
        UR                  (       a@  SUl        U R                  U5      nU(       a  UR                  SSS9  U R                  5         g U R                  5         U R!                  USS5        UR"                  (       a*  [$        R&                  " U[(        R*                  " SS5      S	9  U R-                  US
S9  U R.                   H0  nUR0                  UR0                  :w  d  M  U R-                  U5        M2     g )NFzphase10-your-turn-skippedtablebufferzgame-your-turnzgame-turn-start   (   ticksr   position)r   r~   r?   r@   rC   rD   rE   rF   rG   rH   rS   rW  r   speak_l_advance_turn_start_turn_timerbroadcast_personal_lru   r   jolt_botrv  randintr   r9   rs   )rX   r}   r   r   r  s        rZ   r}  Phase10Game._start_turn}  s2   $$,2D  ( $$! "#( $(!%*" 99AI==#D8I  !!!%57HI88qr2(>?  Q /\\Exx144((/ "r\   c                B    U R                  SS9  U R                  5         g )NF)announce)advance_turnr}  )rX   s    rZ   r  Phase10Game._advance_turn  s    5)r\   c                z   U R                   R                  5       (       d  g[        U R                  5      S::  a#  U R	                  S5        U R                  S5        gU R                  S   nU R                  SS nU/U l        [        US9U l         U R                   R                  5         U R	                  S5        g)z2Reshuffle discard pile into deck if deck is empty.Nr   zphase10-deck-truly-emptyrI   )r3  zphase10-deck-reshuffled)r;   is_emptyr  r<   r{  
_end_roundr   shuffle)rX   toprests      rZ   _ensure_deckPhase10Game._ensure_deck  s    yy!!##t  !Q&78OOD!#  "% Et$			23r\   c           	        SU l         U(       a1  U R                  USSU R                  S9  U R                  [        5        U R                  S5        U R                  (       a<  U R                  5        Vs/ s H   o"R                  U R                  ;   d  M  UPM"     nnOU R                  5       n0 nU Hw  nX!L a  SnO[        UR                  5      nU=R                  U-  sl        XTUR                  '   X!L a  U R                  USS5        M[  U R                  US	S
XRR                  S9  My     U R                  R                  nU H  nUR                  nU R                  R                   (       aE  [#        UR$                  U5      n['        US5      Ul        U R                  USSUR$                  S9  Mo  U(       a:  [#        UR$                  U5      nXl        U R                  USSUR$                  S9  M  U R                  USSUR$                  S9  M     U HN  nUR)                  UR                  S5      nUS:  d  M'  U R*                  R-                  UR.                  U* 5        MP     U R1                  U5      (       a  g SU l         Sn	U R                  R                   (       aH  U =R2                  S-  sl        U R2                  S::  a#  U R                  S5        U R5                  U5        g Xl        g s  snf )NFzphase10-you-go-outzphase10-player-goes-outrl  zphase10-round-scoring-headerr   zphase10-you-score-zerozphase10-player-scores-zerozphase10-you-scorezphase10-player-scores)pointsr      zphase10-you-fixed-hands-advancezphase10-fixed-hands-advance)r*  zphase10-you-advancezphase10-player-advanceszphase10-you-stayzphase10-player-staysr  Td   r   zphase10-fixed-hands-over)rS  r  rT  ru  SOUND_WIN_ROUNDr{  rN   r   rs   rO   r*   r	  rV  r:   rU  r  fixed_handsr0   r  minr   rX  add_to_team_scorert   _check_game_endrQ   _resolve_winnerrK   )
rX   winnerr   r]  round_penaltiespenalty	even_onlylaid	new_phaser  s
             rZ   r  Phase10Game._end_round  s    %%f.BD]-1ZZ & 9OOO,78 !%!5!5!7^!7A444C]C];]a!7F^F))+F +-A{$QVV,GGwG$+ADD!{))!-EGcd))!-@BY29 * J  LL11	A$$D||''&q	B	"%i"4))!-NPm01 * A&q	B	"+))!-BD]01 * A ))!-?AW12 * B $ A%))!$$2G{""44QVVgXF  ''  <<##&&!+&))Q.  !;<$$V,%*"w _s   4K3K3c                   U R                   R                  nU R                   R                  n[        U5      nX$;  a  US   nU Vs/ s H  oUR                  U:  d  M  UPM     nnU(       d  g[        U5      S:X  a  US   nU R                  Xq5        g[        S U 5       5      nU Vs/ s H  oUR                  U:X  d  M  UPM     n	n[        U	5      S:X  a  U R                  U	S   U5        g[        R                  " SU	 Vs/ s H  oUR                  PM     sn5      n
U R                  SXS	9  U	 H.  nU R                  U5      nU(       d  M  UR                  S
USS9  M0     U	 H  nX%l        SUl        M     SU l        U	 Vs/ s H  oUR"                  PM     snU l        SU l        SU l        gs  snf s  snf s  snf s  snf )zTCheck whether any player has completed the target phase. Returns True if game ended.rI   Fr   r   Tc              3  8   #    U  H  oR                   v   M     g 7frz   rV  r#  r   s     rZ   r%  .Phase10Game._check_game_end.<locals>.<genexpr>  s     4A   r   zphase10-tiebreaker)r9   r  zphase10-tiebreaker-your  )r  r  P   )r:   winning_phaserU  r/   r  r  _declare_winnerr  rV  r   format_list_andrt   r{  r   r  r  rN   rs   rO   rS  rK   )rX   r]  r  r  valid_phasesr   
completersr  	min_scorer  
tied_namesr   s               rZ   r  Phase10Game._check_game_end  s   22LL11	 %Y/,(,M "(KA??]+Ja
Kz?a]F  0 444	$=*Q9(<q*=s8q=  Q0 "11$8MA8MN
-zWA==#Dt5]SZ[  A+O %A   $47%8CqddC%8"%+"G L > 9N &9s$   F/F/)F4 F4F9
F>c                    [        S U 5       5      nU Vs/ s H  o3R                  U:X  d  M  UPM     nnU R                  US   U5        gs  snf )z8Resolve winner for fixed-hands mode (lowest score wins).c              3  8   #    U  H  oR                   v   M     g 7frz   r  r  s     rZ   r%  .Phase10Game._resolve_winner.<locals>.<genexpr>7  s     0Ar  r   N)r  rV  r  )rX   r]  r  r   winnerss        rZ   r  Phase10Game._resolve_winner5  sH    000	$=f9(<1f=WQZ0 >s
   AAc                   U R                  [        5        U R                  USSUR                  S9  [	        UR
                  U Vs/ s H[  n[        UR                  UR
                  UR                  * UR                  UR                  :H  UR                  UR                  S9PM]     snS9nU R                  U5        g s  snf )Nzphase10-you-winzphase10-game-winnerr  )rv   player_namerV  	is_winnerru   is_virtual_bot)winner_namer9   )ru  SOUND_WIN_GAMEr  rV  r   rt   r   rs   ru   r  finish_game)rX   r  r]  r   results        rZ   r  Phase10Game._declare_winner;  s    '!!&*;=R)/ 	" 	7   
  A dd !77( ttvyy088#$#3#3  

 	 
s   A"B?
c                &   U R                  U5      nU(       d  g U R                  (       a  g U R                  5         U R                  (       d  g U R                  R                  5       nU(       d  g UR                  R                  U5        SU l        U R                  U5      n[        XE5      nU R                  [        R                  " [        5      5        U R                  USSUS9  U R                  5         UR                   (       a*  ["        R$                  " U[        R&                  " SS5      S9  SUR(                   3nU R+                  X7S	9  U R,                   H0  nUR(                  UR(                  :w  d  M  U R/                  U5        M2     g )
NTzphase10-you-draw-deckzphase10-player-draws-deckr      r  r  r   r   )r   r?   r  rS  r;   rp  r	  rq  r   r&   ru  rv  rw  rz  r  r  ru   r   r  r  rs   r   r9   r   )	rX   r}   r  r   r   r   r  r   r  s	            rZ   r   Phase10Game._action_draw_deckT  s4   ((0yy!!#	d"$$Q'!$/	j12!!!%<>Y(1 	" 	3 88qr2(>?twwi(=\\Exx144((/ "r\   c                   U R                  U5      nU(       d  g U R                  (       a  g U R                  (       d  g U R                  S   n[        U5      (       a*  U R	                  U5      nU(       a  UR                  S5        g U R                  R                  5       nUR                  R                  U5        SU l        U R                  U5      n[        Xg5      nU R                  [        R                  " [        5      5        U R                  USSUS9  U R!                  5         UR"                  (       a*  [$        R&                  " U[        R(                  " SS5      S	9  S
UR*                   3n	U R-                  X9S9  U R.                   H0  n
U
R*                  UR*                  :w  d  M  U R1                  U
5        M2     g )NrI   zphase10-cannot-draw-skipTzphase10-you-draw-discardzphase10-player-draws-discardr   r  r  r  r   r  )r   r?   r<   r%   r   r  popr	  rq  r   r&   ru  rv  rw  rz  r  r  ru   r   r  r  rs   r   r9   r   )rX   r}   r  r   r  r   r   r   r  r   r  s              rZ   r    Phase10Game._action_draw_discardp  s^   ((0  #3<<==#D78  $$&	d"$$Q'!$/	j12!!!%?A_(1 	" 	3 88qr2(>?twwi(=\\Exx144((/ "r\   c                  ^ U R                  U5      nU(       d  g [        UR                  S5      S   5      m[        U4S jUR                   5       S 5      nU(       d  g U R
                  (       dL  U R                  (       d;  U R                  (       d*  U R                  U5      nU(       a  UR                  S5        g U R                  (       a  U R                  X45        g U R                  (       a  U R                  c  U R                  X45        g U R                  (       a  U R                  b  U R                  X45        g U R                  (       a  g [        U5      (       a  U R                  X45        g U R!                  X45        g )Nr  rI   c              3  J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frz   r!  r"  s     rZ   r%  4Phase10Game._action_card_selected.<locals>.<genexpr>  r'  r(  phase10-must-draw-first)r   rA   r)  r*  r	  r?   r@   rE   r   r  _toggle_card_in_grouprF   _select_hit_cardrG   r%   _start_skip_discard_do_discard)rX   r}   r  r   r   r   r$  s         @rZ   r   !Phase10Game._action_card_selected  s   ((0iooc*2./::DA""4+?+?==#D67&&q/__!1!1!9!!!*__!1!1!=!!!*%% t}}((1  )r\   c           
        U R                  U5      nU(       d  g U R                  (       d*  U R                  U5      nU(       a  UR                  S5        g UR                  (       a*  U R                  U5      nU(       a  UR                  S5        g SU l        SU l        / U l        / U l        U R                  U5      nU R                  U5      n[        UR                  U5      n[        US   U5      nU R                  U5      nU(       a(  UR                  SUR                  US[        U5      USS9  U R                  USS	9  g )
Nr  zphase10-already-laid-downTr   zphase10-lay-down-startr   r  )r  descriptionr   r   r2  r  r  )r   r?   r   r  r  r@   rB   rC   rD   r  r   r)   r  r(   r  r   )	rX   r}   r  r   r   r  r   r  r2  s	            rZ   r  "Phase10Game._action_start_lay_down  s   ((0""==#D67==#D89#$%!! "''*$$Q' &9d1gv.}}QLL(oo4T	   	  Q /r\   c                x   U R                  U5      n[        X#5      nU R                  U5      nU R                  S-   nU R                   VVs1 s H  ow  H  oiM     M     n	nnUR
                  U R                  ;   a(  U R                  R                  UR
                  5        Sn
O`UR
                  U	;   a)  U R                  U5      nU(       a  UR                  SUS9  g U R                  R                  UR
                  5        Sn
UR                   Vs/ s H   oR
                  U R                  ;   d  M  UPM"     nnU(       a  [        X5      OSnU R                  U5      nU(       a+  U(       a  UR                  XUUSS9  OUR                  S	USS
9  U R                  USUR
                   3S9  g s  snnf s  snf )Nr   zphase10-lay-down-removez$phase10-lay-down-card-already-stagedr   zphase10-lay-down-addr   r  )r   r   r3  r  z phase10-lay-down-selection-empty)r   r  r   r  )r   r&   r  rB   rC   rs   rD   r   r   r  rq  r	  r'   r   )rX   r   r   r   r  r  current_numr  r+  r,  msg_keyr   r   selected_cardsr7  s                  rZ   r  !Phase10Game._toggle_card_in_group  s   $$Q'!$/	''*//!3 (,';';M';eucuc';
M77d+++!!((1/GWW
"==#DC)T!!((1,G &'VVMVttt7L7L/L!VM>LN>:RT	}}QWk$-g  ? ?]de%y0AB1 N Ns   F1F74F7c           	     P   U R                  U5      nU(       a  U R                  (       d  g U R                  U5      nX@R                     nU R	                  U5      nU R                  U5      nUR                   Vs/ s H   oR                  U R                  ;   d  M  UPM"     n	n[        5       n
U R                   H  nU
R                  U5        M     [        X5      u  pU(       d9  U(       a1  US:X  a  UR                  XR                  SS9  g UR                  USS9  g U R                  R                  [!        U R                  5      5        U R                  S-   n[#        X5      nU(       a  UR                  SXSS9  U =R                  S-  sl        / U l        U R                  [%        U5      :  a  U R'                  U5        g X@R                     n[)        UU5      nU R                  S-   nU(       a  UR                  SUU[%        U5      USS	9  U R+                  USS
9  g s  snf )Nzphase10-err-need-cardsr  )countr  r  r   z phase10-lay-down-confirmed-group)r   r3  r  zphase10-lay-down-next-group)prevr   r   r2  r  r  )r   r@   r  rB   r   r   r	  rs   rD   setrC   updater,   r  r  rq  listr'   r  _commit_lay_downr(   r   )rX   r}   r  r   r  r2  r   r   r   selectedr,  	group_idsokerr_keyr  r7  next_reqr8  next_nums                      rZ   r   *Phase10Game._action_confirm_lay_down_group  s   ((0,,''*,,-$$Q'}}Q  !vvGv!1F1F)FAvG  #u
--Ii( . %X366LL		'LJ  LLL9 	##D)>)>$?@//!3"84	LL;[jqLr!!Q&! "$$D	1!!!$ 556H%h7G0014H1$hd)"	   $$Q$3U Hs   :H#H#c                V  ^ [        5       nU R                   H  nUR                  U5        M     U R                  T5      n[	        U4S jU R
                   5       5      n[        U R                  5       Hi  u  pcTR                   Vs/ s H  owR                  U;   d  M  UPM     nnXF   n	[        TR                  XV-   U	US9n
U R
                  R                  U
5        Mk     TR                   Vs/ s H  owR                  U;  d  M  UPM     snTl        STl        SU l        / U l        / U l        SU l        U R                  T5      n[!        TR"                  U5      nU R%                  [&        R(                  " [*        5      5        U R-                  TSSTR"                  US9  [/        TR                  5      S:X  a  U R1                  T5        g	U R3                  TS
S9  U R4                   H0  nUR                  TR                  :w  d  M  U R3                  U5        M2     g	s  snf s  snf )z:Remove staged cards from hand and add groups to the table.c              3  ^   >#    U  H"  oR                   TR                  :X  d  M  S v   M$     g7f)r   N)r  rs   )r#  r   r   s     rZ   r%  /Phase10Game._commit_lay_down.<locals>.<genexpr>9  s"     J"3QzzQTT7Iqq"3   -	-)r  r5  r4  r3  TFr   zphase10-lay-down-successzphase10-player-lays-downr  r  Nr   r  )r  rC   r  r  sumr=   r
  r	  rs   r   rq  r  r@   rD   rB   r   r)   r  ru  rv  rw  SOUND_LAY_DOWNr  r  r  r   r9   )rX   r   all_staged_idsr  r  existing	group_idxr   r3  r2  tgr   r  r  s    `            rZ   r  Phase10Game._commit_lay_down1  s   #&5--I!!), . ''*J$"3"3JJ$-d.B.B$C I !<1$$)*;QE</C$0	B $$R( %D VVBVtt>'A!VB $! "$%!$$Q' &9n56!!!%?A[)*d 	" 	L qvv;!OOA  Q /\\Exx144((/ "= = Cs   H!H!0H&H&c                "   U R                  U5      nU(       a  U R                  (       d  g SU l        / U l        / U l        SU l        U R                  U5      nU R                  U5      nU(       a  UR                  SSS9  U R                  USS9  g )NFr   zphase10-lay-down-cancelr  r  r   r  )	r   r@   rC   rD   rB   r   r   r  r   )rX   r}   r  r   r   r   s         rZ   r   #Phase10Game._action_cancel_lay_down^  s    ((0,,$! "$%!$$Q'}}QLL27LC  Q /r\   c                $   U R                  U5      nU(       d  g U R                  (       d*  U R                  U5      nU(       a  UR                  S5        g UR                  (       d*  U R                  U5      nU(       a  UR                  S5        g U R
                  (       d*  U R                  U5      nU(       a  UR                  S5        g SU l        S U l        U R                  U5      nU(       a  UR                  SSS9  U R                  USS	9  g )
Nr  zphase10-hit-no-phasezphase10-hit-no-groupsTzphase10-hit-mode-startr  r  r   r  )	r   r?   r   r  r  r=   rE   rF   r   rX   r}   r  r   r   s        rZ   r  Phase10Game._action_start_hitp  s    ((0""==#D67  ==#D34  ==#D45}}QLL1'LB  Q /r\   c                    UR                   U l        U R                  U5      n[        X#5      nU R	                  U5      nU(       a  UR                  SUSS9  U R                  USS9  g )Nzphase10-hit-choose-groupr  )r   r  r   r  )rs   rF   r   r&   r   r  r   )rX   r   r   r   r  r   s         rZ   r  Phase10Game._select_hit_card  s_    77$$Q'!$/	}}QLL3)GLT  Q /r\   c           
       ^  T R                  U5      nU(       a  T R                  (       a  T R                  c  g [        UR	                  S5      S   5      nU[        T R                  5      :  a  g [        U 4S jUR                   5       S 5      nU(       d  S T l        g T R                  U   n[        Xe5      u  pxT R                  U5      n	T R                  U5      n
U(       d9  [        R                  " X5      nU
(       a  U
R                  S[        XY5      USS9  g UR                   R#                  U5        UR                  R%                  U5        T R'                  UR(                  5      nU(       a  UR*                  OSnT R-                  [.        R0                  " [2        5      5        T R5                  USS	U[        XY5      S
9  ST l        S T l        [        UR                  5      S:X  a  T R7                  U5        g T R9                  USS9  T R:                   H0  nUR<                  UR<                  :w  d  M  T R9                  U5        M2     g )Nr  rI   c              3  ^   >#    U  H"  oR                   TR                  :X  d  M  Uv   M$     g 7frz   )rs   rF   r#  r   rX   s     rZ   r%  7Phase10Game._action_select_hit_group.<locals>.<genexpr>  s"     C1$$$2B2B*BQQr  zphase10-hit-invalidr  )r   reasonr  r   zphase10-hit-successzphase10-player-hits)targetr   Fr   r   r  )r   rE   rF   rA   r)  r  r=   r*  r	  r-   r   r   r   r   r  r&   r3  rq  r   r  r  rt   ru  rv  rw  SOUND_DISCARDr  r  r   r9   rs   )rX   r}   r  r   r  r   r  r  
reason_keyr   r   r  r  r  r  s   `              rZ   r   $Phase10Game._action_select_hit_group  s   ((04+;+;+C	,R01	D--..CCTJ#D!!),&u3$$Q'}}Q!%%f9F2t9T%+G  = 	4 	d%%enn5#(UZZc
m45!!!%:<Q*4(5d(C 	" 	E  qvv;!OOA  Q /\\Exx144((/ "r\   c                    U R                  U5      nU(       d  g SU l        S U l        U R                  U5      nU(       a  UR	                  SSS9  U R                  USS9  g )NFzphase10-hit-cancelledr  r  r   r  )r   rE   rF   r   r  r   r  s        rZ   r   Phase10Game._action_cancel_hit  s\    ((0}}QLL0LA  Q /r\   c           	        UR                   R                  U5        U R                  R                  U5        U R	                  U5      nU R                  [        R                  " [        5      5        U R                  USS[        X#5      S9  [        UR                   5      S:X  a  U R                  U5        gU R                  5         g)z)Discard a non-Skip card and end the turn.zphase10-you-discardzphase10-player-discardsr   r   N)r	  r   r<   rq  r   ru  rv  rw  r  r  r&   r  r  r  )rX   r   r   r   s       rZ   r  Phase10Game._do_discard  s    	d  &$$Q'm45!!!%:<U(5d(C 	" 	E qvv;!OOAr\   c                    SU l         UR                  U l        U R                  U5      nU(       a  UR	                  SSS9  U R                  USS9  g )NTzphase10-skip-choose-targetr  r  r   r  )rG   rs   rH   r   r  r   )rX   r   r   r   s       rZ   r  Phase10Game._start_skip_discard  sK    #' $(GG!}}QLL5gLF  Q /r\   c                  ^  T R                  U5      nU(       a  T R                  (       d  g UR                  SS5      S   nT R                  T R	                  U5      5      nU(       a  UR
                  UR
                  :X  a*  T R                  U5      nU(       a  UR                  S5        g UR
                  T R                  ;   a3  T R                  U5      nU(       a  UR                  SUR                  S9  g [        U 4S jUR                   5       S 5      nU(       d  ST l        S T l        g S	Ul        T R                  R                  UR
                  5        UR                  R                  U5        T R                   R                  U5        T R#                  U5      nT R%                  [&        R(                  " [*        5      5        T R-                  US
SUR                  S9  T R                  U5      n	U	(       a  U	R                  SUR                  SS9  ST l        S T l        [/        UR                  5      S:X  a  T R1                  U5        g T R3                  5         g )Nr  r   rI   zphase10-skip-selfzphase10-skip-already-usedrm  c              3  ^   >#    U  H"  oR                   TR                  :X  d  M  Uv   M$     g 7frz   )rs   rH   r
  s     rZ   r%  9Phase10Game._action_select_skip_target.<locals>.<genexpr>  s"     QVttt7P7P/P!!Vr  FTzphase10-skip-playedzphase10-player-skips)r  zphase10-you-are-skippedr  )skipping_playerr  r   )r   rG   r)  r~   r  rs   r   r  rM   rt   r*  r	  rH   rW  rq  r   r<   r   ru  rv  rw  r  r  r  r  r  )
rX   r}   r  r   	target_idr  r   	skip_cardr   target_users
   `         rZ   r   &Phase10Game._action_select_skip_target  s   ((000OOC+B/	%%d&;&;I&FGadd*==#D0199333==#D8M QQVVQSWX	',D$(,D% ##**6995	i   +$$Q'm45!!!%:<R*0++ 	" 	7 mmF+ 9166Zab#( $(!qvv;!OOAr\   c                    U R                  U5      nU(       a  U R                  (       d  g SU l        S U l        U R                  U5      nU(       a  UR	                  SSS9  U R                  USS9  g )NFzphase10-skip-cancelledr  r  r   r  )r   rG   rH   r   r  r   r  s        rZ   r   Phase10Game._action_cancel_skip!  se    ((000#( $(!}}QLL1'LB  Q /r\   c                (   U R                  U5      nU(       a  UR                  (       a  g U R                  U5      nU(       d  g UR                  n[	        [        UR                  S S9U5      nUR                  S[        UR                  5      US9  g )Nc                2    U R                   U R                  4$ rz   )r   r   r   s    rZ   r   /Phase10Game._action_read_hand.<locals>.<lambda>8  s    @Pr\   r   zphase10-hand-contents)r  r3  )	r~   r   r   r   r'   r  r	  r  r  )rX   r}   r  r   r   r   r7  s          rZ   r   Phase10Game._action_read_hand0  so      (ANN}}Q"6!&&6P#QSYZ	,CKyQr\   c                    U R                  U5      nU(       d  g UR                  nU R                  (       d  UR                  S5        g [	        U R                  S   U5      nUR                  SUS9  g )Nzphase10-no-discardrI   zphase10-top-discardr   )r   r   r<   r  r&   )rX   r}   r  r   r   r  s         rZ   r    Phase10Game._action_read_discard;  s]    }}V$  LL-.%d&7&7&;VDILL.YL?r\   c                *   U R                  U5      nU(       d  g UR                  nU R                  (       d  UR                  S5        g [        R
                  " US5      /nU R                   H  nU R                  UR                  5      nU(       a  UR                  OSn[        UR                  U5      n	[        UR                  U5      n
UR                  [        R
                  " USXR                  S-   XS95        M     U R                  X5        g )Nzphase10-no-table-groupszphase10-table-group-headerr   r/  r   r0  )r   r   r=   r  r   r   r  r  rt   r'   r3  r(   r4  rq  r5  
status_box)rX   r}   r  r   r   linesr  r  r  r7  r8  s              rZ   r   Phase10Game._action_read_tableF  s    }}V$  LL23(,,V5QRS&&E))%..9E',#J&u{{F;I%e&7&7@GLL))3 (9(9A(=  ' 	&r\   c                \   U R                  U5      nU(       a  UR                  (       a  g U R                  U5      nU(       d  g UR                  nUR                  (       a  UR                  SUR                  S9  g [        UR                  U5      nUR                  SUR                  US9  g )Nzphase10-your-phase-laid-downr  zphase10-your-phaser  )r~   r   r   r   r  r  r  r)   )rX   r}   r  r   r   r   r  s          rZ   r   Phase10Game._action_check_phase[  s      (ANN}}QLL7qLO$Q__f=DLL-Q__RVLWr\   c                (   U R                  U5      nU(       d  g UR                  n/ nU R                  5        HF  nUR                  [        R
                  " USUR                  [        UR                  5      S95        MH     U R                  X5        g )Nzphase10-player-hand-count)r}   r  )
r   r   r   rq  r   r   rt   r  r	  r(  rX   r}   r  r   r   r)  r   s          rZ   r   Phase10Game._action_read_countsi  sv    }}V$%%'ALL))&2M23&&AFFM N ( 	&r\   c                    U R                  U5      nU(       d  g U R                  R                  5       nUS:  a  UR                  SUS9  g UR                  S5        g )Nr   zpoker-timer-remaining)secondszpoker-timer-unlimited)r   rR   seconds_remainingr  )rX   r}   r  r   	remainings        rZ   r   $Phase10Game._action_check_turn_timert  sM    }}V$JJ002	q=LL0)LDLL01r\   c                   U R                  U5      nU(       d  g UR                  n[        R                  " US5      /n[	        U R                  5       S S9 H^  n[        UR                  U5      nUR                  [        R                  " USUR                  UR                  UR                  S95        M`     UR                  SR                  U5      5        g )Nphase10-score-headerc                    U R                   $ rz   r  xs    rZ   r   2Phase10Game._action_check_scores.<locals>.<lambda>      aggr\   r   phase10-score-entryr}   r  rV  z; )r   r   r   r   r  r   r)   r  rq  rt   rV  speakjoin)rX   r}   r  r   r   r)  r   r  s           rZ   _action_check_scores Phase10Game._action_check_scores  s    }}V$!!&*@AB,,.4EFA$Q__f=DLL))-vvQ__AGG  G 	

499U#$r\   c                j   U R                  U5      nU(       d  g UR                  n[        R                  " US5      /n[	        U R                  5       S S9 HH  nUR                  [        R                  " USUR                  UR                  UR                  S95        MJ     U R                  X5        g )Nr6  c                    U R                   $ rz   r  r8  s    rZ   r   ;Phase10Game._action_check_scores_detailed.<locals>.<lambda>  r;  r\   r   r<  r=  )r   r   r   r   r  r   rq  rt   r  rV  r(  r.  s          rZ   _action_check_scores_detailed)Phase10Game._action_check_scores_detailed  s    }}V$!!&*@AB,,.4EFALL))-vvQ__AGG  G
 	&r\   c                &    U R                   S:w  a  gg r;  r<  r|   s     rZ   _is_check_scores_enabled$Phase10Game._is_check_scores_enabled  r>  r\   c                b    U R                   S:X  a  [        R                  $ [        R                  $ r@  rA  r|   s     rZ   _is_check_scores_hidden#Phase10Game._is_check_scores_hidden  rE  r\   c                &    U R                   S:w  a  gg r;  r<  r|   s     rZ   !_is_check_scores_detailed_enabled-Phase10Game._is_check_scores_detailed_enabled  r>  r\   c                b    U R                   S:X  a  [        R                  $ [        R                  $ r@  rA  r|   s     rZ    _is_check_scores_detailed_hidden,Phase10Game._is_check_scores_detailed_hidden  rE  r\   c                     [        U R                  R                  5      nUS::  a  U R                  R                  5         g U R                  R                  U5        SU l        g ! [         a    Sn NRf = f)Nr   F)rA   r:   
turn_timer
ValueErrorrR   clearstartrS   rX   r1  s     rZ   r  Phase10Game._start_turn_timer  sg    	$,,112G a<JJ

!%*"  	G	s   A% %A43A4c                    [        U R                  R                  5      nUS:  d  U R                  (       a  g U R
                  R                  5       S:X  a  SU l        U R                  S5        g g ! [         a    Sn N^f = f)Nr         Tzgame_crazyeights/fivesec.ogg)rA   r:   rT  rU  rS   rR   r2  ru  rX  s     rZ   rf  %Phase10Game._maybe_play_timer_warning  st    	$,,112G R<455::'')Q.)-D&OO:; /	  	G	s   A1 1B ?B c                    U R                   nU(       a  U R                  U5      OS nU(       d  g [        X5      nU(       a  U R                  X#5        g g rz   )r   r~   r3   execute_action)rX   r}   r   r  s       rZ   re   Phase10Game._handle_turn_timeout  sG    $$,2D  (d&	- r\   c                r    UR                   S-
  nSUs=::  a  [        [        5      :  a   [        U   $   / $ / $ )z;Return the requirement list for the player's current phase.r   r   )r  r  r    )rX   r   r6  s      rZ   r  Phase10Game._current_phase_reqs  s9    oo!!c&k!#; "	r	r\   )rS   rJ   r;   r<   rQ   rS  rE   rF   rL   r@   rD   rB   rC   rK   rT  rG   rH   rM   r  r=   rN   rO   r?   rt  )returnNone)rc  str)rc  rA   )F)rv   re  rt   re  ru   r>   rc  r   )r}   r   rc  Phase10Player | None)r}   r   rc  re  )rc  r8   )r}   r   rc  r   )r}   r   rc  r   )r}   r   rc  rd  rz   )r}   r   r   
str | Nonerc  rd  )r}   r   r  re  rc  re  )r}   r   rc  rg  )r}   r   rc  r   )r}   r   r  rg  rc  rg  )r}   r   r  rg  rc  r   )r}   r   rc  rg  )r  rf  rc  rd  )r]  r8   rc  r>   )r]  r8   rc  rd  )r  r   r]  r8   rc  rd  )r}   r   r  re  rc  rd  )r   r   r   r   rc  rd  )r   r   rc  rd  )r   r   rc  zlist[PhaseRequirement])j__name__
__module____qualname____firstlineno____doc__r   r  r9   __annotations__r   r:   r   r;   r<   r=   r?   r@   rB   rC   rD   rE   rF   rG   rH   rJ   rK   rL   rM   rN   rO   rQ   r   rR   rS   rV   classmethodra   re   rh   rk   rp   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_  rb  r3   rc  r}  r  r  r  r  r  r  r   r   r   r  r  r   r  r   r  r  r   r   r  r  r   r   r   r   r   r   r   r   r@  rE  rH  rK  rN  rQ  r  rf  re  r  __static_attributes____classcell__)rY   s   @rZ   r5   r5   E   s    B#(#>G >#NCG^C t,D$,$T:L*: &+4%@L"@ !ND  "OT! !#!',T'BO_B"'"=i= J"K" !&%'+*+ L#!"3"c ).d(CIC "OT!',T'B9B "$3# ".AE>A"'4'+     % %    EE-`8t,6P P$
_J$
,
U KO $ JN ""'. ,'IV$0L4&H+T/b1!2080F*H 0DCB54n+0Z0$060.0`	0&01f	0	R	@'*X	'2%'
U
U	+	<. r\   r5   )Jrl  
__future__r   rv  dataclassesr   r   baser   r   r	   registryr
   game_utils.actionsr   r   r   game_utils.action_guard_mixinr   game_utils.bot_helperr   game_utils.cardsr   r   r   game_utils.game_resultr   r   game_utils.poker_timerr   messages.localizationr   server.core.ui.keybindsr   server.core.users.botr   server.core.users.baser   r   r   r   r   r   r    r!   r"   r#   	evaluatorr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   botr3   r\  rx  rz  r  r  r|  r  r  
SOUND_TURNr5   r^   r\   rZ   <module>r     s    6 "  ( , , $ ? ? = . 7 7 > 4 1 0 % '	 	 	      (am
aY- )' 
 
R$( R  Rr\   