
    Iis                        S r SSKJrJr  SSKJr  SSKrSSKJrJr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  S
SK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 J!r!  S
SK"J#r#J$r$  S
SK%J&r&  SSK'J(r(  / SQr)/ SQr*\)\*-   r+SSSSSSSSSSS S!S"S#.r,SSS
S$S%S&S.r-S'\.\/   S(\0S)\/4S* jr1S'\.\/   S)\24S+ jr3S)\4\0\/S-  4   4S, jr5\ " S- S.\5      5       r6\ " S/ S0\	5      5       r7\\ " S1 S2\\\5      5       5       r8S3\04S4 jr9S3\04S5 jr:S3\04S6 jr;\+ H?  r<\=" \8S7\< S83\9" \<5      5        \=" \8S7\< S93\:" \<5      5        \=" \8S:\< S;3\;" \<5      5        MA     g)<z
Yahtzee Game Implementation for PlayPalace v11.

Classic dice game: roll 5 dice up to 3 times per turn, then score in one of 13 categories.
Fill all categories to complete the game. Highest total score wins.
    )	dataclassfield)datetimeN   )GamePlayerGameOptions)register_game   )	bot_think   )ActionGuardMixin)Action	ActionSet
Visibility)	BotHelper)DiceSet
count_dicehas_consecutive_runhas_full_househas_n_of_a_kind)DiceGameMixin)
GameResultPlayerResult)	IntOptionoption_field)Localization)KeybindState)onestwosthreesfoursfivessixes)
three_kind	four_kind
full_housesmall_straightlarge_straightyahtzeechancezyahtzee-category-oneszyahtzee-category-twoszyahtzee-category-threeszyahtzee-category-fourszyahtzee-category-fiveszyahtzee-category-sixeszyahtzee-category-three-kindzyahtzee-category-four-kindzyahtzee-category-full-housezyahtzee-category-small-straightzyahtzee-category-large-straightzyahtzee-category-yahtzeezyahtzee-category-chance)r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+            dicecategoryreturnc                    U (       a  [        U 5      S:w  a  g[        U 5      n[        U 5      nU[        ;   a  [        U   nX$   U-  $ US:X  a  [	        US5      (       a  U$ gUS:X  a  [	        US5      (       a  U$ gUS:X  a  [        USS	9(       a  g
gUS:X  a  [        USSSS9(       a  ggUS:X  a  [        USSSSS9(       a  ggUS:X  a  [	        US5      (       a  ggUS:X  a  U$ g)z2Calculate the score for a category given the dice.r-   r   r%   r   r&   r,   r'   T)allow_five_kind   r(   r   r.   )length	min_value	max_value   r)   )r5   r6   r7   require_unique(   r*   2   r+   )lenr   sumUPPER_VALUESr   r   r   )r/   r0   countsdice_sumtargets        8c:\Users\dbart\PlayPalace11\server\games\yahtzee\game.pycalculate_scorerC   I   s   3t9>F4yH <h'~&& <61%%O ;61%%O <&$7 ##va1J ##va1Z^_ 961%% 8    c                 P    [        U 5      S:w  a  g[        [        U 5      5      S:H  $ )z*Check if dice are a Yahtzee (5 of a kind).r-   Fr   )r<   setr/   s    rB   
is_yahtzeerH      s#    
4yA~s4y>QrD   c                  :    [          V s0 s H  o S_M     sn $ s  sn f )z7Create default scoresheet with all categories unfilled.N)ALL_CATEGORIES)cats    rB   _default_scoresrL      s    !/0#I000s   c                       \ rS rSr% Sr\" S S9r\\S'   Sr	\
\S'   \" \S9r\\\
S-  4   \S	'   S
r\
\S'   Sr\\S'   S\
4S jrS\
4S jrS\\   4S jrS\4S jrSrg)YahtzeePlayer   zPlayer state for Yahtzee game.c                      [        SSS9$ )Nr-   r.   )num_dicesides)r    rD   rB   <lambda>YahtzeePlayer.<lambda>   s    '1A2NrD   default_factoryr/   r   
rolls_leftNscoresr   yahtzee_bonus_countFupper_bonus_awardedr1   c                 6   ^  [        U 4S j[         5       5      $ )z"Get total of upper section scores.c              3      >#    U  HG  nTR                   R                  U5      c  M!  TR                   R                  U5      =(       d    Sv   MI     g 7f)Nr   rY   get.0rK   selfs     rB   	<genexpr>0YahtzeePlayer.get_upper_total.<locals>.<genexpr>   s?      
'{{s# &DKKOOC %A%'s
    A+A)r=   UPPER_CATEGORIESrb   s   `rB   get_upper_totalYahtzeePlayer.get_upper_total   s     
'
 
 	
rD   c                     [        S U R                  R                  5        5       5      nU R                  (       a  US-  nXR                  S-  -  nU$ )z"Get total score including bonuses.c              3   .   #    U  H  oc  M  Uv   M     g 7fNrS   )ra   ss     rB   rc   0YahtzeePlayer.get_total_score.<locals>.<genexpr>   s     E3!AA3s   	#   d   )r=   rY   valuesr[   rZ   )rb   totals     rB   get_total_scoreYahtzeePlayer.get_total_score   sI    Et{{113EE##RKE))C//rD   c                 t    [          Vs/ s H"  oR                  R                  U5      b  M   UPM$     sn$ s  snf )z&Get list of categories not yet filled.)rJ   rY   r_   )rb   rK   s     rB   get_open_categories!YahtzeePlayer.get_open_categories   s'    -N~1E~NNNs   55c                 6   ^  [        U 4S j[         5       5      $ )z#Check if all categories are filled.c              3   ^   >#    U  H"  nTR                   R                  U5      S Lv   M$     g 7frk   r^   r`   s     rB   rc   7YahtzeePlayer.is_scoresheet_complete.<locals>.<genexpr>   s#     N~4;;??3't3~   *-)allrJ   rf   s   `rB   is_scoresheet_complete$YahtzeePlayer.is_scoresheet_complete   s    N~NNNrD   rS   )__name__
__module____qualname____firstlineno____doc__r   r/   r   __annotations__rX   intrL   rY   dictstrrZ   r[   boolrg   rr   listru   r|   __static_attributes__rS   rD   rB   rN   rN      s    ( *NOD'OJ %*/$JFDcDj!J  !  %%
 
 OT#Y OO OrD   rN   c                   H    \ rS rSr% Sr\" \" SSSSSSSS	95      r\\	S
'   Sr
g)YahtzeeOptions   zOptions for Yahtzee game.r   
   roundszyahtzee-set-roundszyahtzee-enter-roundszyahtzee-option-changed-rounds)defaultmin_valmax_val	value_keylabelprompt
change_msg	num_gamesrS   N)r~   r   r   r   r   r   r   r   r   r   r   rS   rD   rB   r   r      s3    #!&)6	

Is 
rD   r   c            	         ^  \ rS rSr% SrSS/r\" \S9r\\	   \
S'   \" \S9r\\
S'   Sr\\
S	'   Sr\\
S
'   \S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rS5S\S\S\S\	4S jjrS\	S\4S jrS6U 4S jjrS\S\S-  4S jrS\S\4S jrS\S\S\4S jr S\S\S\S-  4S jr!S\S\S\4S jr"S\S\S-  4S  jr#S\S\4S! jr$S\S\S-  4S" jr%S\S\4S# jr&S\S\SS4S$ jr'S\S\SS4S% jr(S\S\SS4S& jr)S\S\SS4S' jr*S6S( jr+S\	SS4S) jr,S6S* jr-S6S+ jr.S6S, jr/S6S- jr0S\14S. jr2S/\1S0\S\\   4S1 jr3S6U 4S2 jjr4S\	S\S-  4S3 jr5S4r6U =r7$ )7YahtzeeGame   a  
Yahtzee dice game.

Players take turns rolling 5 dice up to 3 times, keeping dice between rolls.
After rolling, they must score in one of 13 categories. Each category can
only be used once. The game ends when all players have filled all categories.
Highest total score wins.
clear_kept_on_rolldice_keeping_stylerV   playersoptionsr   current_gamegames_playedr1   c                     g)NYahtzeerS   clss    rB   get_nameYahtzeeGame.get_name       rD   c                     g)Nr*   rS   r   s    rB   get_typeYahtzeeGame.get_type   r   rD   c                     g)Nzcategory-dice-gamesrS   r   s    rB   get_categoryYahtzeeGame.get_category   s    $rD   c                     g)Nr   rS   r   s    rB   get_min_playersYahtzeeGame.get_min_players       rD   c                     g)Nr,   rS   r   s    rB   get_max_playersYahtzeeGame.get_max_players   r   rD   	player_idnameis_botc                     [        XUS9$ )z0Create a new player with Yahtzee-specific state.)idr   r   )rN   )rb   r   r   r   s       rB   create_playerYahtzeeGame.create_player   s    	VDDrD   playerc                 d   U R                  U5      nU(       a  UR                  OSn[        SS9nU R                  U5        UR	                  [        S[        R                  " US5      SSSS	S
95        [         HQ  n[        R                  " U[        U   5      nUR	                  [        SU 3U S3SSU S3SU S3SU S3SS95        MS     UR	                  [        S[        R                  " US5      SSSS95        UR	                  [        S[        R                  " US5      SSSS95        U$ ) z(Create the turn action set for a player.enturn)r   rollyahtzee-roll-all_action_roll_is_roll_enabled_is_roll_hidden_get_roll_label)r   r   handler
is_enabled	is_hidden	get_labelscore_z (- points)_action_score
_is_score__enabled_hidden_get_score__labelF)r   r   r   r   r   r   show_in_actions_menu	view_dicezyahtzee-view-dice_action_view_dice_is_view_dice_enabled_is_view_dice_hidden)r   r   r   r   r   view_scoresheetzyahtzee-check-scoresheet_action_view_scoresheet_is_view_scoresheet_enabled_is_view_scoresheet_hidden)
get_userlocaler   add_dice_toggle_actionsaddr   r   r_   rJ   CATEGORY_NAMES)rb   r   userr   
action_setrK   cat_names          rB   create_turn_action_set"YahtzeeGame.create_turn_action_set   sO   }}V$ $$F+
 	$$Z0 	"&&v/AB&-++		
 "C#''s0CDHNNu~%Jk2+!+C59 *3%w7 +C57).
 " 	"&&v/BC+20	
 	$"&&v/IJ186	
 rD   Nc                   > [         TU ]  5         U R                  SSS/[        R                  S9  U R                  5         U R                  SSS/[        R                  S9  U R                  SS	S
/[        R                  S9  g)z!Define all keybinds for the game.rz	Roll dicer   )statedz	View dicer   czView scoresheetr   N)supersetup_keybindsdefine_keybindr   ACTIVEsetup_dice_keybindsrb   	__class__s    rB   r   YahtzeeGame.setup_keybinds0  s      	Cvhl>Q>QR 	  " 	C{m<CVCVWC!25F4G|ObObcrD   c                     U R                  U5      nU(       a  U$ UnUR                  S::  a  gUR                  R                  (       a  UR                  R                  (       a  gg)z Check if roll action is enabled.r   yahtzee-no-rolls-leftzaction-not-availableN)guard_turn_action_enabledrX   r/   
has_rolledall_decided)rb   r   error
ytz_players       rB   r   YahtzeeGame._is_roll_enabledB  sO    ..v6L$*
  A%*??%%*//*E*E)rD   c                     UnUR                   R                  =(       a    UR                   R                  (       + nU R                  XR                  S:  =(       a    US9$ )zCheck if roll action is hidden.r   extra_condition)r/   r   r   turn_action_visibilityrX   )rb   r   r   
can_rerolls       rB   r   YahtzeeGame._is_roll_hiddenN  sS    $*
$//44T9T9TU
**$9$9A$=$L* + 
 	
rD   	action_idc                     U R                  U5      nU(       a  UR                  OSnUnUR                  R                  (       a   [        R
                  " USUR                  S9$ [        R
                  " US5      $ )z"Get dynamic label for roll action.r   zyahtzee-rollcountr   )r   r   r/   r   r   r_   rX   )rb   r   r   r   r   r   s         rB   r   YahtzeeGame._get_roll_labelV  s^    }}V$ $$$*
??%%##FN*BWBWXX(:;;rD   	die_indexc                     U R                  U5      nU(       a  U$ UnUR                  R                  (       d  gUR                  S::  a  gg)zHCheck if toggling die at index is enabled (override from DiceGameMixin).zdice-not-rolledr   r   N)r   r/   r   rX   )rb   r   r  r   r   s        rB   _is_dice_toggle_enabled#YahtzeeGame._is_dice_toggle_enabled_  sC    ..v6L$*
))$  A%*rD   c                 |    UnUR                   R                  =(       a    UR                  S:  nU R                  XS9$ )zCCheck if die toggle action is hidden (override from DiceGameMixin).r   r   )r/   r   rX   r   )rb   r   r  r   r   s        rB   _is_dice_toggle_hidden"YahtzeeGame._is_dice_toggle_hiddenk  s;    $*
$//44R9N9NQR9R**6*SSrD   c                 "    U R                  5       $ )z%Check if view dice action is enabled.guard_game_activerb   r   s     rB   r   !YahtzeeGame._is_view_dice_enabledq      %%''rD   c                 "    [         R                  $ )z4View dice is always hidden from menu (keybind only).r   HIDDENr  s     rB   r    YahtzeeGame._is_view_dice_hiddenu         rD   c                 "    U R                  5       $ )z+Check if view scoresheet action is enabled.r  r  s     rB   r   'YahtzeeGame._is_view_scoresheet_enabledy  r  rD   c                 "    [         R                  $ )z:View scoresheet is always hidden from menu (keybind only).r  r  s     rB   r   &YahtzeeGame._is_view_scoresheet_hidden}  r  rD   c                   ^ UmTR                   S::  a  gTR                  R                  n[        TR                  R                  5      n[        TR                  R
                  5      nU(       a>  [        TR                  R                  5       Vs/ s H  nXd;  d  M
  Xe;  d  M  UPM     nnO([        [        TR                  R                  5      5      nU R                  S5        U R                  U5      nU(       a(  UR                  R                  SU R                  5       S9OSn	TR                  R                  SU	S9  U R                  T5        T=R                   S	-  sl         S
R!                  U4S jU 5       5      n
U R#                  USSU
TR                   S9  TR                   S:X  a)  U R                  U5      nU(       a  UR%                  S5        UR&                  (       a*  [(        R*                  " U[,        R.                  " SS5      S9  U R1                  5         TR                   S:  a  U R3                  USS9  ggs  snf )zHandle roll action.r   Nzgame_pig/roll.oggr   )	game_typeTF)	lock_kept
clear_keptr   , c              3   h   >#    U  H'  n[        TR                  R                  U   5      v   M)     g 7frk   )r   r/   rp   )ra   ir   s     rB   rc   +YahtzeeGame._action_roll.<locals>.<genexpr>  s(     T^S!7!7!:;;^s   /2zyahtzee-you-rolledzyahtzee-player-rolled)r/   	remainingzyahtzee-choose-category   r4   tickstoggle_die_0)selection_id)rX   r/   r   rF   lockedkeptrangerQ   r   
play_soundr   preferencesget_effectiver   r   _apply_dice_values_defaultsjoinbroadcast_personal_lspeak_lr   r   jolt_botrandomrandintrebuild_all_menusupdate_player_menu)rb   r   r   
had_rolledlocked_beforekept_beforer  rolled_indicesr   r  dice_strr   s              @rB   r   YahtzeeGame._action_roll  s    $*
  A%__//
JOO223*//../ z7788A) ./.B 8  N "%
(@(@"ABN 	+,
 }}V$  **+?4==?*[ 	
 	uD((4" 99T^TT!! # ++ 	" 	
   A%==(D67 ==vV^^B-CD   1$##F#H %[s   	II%Ic                   ^ UmUR                  SS5      nU[        ;  a  gTR                  R                  U5      b  g[	        TR
                  R                  U5      nSn[        TR
                  R                  5      (       a6  TR                  R                  S5      S:X  a  T=R                  S-  sl        SnUTR                  U'   U R                  U5      nU(       a  UR                  OS	n[        R                  " U[        U   5      nU R                  S
5        U R                  USSUUS9  U R                  R!                  UR"                  U5        U(       aJ  U R                  S5        U R                  USS5        U R                  R!                  UR"                  S5        TR$                  (       d  ['        U4S j[(         5       5      n	U	(       ay  TR+                  5       n
U
S:  aQ  STl        U R                  S5        U R                  USSU
S9  U R                  R!                  UR"                  S5        OU R                  USSU
S9  U R-                  5         g)zHandle scoring in a category.r    NFr*   r;   r   Tr   zgame_pig/bank.oggzyahtzee-you-scoredzyahtzee-player-scored)pointsr0   zgame_farkle/6kind.oggzyahtzee-you-bonuszyahtzee-player-bonusro   c              3   ^   >#    U  H"  nTR                   R                  U5      S Lv   M$     g 7frk   r^   )ra   rK   r   s     rB   rc   ,YahtzeeGame._action_score.<locals>.<genexpr>  s)      dScC!2!2!6!6s!;4!GScrz   ?   game_pig/win.oggzyahtzee-you-upper-bonuszyahtzee-player-upper-bonusrq   rn   zyahtzee-you-upper-bonus-missedz!yahtzee-player-upper-bonus-missed)replacerJ   rY   r_   rC   r/   rp   rH   rZ   r   r   r   r   r*  r/  _team_manageradd_to_team_round_scorer   r[   r{   re   rg   	_end_turn)rb   r   r   r0   r>  yahtzee_bonusr   r   r   upper_completeupper_totalr   s              @rB   r   YahtzeeGame._action_score  s'   $*
 $$Xr2>)   *6 !!7!7B joo,,--  $$Y/25..!3. $ '-
(# }}V$ $$##FN8,DE 	+,!! # 	" 	
 	226;;GOO34%%f.ACYZ66v{{CH --  dSc ddN(88:"$59J2OO$67--14)	 .  &&>>v{{BO--8;)	 .  	rD   c                 (   U R                   nU(       d  gUnU R                  U5      nU(       d  gUR                  R                  (       d  UR	                  S5        gUR                  R                  5       n[        S5       Vs/ s HH  otR                  R                  U5      (       d  M$  [        UR                  R                  U5      5      PMJ     nnU(       a"  SR                  U5      n	UR	                  SXiS9  gUR	                  SUS9  gs  snf )	zView current dice state.Nzyahtzee-not-rolledr-   r  zyahtzee-your-dice-kept)r/   r(  zyahtzee-your-dicerG   )current_playerr   r/   r   r0  format_values_onlyr)  is_keptr   	get_valuer.  )
rb   r   r   currentytz_currentr   r:  r  r(  kept_strs
             rB   r   YahtzeeGame._action_view_dice	  s    %%%,}}V$**LL-.##668<A!HdHqHXHXH`H`abHc2K$$..q12HdyyHLL1LPLL,8L< es   #D+(Dc           	      .   U R                  U5      nU(       d  gU R                  nU(       d  gUnUR                  n[        R                  " USUR
                  S9/nUR                  [        R                  " US5      5        [         Hm  n[        R                  " U[        U   5      n	UR                  R	                  U5      n
U
b  UR                  SU	 SU
 35        MX  UR                  SU	 S35        Mo     UR                  5       nUR                  (       a&  UR                  [        R                  " USUS	95        O5[        S
SU-
  5      nUR                  [        R                  " USUUS95        UR                  [        R                  " US5      5        [         Hm  n[        R                  " U[        U   5      n	UR                  R	                  U5      n
U
b  UR                  SU	 SU
 35        MX  UR                  SU	 S35        Mo     UR                  S-  nUR                  [        R                  " USUR                  US95        UR                  [        R                  " USUR                  5       S	95        U R!                  X5        g)zView scoresheet.Nzyahtzee-scoresheet-header)r   zyahtzee-scoresheet-upperz  : z: -z$yahtzee-scoresheet-upper-total-bonusrC  r   rA  z%yahtzee-scoresheet-upper-total-needed)rq   neededzyahtzee-scoresheet-lowerro   z yahtzee-scoresheet-yahtzee-bonus)r  rq   zyahtzee-scoresheet-grand-total)r   rM  r   r   r_   r   appendre   r   rY   rg   r[   maxLOWER_CATEGORIESrZ   rr   
status_box)rb   r   r   r   rQ  rR  r   linesrK   r   scorerJ  rW  rH  s                 rB   r   #YahtzeeGame._action_view_scoresheet   sK   }}V$ %%%,!!&*Egll[\\%%f.HIJ#C#''s0CDH&&**3/E r(2eW56r(3/0 $ "113**LL  )OWbc B,-FLL  ;%!	 	\%%f.HIJ#C#''s0CDH&&**3/E r(2eW56r(3/0 $ $77#=2!55#		
 	0!113	
 	&rD   c                    SU l         SU l        SU l        SU l        U R	                  5       nU R                  U5        SU R                  l        U R                  R                  U Vs/ s H  o"R                  PM     sn5        U H  nU R                  U5        M     U R                  S5        U R                  5         gs  snf )zCalled when the game starts.playingTr   
individualzgame_pig/mus.oggN)statusgame_activer   r   get_active_playersset_turn_playersrE  	team_modesetup_teamsr   _reset_player
play_music_start_game)rb   active_playersps      rB   on_startYahtzeeGame.on_startg  s     002n- (4$&&'G1'GH  Aq!   	*+ 	 (Hs   (C c                     UR                   R                  5         SUl        [         Vs0 s H  o"S_M     snUl        SUl        SUl        gs  snf )z&Reset a player's state for a new game.r   Nr   F)r/   resetrX   rJ   rY   rZ   r[   )rb   r   rK   s      rB   rh  YahtzeeGame._reset_player  sG    .<=nsdn=%&"%*" >s   Ac                     U =R                   S-  sl         U R                  SU R                   S9  U R                  U R                  5       5        U R	                  5         g)zStart a new game.r   zgame-round-start)roundN)r   broadcast_lre  rd  _start_turnrf   s    rB   rj  YahtzeeGame._start_game  sR    Q+43D3DE 	d5578rD   c                 (   U R                   nU(       d  gUnUR                  R                  5         SUl        U R	                  5         UR
                  (       a*  [        R                  " U[        R                  " SS5      S9  U R                  5         g)zStart a player's turn.Nr   r      r#  )rM  r/   rp  rX   announce_turnr   r   r1  r2  r3  r4  )rb   r   r   s      rB   ru  YahtzeeGame._start_turn  sp    $$$*
 	 !
 	 ==vV^^B-CD rD   c                    U R                   nU(       d  gUnUR                  5       (       a4  [        S U R                   5       5      nU(       a  U R	                  5         g[
        R                  " U [        R                  " SS5      S9  U R                  [        U R                  5      S-
  :  a'  SU l	        U R                  U R                  5       5        OU R                  SS	9  U R                  5         g)
zEnd current player's turn.Nc              3      #    U  H?  n[        U[        5      (       d  M  UR                  (       a  M-  UR                  5       v   MA     g 7frk   )
isinstancerN   is_spectatorr|   ra   rl  s     rB   rc   (YahtzeeGame._end_turn.<locals>.<genexpr>  s;      %Aa/ +89 +((**%s   A	A	A	r"  r4   r#  r   r   F)announce)rM  r|   r{   r   	_end_gamer   	jolt_botsr2  r3  
turn_indexr<   turn_playersre  rd  advance_turnru  )rb   r   r   all_completes       rB   rG  YahtzeeGame._end_turn  s    $$$*
 ,,..  L   	Dr2(>???c$"3"34q88DO!!$"9"9";<u-rD   c                    U =R                   S-  sl         U R                   Vs/ s H/  n[        U[        5      (       d  M  UR                  (       a  M-  UPM1     nnU(       d  g[        S U 5       5      nU Vs/ s H  oR                  5       U:X  d  M  UPM     nnU R                  S5        [        U5      S:X  a  U R                  SUS   R                  US9  OzU Vs/ s H  oUR                  PM     nnU R                   HO  nU R                  U5      nU(       d  M  [        R                  " UR                  U5      nUR                  SXS	S
9  MQ     U R                   R#                  5         U R                   U R$                  R&                  :  aE  U H  nU R)                  U5        M     U R                   R+                  5         U R-                  5         gU R/                  5         gs  snf s  snf s  snf )zEnd the current game.r   Nc              3   @   #    U  H  oR                  5       v   M     g 7frk   rr   r  s     rB   rc   (YahtzeeGame._end_game.<locals>.<genexpr>  s     En**,,ns   rB  zyahtzee-winnerr   )r   r]  zyahtzee-winners-tietable)r   r]  buffer)r   r   r}  rN   r~  rY  rr   r*  r<   rt  r   r   r   format_list_andr   r0  rE  commit_round_scoresr   r   rh  reset_round_scoresrj  finish_game)	rb   rl  rk  
high_scorewinnerswwinner_namesr   	names_strs	            rB   r  YahtzeeGame._end_game  s   Q ||
#!z!]'CAANNA| 	 
 EnEE
,Rn0A0A0Cz0Q1nR*+w<1-gajooZX,34GqFFGL4\\}}Q'4 , < <T[[, WILL-y[b ! 	 " 	..0 t||555#""1% $113 G
 S 5s#   G*G*G*:G/G/ G4c                    U R                    Vs/ s H/  n[        U[        5      (       d  M  UR                  (       a  M-  UPM1     nn[	        US SS9n0 nU H  nUR                  5       XAR                  '   M!     U(       a  US   OSn[        U R                  5       [        R                  " 5       R                  5       U R                  U Vs/ s H8  n[        UR                  UR                  UR                  [!        USS5      S9PM:     snU(       a  UR                  OSU(       a  UR                  5       OSUU R"                  U R$                  R&                  S	.S
9$ s  snf s  snf )z1Build the game result with Yahtzee-specific data.c                 "    U R                  5       $ rk   r  )rl  s    rB   rT   /YahtzeeGame.build_game_result.<locals>.<lambda>  s    !++-rD   T)keyreverser   Nis_virtual_botF)r   player_namer   r  )winner_namewinner_scorefinal_scoresr   r   )r  	timestampduration_ticksplayer_resultscustom_data)r   r}  rN   r~  sortedrr   r   r   r   r   now	isoformatsound_scheduler_tickr   r   r   getattrr   r   r   )rb   rl  rk  sorted_playersr  winners         rB   build_game_resultYahtzeeGame.build_game_result  s>    ||
#!z!]'CAANNA| 	 
  -
 A#$#4#4#6L    '5"$mmolln..044 ( (A dd !88#*1.>#F	 ( /5v{{$<B 6 6 8 , $ 1 1!\\33
 	
#
*s   E E E ?E%resultr   c                    [         R                  " US5      /nUR                  R                  S0 5      n[        UR	                  5       S5       H7  u  nu  pg[         R                  " USUS9nUR                  U SU SU 35        M9     U$ )z'Format the end screen for Yahtzee game.zgame-final-scoresr  r   zgame-pointsr   z. rV  )r   r_   r  	enumerateitemsrX  )	rb   r  r   r\  r  r  r   r]  
points_strs	            rB   format_end_screenYahtzeeGame.format_end_screen  s    !!&*=>?))--nbA ),*<*<*> BA}%))&-uMJLLA3bb56 !C rD   c                 r   > [         TU ]  5         U R                  (       d  g[        R                  " U 5        g)zCalled every tick.N)r   on_tickrc  r   r   s    rB   r  YahtzeeGame.on_tick&  s'    $rD   c                 4    [        U U[        [        [        S9$ )zBot AI decision making.)rC   all_categoriesupper_categories)yahtzee_bot_thinkrC   rJ   re   r  s     rB   r   YahtzeeGame.bot_think.  s     +)-
 	
rD   )r   rc  r   rb  r  )F)r1   N)8r~   r   r   r   r   relevant_preferencesr   r   r   rN   r   r   r   r   r   r   classmethodr   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   rm  rh  rj  ru  rG  r  r   r  r  r  r   r   __classcell__)r   s   @rB   r   r      s    12FG#(#>GT- >#NCG^C L#L#      %S % %      Es E# Et EP] E9] 9y 9vd$
v 
#* 

f 
 
<f < < <
f 
 
t 
TV T T
 T(F (sTz (!6 !j !(& (S4Z (! !J !9I6 9Ic 9Id 9IvKF Ks Kt KZ= =3 =4 =.E'f E' E' E'N2+M +d +!*B(T'
: '
R	
 	C 	DI 	 
 
#* 
 
rD   r   rK   c                 6   ^  S[         S[        S-  4U 4S jjnU$ )z3Create an is_enabled method for a scoring category.r   r1   Nc                    > U R                  U5      nU(       a  U$ UR                  R                  (       d  gTUR                  5       ;  a  gg )Nzyahtzee-roll-firstzyahtzee-category-filled)r   r/   r   ru   )rb   r   r   rK   s      rB   method#_make_score_enabled.<locals>.method@  sB    ..v6L{{%%'f0022,rD   r   r   rK   r  s   ` rB   _make_score_enabledr  =  s!    V d
  MrD   c                 0   ^  S[         S[        4U 4S jjnU$ )z2Create an is_hidden method for a scoring category.r   r1   c                    > UR                   R                  =(       a    TUR                  5       ;   nU R                  XS9$ )Nr   )r/   r   ru   r   )rb   r   r   rK   s      rB   r  "_make_score_hidden.<locals>.methodP  s9     ++00XSF<V<V<X5X**6*SSrD   )r   r   r  s   ` rB   _make_score_hiddenr  M  s     TV T
 T MrD   c                 <   ^  S[         S[        S[        4U 4S jjnU$ )z1Create a get_label method for a scoring category.r   r   r1   c                   > U R                  U5      nU(       a  UR                  OSn[        R                  " U[        T   5      nUR
                  R                  (       a(  [        UR
                  R                  T5      nU SU S3$ U$ )Nr   z for z points)	r   r   r   r_   r   r/   r   rC   rp   )rb   r   r   r   r   r   r>  rK   s          rB   r  !_make_score_label.<locals>.methodZ  sp    }}V$ $$##FN3,?@;;!!$V[[%7%7=FZuVHG44rD   r  r  s   ` rB   _make_score_labelr  W  s$    V    MrD   r   r   r   r   r   )>r   dataclassesr   r   r   r2  baser   r   r	   registryr
   botr   r  game_utils.action_guard_mixinr   game_utils.actionsr   r   r   game_utils.bot_helperr   game_utils.dicer   r   r   r   r   game_utils.dice_game_mixinr   game_utils.game_resultr   r   game_utils.optionsr   r   messages.localizationr   server.core.ui.keybindsr   re   rZ  rJ   r   r>   r   r   r   rC   r   rH   r   rL   rN   r   r   r  r  r  _catsetattrrS   rD   rB   <module>r     s   )   , , $ / = ? ? .  8 > 9 1 0 I   "$44 $#'%%%/-/77)'$ 5$s) 5s 5s 5pT#Y 4 1c3:o. 1
 &OF &O &OR [    l	
"D- l	
  l	
fS  C 3   DK:dV846I$6OPK:dV735G5MNK;tfF35Ft5LM rD   