
    IiI              
       H   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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  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\5      5       r%\ " S S\	5      5       r&\\ " S S\\\\5      5       5       r'g)z
Toss Up Game Implementation for PlayPalace v11.

Push-your-luck dice game: roll dice with green/yellow/red sides.
Green = points + remove die. Yellow = remove die. Red = danger!
All red = bust! Bank your points or risk it all.
    )	dataclassfield)datetimeN   )GamePlayerGameOptions)register_game   )ActionGuardMixin)Action	ActionSet
Visibility)	BotHelper)PushYourLuckBotMixin)RoundBasedGameMixin)
GameResultPlayerResult)	IntOption
MenuOptionoption_field)TeamResultBuilder)Localization)KeybindStatec                   V    \ rS rSr% SrSr\\S'   Sr\\S'   \	" \
S9r\
\\4   \S'   Srg	)
TossUpPlayer   zPlayer state for Toss Up game.r   turn_points
dice_countdefault_factory	last_roll N)__name__
__module____qualname____firstlineno____doc__r   int__annotations__r   r   dictr"   str__static_attributes__r#       7c:\Users\dbart\PlayPalace11\server\games\tossup\game.pyr   r      s5    (KJ %!ItCH~ r.   r   c                       \ rS rSr% Sr\" \" SSSSSSS	S
S95      r\\	S'   \" \" SSSSSSSSS95      r
\\	S'   \" \" SSS SSSSS95      r\\	S'   Srg) TossUpOptions&   z9Options for Toss Up game using declarative option system.d      i  scorezgame-set-target-scorezgame-enter-target-scorezgame-option-changed-targetztossup-desc-target-score)defaultmin_valmax_val	value_keylabelprompt
change_msgdescriptiontarget_score
      countztossup-set-starting-diceztossup-enter-starting-diceztossup-option-changed-diceztossup-desc-starting-dicestarting_diceStandardvariantc                 
    SS/$ )NrC   
PlayPalacer#   )gps     r/   <lambda>TossUpOptions.<lambda>F   s	    *l!;r.   ztossup-set-rules-variantztossup-select-rules-variantztossup-option-changed-rulesztossup-desc-rules)r6   r9   choicesr:   r;   r<   r=   rules_variantr#   N)r$   r%   r&   r'   r(   r   r   r>   r)   r*   rB   r   rL   r,   r-   r#   r.   r/   r1   r1   &   s    C$),32		
L#  &,/33		
M3  &;,04+	

M3 
r.   r1   c            	       ~  ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9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S.S\S\S\S\4S jjrS\S\S-  4S jrS\S\4S jrS\S\S\4S jr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/U 4S jjr S\S\SS4S jr!S\S\SS4S jr"S\S\4S jr#S\SS4S jr$S\SS4S jr%S/S  jr&S/S! jr'S\S"\S\4S# jr(S\S\S-  4S$ jr)S/S% jr*S\+4S& jr,S'\+S(\S\\   4S) jr-S0S*\S+\SS4S, jjr.S-r/U =r0$ )1
TossUpGameO   a  
Toss Up dice game.

Roll dice with green/yellow/red sides. Green dice add points and are removed.
Yellow dice are removed but don't add points. Red dice stay in play.
Bust if all dice show red (PlayPalace) or if you have no greens and at least
one red (Standard). Bank your points or keep rolling - but don't bust!
When you run out of dice, you get a fresh set. First to reach target score wins.
r    playersoptionsreturnc                     g)NzToss Upr#   clss    r/   get_nameTossUpGame.get_name`   s    r.   c                     g)Ntossupr#   rT   s    r/   get_typeTossUpGame.get_typed   s    r.   c                     g)Nzcategory-dice-gamesr#   rT   s    r/   get_categoryTossUpGame.get_categoryh   s    $r.   c                     g)Nr   r#   rT   s    r/   get_min_playersTossUpGame.get_min_playersl       r.   c                     g)N   r#   rT   s    r/   get_max_playersTossUpGame.get_max_playersp   rb   r.   	player_idnameis_botc           	          [        UUUSS0 S9$ )z/Create a new player with TossUp-specific state.r   )idrh   ri   r   r   r"   )r   )selfrg   rh   ri   s       r/   create_playerTossUpGame.create_playert   s!    
 	
