
    Ii:                     $   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Jr  SSKJrJr  SSKJr  SSKJr  / SQr\ " S S\5      5       r\ " S S\	5      5       r \\ " S S\\5      5       5       r!g)z
Left Right Center (LRC) Game Implementation for PlayPalace v11.

Players roll up to 3 dice (limited by chips they hold). Each die result
passes a chip left/right/center or keeps it. Center chips are removed
from play. Last player holding chips wins.
    )	dataclassfield)datetimeN   )GamePlayerGameOptions)register_game   )ActionGuardMixin)Action	ActionSet
Visibility)	BotHelper)
GameResultPlayerResult)	IntOptionoption_field)Localization)KeybindState)leftrightcenterdotr   r   c                   (    \ rS rSr% SrSr\\S'   Srg)LeftRightCenterPlayer   z#Player state for Left Right Center.r   chips N)	__name__
__module____qualname____firstlineno____doc__r   int__annotations____static_attributes__r       @c:\Users\dbart\PlayPalace11\server\games\leftrightcenter\game.pyr   r      s    -E3Nr(   r   c                   H    \ rS rSr% Sr\" \" SSSSSSS	S
95      r\\	S'   Sr
g)LeftRightCenterOptions"   zOptions for Left Right Center.r      
   countzlrc-set-starting-chipszlrc-enter-starting-chipsz!lrc-option-changed-starting-chips)defaultmin_valmax_val	value_keylabelprompt