r.   playerNc                 $    U R                  U5      $ )z Check if roll action is enabled.)guard_turn_action_enabledrl   ro   s     r/   _is_roll_enabledTossUpGame._is_roll_enabled   s    --f55r.   c                 $    U R                  U5      $ )z/Roll is visible during play for current player.)turn_action_visibilityrr   s     r/   _is_roll_hiddenTossUpGame._is_roll_hidden   s    **622r.   	action_idc                     UnU R                  U5      nU(       a  UR                  OSnUR                  S:X  a   [        R                  " USUR
                  S9$ [        R                  " USUR
                  S9$ )z5Get dynamic label for roll action showing dice count.enr   tossup-roll-firstrA   ztossup-roll-remaining)get_userlocaler   r   getr   rl   ro   ry   tossup_playeruserr   s         r/   _get_roll_labelTossUpGame._get_roll_label   sj    &,}}V$ $$$$)##F,?}G_G_``  ##F,C=KcKcddr.   c                 ^    U R                  U5      nU(       a  U$ UnUR                  S::  a  gg)z Check if bank action is enabled.r   ztossup-need-pointsN)rq   r   )rl   ro   errorr   s       r/   _is_bank_enabledTossUpGame._is_bank_enabled   s3    ..v6L&,$$)'r.   c                 >    UnU R                  XR                  S:  S9$ )z5Bank is hidden until player has rolled at least once.r   )extra_condition)rv   r   )rl   ro   r   s      r/   _is_bank_hiddenTossUpGame._is_bank_hidden   s'    &,**6C\C\_`C`*aar.   c                     UnU R                  U5      nU(       a  UR                  OSn[        R                  " USUR                  S9$ )z9Get dynamic label for bank action showing current points.r{   tossup-bankpoints)r~   r   r   r   r   r   s         r/   _get_bank_labelTossUpGame._get_bank_label   s=    &,}}V$ $$m>W>WXXr.   c                 (   U R                  U5      nU(       a  UR                  OSn[        SS9nUR                  [	        S[
        R                  " USSS9SS	S