change_msgstarting_chipsr   N)r    r!   r"   r#   r$   r   r   r7   r%   r&   r'   r   r(   r)   r+   r+   "   s3    (&*-:	

NC 
r(   r+   c            	         ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9r\
\	S'   Sr\\	S'   Sr\\	S'   U 4S	 jr\S
\4S j5       r\S
\4S j5       r\S
\4S j5       r\S
\4S j5       r\S
\4S j5       r S6S\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 S7U 4S jjr!S\S
\4U 4S jjr"S7S jr#S7S jr$S7S jr%S
\\   4S  jr&S\S
\'\\4   4S! jr(S\S"\\   S
S4S# jr)S\S$\S
S4S% jr*S7S& jr+S
\4S' jr,S7U 4S( jjr-S\S
\S-  4S) jr.S\S
\S-  4S* jr/S\S
\4S+ jr0S\S$\S
S4S, jr1S8S-\S
S4S. jjr2S7S/ jr3S\S$\S
\4S0 jr4S
\54S1 jr6S2\5S3\S
\\   4S4 jr7S5r8U =r9$ )9LeftRightCenterGame3   zLeft Right Center dice game.)default_factoryplayersoptionsr   
center_potturn_delay_ticksc                 L   > [         TU ]  5         SU l        S U l        SU l        g )NFr   )super__post_init___pending_turn_advance_pending_roll_roll_delay_ticksself	__class__s    r)   rB   !LeftRightCenterGame.__post_init__=   s&    %*"!!"r(   returnc                     g)NzLeft Right Centerr   clss    r)   get_nameLeftRightCenterGame.get_nameC   s    "r(   c                     g)Nleftrightcenterr   rL   s    r)   get_typeLeftRightCenterGame.get_typeG   s     r(   c                     g)Nzcategory-dice-gamesr   rL   s    r)   get_category LeftRightCenterGame.get_categoryK   s    $r(   c                     g)Nr   r   rL   s    r)   get_min_players#LeftRightCenterGame.get_min_playersO   s    r(   c                     g)N   r   rL   s    r)   get_max_players#LeftRightCenterGame.get_max_playersS   s    r(   	player_idnameis_botc                     [        XUSS9$ )Nr   )idr_   r`   r   )r   )rG   r^   r_   r`   s       r)   create_player!LeftRightCenterGame.create_playerW   s     %	VSTUUr(   playerNc                 $    U R                  U5      $ N)guard_turn_action_enabledrG   re   s     r)   _is_roll_enabled$LeftRightCenterGame._is_roll_enabled`   s    --f55r(   c                 v    [        U[        5      (       + =(       d    UR                  S:  nU R                  XS9$ )Nr   )extra_condition)
isinstancer   r   turn_action_visibility)rG   re   	has_chipss      r)   _is_roll_hidden#LeftRightCenterGame._is_roll_hiddenc   s5    "6+@AAUV\\TUEU	**6*MMr(   c                 &    U R                   S:w  a  gg Nplayingzaction-not-playingstatusri   s     r)   _is_check_scores_enabled,LeftRightCenterGame._is_check_scores_enabledg       ;;)#'r(   c                 &    U R                   S:w  a  gg rt   rv   ri   s     r)   !_is_check_scores_detailed_enabled5LeftRightCenterGame._is_check_scores_detailed_enabledl   rz   r(   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$ )Nenturn)r_   rolllrc-rollr   r/   _action_rollrj   rq   _get_roll_label)rb   r4   handler
is_enabled	is_hidden	get_label)get_userlocaler   addr   r   get)rG   re   userr   
action_sets        r)   create_turn_action_set*LeftRightCenterGame.create_turn_action_setu   sd    }}V$ $$F+
"&&vzC&-++		
 r(   c                    > [         TU ]  5         U R                  SSS/[        R                  S9  U R                  SSS/[        R                  SS	9  g )
Nrz	Roll dicer   )statecz
Center potcheck_centerT)r   include_spectators)rA   setup_keybindsdefine_keybindr   ACTIVErF   s    r)   r   "LeftRightCenterGame.setup_keybinds   sX     Cvhl>Q>QR%%# 	 	
r(   c                   > [         TU ]  U5      nU R                  U5      nU(       a  UR                  OSn[	        S[
        R                  " US5      SSSS9nUR                  U5        UR                  UR                  ;   a%  UR                  R                  UR                  5        UR                  R                  SUR                  5        U$ )	Nr   r   lrc-center-pot_action_check_center_is_check_center_enabled_is_check_center_hidden)rb   r4   r   r   r   r   )rA   create_standard_action_setr   r   r   r   r   r   rb   _orderremoveinsert)rG   re   r   r   r   actionrH   s         r)   r   .LeftRightCenterGame.create_standard_action_set   s    W7?
}}V$ $$""6+;<*1/
 	v99
)))$$VYY/  FII.r(   c                    SU l         SU l        SU l        SU l        SU l        SU l        S U l        SU l        U R                   H  nU R                  R                  Ul        M      SU R                  l        U R                  R                  U R                   Vs/ s H  o"R                  PM     sn5        U R!                  5         U R#                  U R%                  5       5        U R'                  S5        U R)                  5         g s  snf )Nru   Tr   F
individualzgame_pig/mus.ogg)rw   game_activeroundr>   r?   rC   rD   rE   r<   r=   r7   r   _team_manager	team_modesetup_teamsr_   _sync_team_scoresset_turn_playersget_active_players
play_music_start_turn)rG   re   ps      r)   on_startLeftRightCenterGame.on_start   s    
 !%*"!!"llF<<66FL # (4$&&'E1'EF  	d5578*+ (Fs   Dc                    U R                   nU(       d  g U R                  5       (       a  g U R                  5         [        U[        5      (       a;  UR
                  S:X  a+  U R                  SUR                  S9  U R                  5         g UR                  (       a*  [        R                  " U[        R                  " SS5      S9  U R                  5         g )Nr   zlrc-no-chips)re      r.   ticks)current_player_check_for_winnerannounce_turnrn   r   r   broadcast_lr_   end_turnr`   r   jolt_botrandomrandintrebuild_all_menusri   s     r)   r   LeftRightCenterGame._start_turn   s    $$!!##f3449J^FKK@MMO==vV^^Ar-BC r(   c                 n    U R                  5       (       a  g U R                  SS9  U R                  5         g )NF)announce)r   advance_turnr   )rG   s    r)   	_end_turnLeftRightCenterGame._end_turn   s1    !!##5)r(   c                 j    U R                    Vs/ s H  oR                  (       a  M  UPM     sn$ s  snf rg   )r<   is_spectator)rG   r   s     r)   _get_turn_order#LeftRightCenterGame._get_turn_order   s"    <<><a~~<>>>s   00c                     U R                  5       nU(       d  X4$ UR                  U5      nX#S-
  [        U5      -     nX#S-   [        U5      -     nXE4$ )Nr-   )r   indexlen)rG   re   orderidxleft_playerright_players         r)   _get_left_right#LeftRightCenterGame._get_left_right   s_     $$&##kk&!1WE
23AgU34((r(   facesc           	      6   U R                    H  nU R                  U5      nU(       d  M  UR                  nU Vs/ s H  n[        R                  " USU 35      PM     nn[        R
                  " XW5      nUR                  SUR                  US9  M     g s  snf )Nz	lrc-face-zlrc-roll-results)re   results)r<   r   r   r   r   format_list_andspeak_lr_   )	rG   re   r   r   r   r   facelocalized_facesresults_texts	            r)   _broadcast_roll_results+LeftRightCenterGame._broadcast_roll_results   s    A==#D[[FX]^X]PT|//)D68JKX]O^'77PLLL+FKKLV 
 _s   $B	action_idc                 L   Un[        SUR                  5      nUS:X  a  U R                  5         g U R                  S5        [	        U5       Vs/ s H  n[
        R                  " [        5      PM     nnU R                  X65        UR                  US.U l
        SU l        g s  snf )Nr   r   zgame_pig/roll.ogg)r^   r   r.   )minr   r   
play_soundranger   choice
DICE_FACESr   rb   rD   rE   )rG   re   r   
lrc_player
roll_count_r   s          r)   r    LeftRightCenterGame._action_roll   s    ,2
J,,-
?MMO+,49*4EF4Eqz*4EF$$Z7 $
 "$ Gs   $B!c                 t   U R                   (       d  g U R                  U R                   S   5      nU(       d  S U l         g Un[        U R                   S   5      nS U l         U R                  U5      u  pESnUR	                  S5      nUR	                  S5      nUR	                  S5      n	U(       ax  U=R
                  U-  sl        U=R
                  U-  sl        U R                  SUR                  UR                  US9  [        U5       H  n
U R                  S	US
S9  US-  nM     U(       ax  U=R
                  U-  sl        U=R
                  U-  sl        U R                  SUR                  UR                  US9  [        U5       H  n
U R                  S	USS9  US-  nM     U	(       al  U=R
                  U	-  sl        U =R                  U	-  sl
        U R                  SUR                  U	S9  [        U	5       H  n
U R                  SUS9  US-  nM     U R                  5         U R                  US9  g )Nr^   r   r   r   r   r   zlrc-pass-left)re   targetr/   zgame_ninetynine/lose1_you.oggi)delay_tickspanr.   zlrc-pass-right2   zlrc-pass-centerre   r/   zgame_ninetynine/lose1_other.ogg)r   )rD   get_player_by_idlistr   r/   r   r   r_   r   schedule_soundr>   r   r   )rG   re   r   r   r   r   sound_delay
left_countright_countcenter_countr   s              r)   _resolve_pending_roll)LeftRightCenterGame._resolve_pending_roll  s9   !!&&t'9'9+'FG!%D,2
T''01!$($8$8$D![[(
kk'*{{8,
*+!"'' 	   :&##3RU $  r!	 ' ++- !#((!	   ;'##3RT $  r!	 ( ,OO|+O!!"  
 <(##$ES^#_r! ) 	 +.r(   c                 *   U R                  5       nU Vs/ s H  o"R                  S:  d  M  UPM     nn[        U5      S:X  aL  US   nU R                  SUR                  UR                  S9  U R                  S5        U R                  5         ggs  snf )Nr   r-   z
lrc-winnerr   zgame_pig/win.oggTF)r   r   r   r   r_   r   finish_game)rG   activer   players_with_chipswinners        r)   r   %LeftRightCenterGame._check_for_winnerB  s    ((*)/?A77Q;a?!"a''*F\&++V\\ROO./ @s
   BBc                 x  > [         TU ]  5         U R                  S:  a6  U =R                  S-  sl        U R                  S:X  a  U R                  5         g U R                  S:  a  U =R                  S-  sl        g U R
                  (       a  SU l        U R                  5         g [        R                  " U 5        g )Nr   r-   F)rA   on_tickrE   r   r?   rC   r   r   rF   s    r)   r  LeftRightCenterGame.on_tickM  s    !!A%""a'"%%***,  1$!!Q&!%%).D&NN$r(   c                     g)Nr   r   ri   s     r)   	bot_thinkLeftRightCenterGame.bot_think]  s    r(   c                 &    U R                   S:w  a  gg rt   rv   ri   s     r)   r   ,LeftRightCenterGame._is_check_center_enabled`  rz   r(   c                 "    [         R                  $ rg   )r   HIDDENri   s     r)   r   +LeftRightCenterGame._is_check_center_hiddene  s       r(   c                 j    U R                  U5      nU(       d  g UR                  SU R                  S9  g )Nr   r   )r   r   r>   )rG   re   r   r   s       r)   r   (LeftRightCenterGame._action_check_centerh  s+    }}V$%T__=r(   r   c                     U R                   nU(       a;  UR                  (       a*  [        R                  " U[        R
                  " SS5      S9  US:  a  Xl        SU l        gU R                  5         g)z=End the current turn with optional delay for turn resolution.r.      r   r   TN)	r   r`   r   r   r   r   r?   rC   r   )rG   r   currents      r)   r   LeftRightCenterGame.end_turnn  sS    %%w~~wfnnR.DE?$/!)-D&r(   c                     U R                   R                   H
  nSUl        M     U R                   HB  nU R                   R	                  UR
                  5      nU(       d  M1  UR                  Ul        MD     g)zBMirror player chips into TeamManager totals for scoreboard output.r   N)r   teamstotal_scorer<   get_teamr_   r   )rG   teamr   s      r)   r   %LeftRightCenterGame._sync_team_scoresy  sY    &&,,D D -A%%..qvv6Dt#$77  r(   c                     UnU R                  U5      nU(       a  UR                  OSn[        S[        SUR                  5      5      n[
        R                  " USUS9$ )Nr   r   r   r   r   )r   r   r   maxr   r   r   )rG   re   r   r   r   r   r/   s          r)   r   #LeftRightCenterGame._get_roll_label  sP    ,2
}}V$ $$As1j../0
%@@r(   c                 R   U R                  5       nU Vs/ s H  o"R                  S:  d  M  UPM     nn[        U5      S:X  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 R                  U Vs0 s H  o"R                  UR                  _M     snS.S9$ s  snf s  snf s  snf )Nr   r-   is_virtual_botF)r^   player_namer`   r  )winner_namer>   final_chips)	game_type	timestampduration_ticksplayer_resultscustom_data)r   r   r   r   rR   r   now	isoformatsound_scheduler_tickr   rb   r_   r`   getattrr>   )rG   active_playersr   r   r   s        r)   build_game_result%LeftRightCenterGame.build_game_result  s   002)7GA77Q;aG*-.@*AQ*F#A&Dmmolln..044 ( (A dd !88#*1.>#F	 ( /5v{{$"oo9GHAH
 	
 H  Is   DD?D3 D$resultr   c           
      J   [         R                  " US5      /nUR                  R                  S0 5      nUR                  5        H  u  pVUR	                  U SU 35        M     UR	                  [         R                  " USUR                  R                  SS5      S95        U$ )Nzgame-final-scores-headerr  z: r   r>   r   r   )r   r   r#  itemsappend)rG   r+  r   linesr  r_   r   s          r)   format_end_screen%LeftRightCenterGame.format_end_screen  s    !!&*DEF((,,]B?&,,.KDLLD6E7+, /(0B0B0F0F|UV0W	

 r(   )rD   rC   rE   r>   r   r   rw   r?   )F)rJ   N)r   ):r    r!   r"   r#   r$   r   r   r<   r   r&   r+   r=   r>   r%   r?   rB   classmethodstrrN   rR   rU   rX   r\   boolrc   r   rj   r   rq   rx   r|   r   r   r   r   r   r   r   r   tupler   r   r   r   r   r  r  r   r   r   r   r   r   r   r)  r0  r'   __classcell__)rH   s   @r)   r9   r9   3   s    '+0+FGT'(F&+<R&SG#SJc# # # # ! ! ! %S % %       9>VV$'V15V	V6v 6#* 6Nf N Nv #* 
 3: -B y "	
 I *.!$?&;!< ?	)+	)	$&;;	<	)W.C WDQTI WZ^ W6 c d ,=/~	4 	   5 #* v #* 
!f ! !>6 >c >d >	C 	 	+Af A A A
: 
0

 
C 
DI 
 
r(   r9   )"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.game_resultr   r   game_utils.optionsr   r   messages.localizationr   server.core.ui.keybindsr   r   r   r+   r9   r   r(   r)   <module>rA     s    )   , , $ = ? ? . > 9 1 0 >
 F   [    x*D x  xr(   