SS95        UR                  [	        S[
        R                  " USSS9SSSSS95        U$ )z(Create the turn action set for a player.r{   turn)rh   rollr|   r?   r}   _action_rollrs   rw   r   )rk   r:   handler
is_enabled	is_hidden	get_labelbankr   r   r   _action_bankr   r   r   )r~   r   r   addr   r   r   )rl   ro   r   r   
action_sets        r/   create_turn_action_set!TossUpGame.create_turn_action_set   s    }}V$ $$F+
"&&v/B"M&-++		
 	"&&v}QG&-++		
 r.   c                    > [         TU ]  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bzBank pointsr   N)supersetup_keybindsdefine_keybindr   ACTIVE)rl   	__class__s    r/   r   TossUpGame.setup_keybinds   sP     	  	Cvhl>Q>QRC@S@STr.   c                    UnU R                  S5        [        R                  " U[        R                  " SS5      S9  SnSnSnU R
                  R                  S:H  n[        UR                  5       Hx  nU(       a8  [        R                  " SS5      n	U	S	::  a  US-  nM.  U	S
::  a  US-  nM;  US-  nMB  [        R                  " SS	5      n	U	S:X  a  US-  nMf  U	S:X  a  US-  nMs  US-  nMz     XEUS.Ul	        / n
US:  a  U
R                  U S35        US:  a  U
R                  U S35        US:  a  U
R                  U S35        SR                  U
5      nU R                  USSUS9  SnU(       a  US:H  =(       a    US:  nOUS:H  =(       a    US:H  nU(       aE  U R                  S5        U R                  USSUR                  S9  SUl        U R                  5         gU=R                  U-  sl        XV-   Ul        U R                  USSUR                  UR                  S9  UR                  S:X  a8  U R
                  R                  Ul        U R                  USSUR                  S9  gg) zHandle roll action.zgame_pig/roll.oggr?   r4   ticksr   rC         r   r@   r   )greenyellowredz greenz yellowz redz, ztossup-you-rollztossup-player-rolls)resultsFzgame_pig/lose.oggztossup-you-bustztossup-player-bustsr   Nztossup-you-have-pointsztossup-player-has-points)r   r   ztossup-you-get-freshztossup-player-gets-freshr}   )
play_soundr   jolt_botrandomrandintrQ   rL   ranger   r"   appendjoinbroadcast_personal_lr   end_turnrB   )rl   ro   ry   r   r   r   r   is_standard_r   result_partsresult_textis_busts                r/   r   TossUpGame._action_roll   s   &,+, 	6B)?@ ll00J>}//0A~~a+19QJEQYaKF1HC ~~a+19QJEQYaKF1HC% 1( -2C"P 195' 01A:6(' 2373%t-ii- 	!!!	 	" 	
 qj,S1WG qj0Vq[GOO/0%%!%$00	 &  )*M%MMO 	!!U*! $*<  	!!$&%11$// 	" 	
 ##q('+||'A'AM$%%&*#..	 &  )r.   c                 V   UnU R                  S5        UR                  nU R                  R                  UR                  U5        U R                  R                  UR                  5      nU(       a  UR                  OSnSUl        U R                  USSUUS9  U R                  5         g)zHandle bank action.zgame_pig/bank.oggr   ztossup-you-bankztossup-player-banks)r   totalN)	r   r   _team_manageradd_to_team_scorerh   get_teamtotal_scorer   r   )rl   ro   ry   r   bankedteamr   s          r/   r   TossUpGame._action_bankC  s    &,+,** 	,,V[[&A!!**6;;7$(  a$%! 	!!! 	" 	
 	r.   c                 v    U R                   R                  UR                  5      nU(       a  UR                  $ S$ )z,Get a player's total score from TeamManager.r   )r   r   rh   r   )rl   ro   r   s      r/   get_player_scoreTossUpGame.get_player_score\  s/    !!**6;;7#'t.Q.r.   c                 V    SUl         U R                  R                  Ul        0 Ul        g Nr   r   rQ   rB   r   r"   rr   s     r/   _reset_player_for_game!TossUpGame._reset_player_for_gamea  $     LL66r.   c                 V    SUl         U R                  R                  Ul        0 Ul        g r   r   rr   s     r/   _reset_player_for_turn!TossUpGame._reset_player_for_turnf  r   r.   c                 ~    U R                  U5      nU R                  S5        U R                  SUR                  US9  g )Nzgame_pig/turn.oggztossup-turn-startro   r5   )r   r   broadcast_lrh   )rl   ro   current_scores      r/   _announce_turn_startTossUpGame._announce_turn_startk  s9    --f5+,,V[[Vr.   c                 &    U R                  U5        g )N)prepare_push_bot_turnrr   s     r/   _setup_bot_for_turnTossUpGame._setup_bot_for_turnp  s    ""6*r.   targetc                    UnU R                  5       nSnSnU R                  U5      nU HC  nX:w  d  M
  U R                  U5      n	XR                  R                  :  d  M6  Sn[	        Xi5      nME     U(       a
  US-   U-
  nU$ Sn
U H&  nX:w  d  M
  U R                  U5      n	[	        X5      n
M(     XR                  R                  S-
  :  a  SnU$ )z,Set up the bot's target score for this turn.Fr   Tr   r4   i  )get_active_playersr   rQ   r>   max)rl   ro   r   r   active_playerssomeone_hit_thresholdhighest_scoremy_scoreotherother_scoremax_opponent_scores              r/   _adjust_push_bot_target"TossUpGame._adjust_push_bot_targets  s    &, 002 %((7#E"33E:,,";";;,0)$'$CM $ !"Q&1F  "#'?"&"7"7">K),-?)M& (
 "ll&?&?"&DEr.   c                 t   [         R                  " U5      nUc  SnU R                  U5      nX1R                  -   U R                  R
                  :  a  gUR                  nUR                  S:X  a  gUR                  U:  a8  US:X  a  SnOUS:X  a  SnOUS	:X  a  S
nOSn[        R                  " 5       U:  a  ggg)z,Bot AI decision making. Called by BotHelper.   r   r   r   r   g?r   g333333?r   g?g{Gz?)r   
get_targetr   r   rQ   r>   r   r   )rl   ro   r   r   r   bank_chances         r/   	bot_thinkTossUpGame.bot_think  s    %%f->F ((0(((DLL,E,EE &&
 " 'Q"q"q""}}, r.   c                 ^   U R                  5       n/ nSnU HS  nU R                  U5      nXPR                  R                  :  d  M/  XS:  a  U/nUnM;  XS:X  d  MB  UR	                  U5        MU     [        U5      S:X  a@  U R                  S5        U R                  SUS   R                  US9  U R                  5         g
[        U5      S:  a  U Vs/ s H  ofR                  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U	SS9  MQ     U Vs/ s H  ofR                  PM     n
nU H  nUR                  U
;  d  M  S	Ul        M     U R#                  5         g
U R#                  5         g
s  snf s  snf )zHandle end of a round.r   r   zgame_pig/win.oggztossup-winnerr   ztossup-tie-tiebreakertable)rP   bufferTN)r   r   rQ   r>   r   lenr   r   rh   finish_gamerP   r~   r   format_list_andr   speak_lis_spectator_start_round)rl   r   winners
high_scorero   r5   wnamesr   	names_strwinner_namesrH   s               r/   _on_round_endTossUpGame._on_round_end  sv    002
$F))&1E111%%hG!&J(NN6* % w<1OO./_WQZ__JW\A%,-WVVWE-,,}}V,4 , < <T[[% PILL!8)T[L\	 ' -44GqFFGL4#66-%)AN $   . 5s   F%
F*c                    [         R                  " U R                  5      u  pn[        U R	                  5       [
        R                  " 5       R                  5       U R                  U R                  5        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                  R                  U5      OSU(       a  UR                   OSUU R"                  U R$                  R&                  U R$                  R(                  U R$                  R*                  S.S9$ s  snf )z0Build the game result with TossUp-specific data.is_virtual_botF)rg   player_nameri   r  Nr   )winner_namewinner_scorefinal_scoresrounds_playedr>   rL   rB   )	game_type	timestampduration_ticksplayer_resultscustom_data)r   	summarizer   r   rZ   r   now	isoformatsound_scheduler_tickr   r   rk   rh   ri   getattrget_team_namer   roundrQ   r>   rL   rB   )rl   sorted_teamswinnerr  rH   s        r/   build_game_resultTossUpGame.build_game_result  s   ->-H-HI[I[-\*lmmolln..044 002 3A dd !88#*1.>#F	 3 LRt11??GW[6< 2 2! ,!% $ 9 9!%!;!;!%!;!;
 	
s   7?D?resultr   c                 f    UR                   R                  S0 5      n[        R                  " X#5      $ )z'Format the end screen for Toss Up game.r  )r  r   r   format_final_scores)rl   r  r   r  s       r/   format_end_screenTossUpGame.format_end_screen  s+    ))--nbA 44VJJr.   jolt_minjolt_maxc                 v    [         R                  " U [        R                  " X5      S9  U R	                  5         g)z0Override to use TossUp's turn advancement logic.r   N)r   	jolt_botsr   r   _on_turn_end)rl   r#  r$  s      r/   r   TossUpGame.end_turn  s'    Dx(JKr.   r#   )F)rR   N)r4      )1r$   r%   r&   r'   r(   r   listrP   r   r*   r1   rQ   classmethodr,   rV   rZ   r]   r)   r`   re   boolrm   r   rs   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r!  r   r-   __classcell__)r   s   @r/   rN   rN   O   s    #("=GT,="=AG]A      %S % %      	
s 	
# 	
t 	
P\ 	
6v 6#* 63f 3 3ef e e ev #* bf b b
Yf Y Y Y\ i 8Uh6 hc hd hX6 c d 2/| / /
\ d 
\ d 
W
+ f  c  c  D$ $t $L& P
: 
8K
 KC KDI K
 S $  r.   rN   )(r(   dataclassesr   r   r   r   baser   r   r	   registryr
   game_utils.action_guard_mixinr   game_utils.actionsr   r   r   game_utils.bot_helperr   game_utils.push_your_luck_mixinr   !game_utils.round_based_game_mixinr   game_utils.game_resultr   r   game_utils.optionsr   r   r   game_utils.teamsr   messages.localizationr   server.core.ui.keybindsr   r   r1   rN   r#   r.   r/   <module>r;     s    )   , , $ = ? ? . C D > E E 1 1 0 6   %K % %P v%'79Ld v  vr.   