
    Iid                     <   S r SSKJrJr  SSKrSSKJrJr  SSKJ	r	  SSK
JrJrJr  SS	KJr  SS
KJrJr  SSKJrJrJrJr  SSKJr  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       r"\\	 " S S\5      5       5       r#g)z,Ludo game implementation for PlayPalace v11.    )	dataclassfieldN   )GamePlayer)register_game   )Action	ActionSet
Visibility)	BotHelper)
GameResultPlayerResult)GameOptions	IntOptionoption_field
BoolOption)TeamResultBuilder)Localization)KeybindState   	bot_thinkc                   8    \ rS rSr% Sr\\S'   \\S'   \\S'   Srg)	LudoToken   zToken state for Ludo.statepositiontoken_number N)	__name__
__module____qualname____firstlineno____doc__str__annotations__int__static_attributes__r        5c:\Users\dbart\PlayPalace11\server\games\ludo\game.pyr   r      s    JMr*   r   c                   x    \ rS rSr% SrSr\S-  \S'   \" \	S9r
\	\   \S'   Sr\\S'   \" \S9r\\\4   \S	'   S
rg)
LudoPlayer   zPlayer state for Ludo.Ncolordefault_factorytokensr   finished_countmove_optionsr    )r!   r"   r#   r$   r%   r/   r&   r'   r   listr2   r   r3   r(   dictr4   r)   r    r*   r+   r-   r-      sG     E3:#D9FDO9NC#(#>L$sCx.>r*   r-   c                   t    \ 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95      r\\	S'   Srg)LudoOptions%   zOptions for Ludo.r	   r      max_consecutive_sixeszludo-set-max-sixeszludo-enter-max-sixeszludo-option-changed-max-sixeszludo-desc-max-sixes)defaultmin_valmax_val	value_keylabelprompt
change_msgdescriptionTsafe_start_squareszludo-set-safe-start-squaresz&ludo-option-changed-safe-start-squareszludo-desc-safe-start-squares)r<   r?   r@   rB   rC   r    N)r!   r"   r#   r$   r%   r   r   r;   r(   r'   r   rD   boolr)   r    r*   r+   r8   r8   %   sb    !--&)6-		
"3   ,*/?6	
  r*   r8   c            	         ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9r\
\	S'   \" S S9r\\   \	S'   Sr\\	S	'   Sr\\	S
'   Sr\\	S'   Sr\\\4   S-  \	S'   Sr\\	S'   Sr\\	S'   \" 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SUS\S\S\S\4S jjrS\S\4S  jr SVU 4S! jjr!S\S\4U 4S" jjr"SVS# jr#SVU 4S$ jjr$S\%S\S-  4S% jr&S&\SS4S' jr'SVS( jr(S\\\4   4S) jr)S*\\\4   SS4S+ jr*SVS, jr+S\S\4S- jr,S\S\4S. jr-S/\S\S\4S0 jr.S/\S1\S\/\0S-  \S-  4   4S2 jr1S\S3\0SS4S4 jr2S3\0S5\S\4S6 jr3S\S5\S\\/\\04      4S7 jr4S3\0S8\S\4S9 jr5S\%S\S-  4S: jr6S\%S\74S; jr8S\%S<\S\S-  4S= jr9S\%S\S-  4S> jr:S\%S\S-  4S? jr;S\%S\S-  4S@ jr<S\%S\S-  4SA jr=S\%S\S-  4SB jr>S\%S\74SC jr?S\%S<\S\74SD jr@S\%S\74SE jrAS\%S\74SF jrBS\%S\74SG jrCS\%S\74SH jrDS\%SI\S\4SJ jrES\%SI\SS4SK jrFS\%SI\SS4SL jrGSI\S\S-  4SM jrHS\%SI\SS4SN jrIS8\S\\   4SO jrJS\K4SP jrLS\S3\0SQ\SS4SR jrMS\SS4SS jrNSTrOU =rP$ )WLudoGame@   z>Classic Ludo: race four tokens around the board and into home.r0   playersoptionsc                  
    / SQ$ )NRedBlueGreenYellowr    r    r*   r+   <lambda>LudoGame.<lambda>H   s    =_r*   player_colorsr   	last_rollconsecutive_sixesF
extra_turnNturn_start_state4   track_length   home_column_lengthc                  
    / SQ$ )N)	      #   0   r    r    r*   r+   rQ   rR   Q   s    Or*   safe_squaresreturnc                     g)NLudor    clss    r+   get_nameLudoGame.get_nameS       r*   c                     g)Nludor    re   s    r+   get_typeLudoGame.get_typeW   ri   r*   c                     g)Nzcategory-board-gamesr    re   s    r+   get_categoryLudoGame.get_category[   s    %r*   c                     gNr   r    re   s    r+   get_min_playersLudoGame.get_min_players_       r*   c                     g)N   r    re   s    r+   get_max_playersLudoGame.get_max_playersc   ru   r*   	player_idnameis_botc                     [        XUS9$ )zCreate a new player.)idr{   r|   )r-   )selfrz   r{   r|   s       r+   create_playerLudoGame.create_playerg   s    Y&AAr*   playerc                 f   U R                  U5      nU(       a  UR                  OSn[        SS9nUR                  [	        S[
        R                  " US5      SSSS	95        [        S
S5       H@  nUR                  [	        SU 3[
        R                  " US5      SSU S3SU S3SS95        MB     U$ )z(Create the turn action set for a player.enturn)r{   	roll_dicezludo-roll-die_action_roll_dice_is_roll_dice_enabled_is_roll_dice_hiddenr~   r@   handler
is_enabled	is_hiddenr   r:   move_token_ludo-move-token_action_move_token_is_move_token__enabled_hidden_get_move_token_label)r~   r@   r   r   r   	get_label)get_userlocaler   addr
   r   getrange)r   r   userr   
action_setr   s         r+   create_turn_action_setLudoGame.create_turn_action_seto   s    }}V$ $$F+
"&&v?+20	
 "!QKLNN$\N3&**63DE0!0hG /~WE5	 ( r*   c                 .  > [         TU ]  5         U R                  SSS/[        R                  S9  U R                  SSS/[        R                  SS	9  [        S
S5       H3  nU R                  [        U5      SU 3SU 3/[        R                  S9  M5     g)zDefine keybinds for Ludo.rzRoll dier   )r   vzView board statuscheck_boardT)r   include_spectatorsr   r:   zMove token r   N)supersetup_keybindsdefine_keybindr   ACTIVEr   r&   )r   r   	__class__s     r+   r   LudoGame.setup_keybinds   s     M%%	 	 	
 	O%%# 	 	
 "!QKLL!l^,|n-."))	    (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$ )	z1Create the standard action set with Ludo actions.r   r   zludo-check-board_action_check_board_is_check_board_enabled_is_check_board_hiddenr   r   )r   create_standard_action_setr   r   r
   r   r   r   r~   _orderremoveinsert)r   r   r   r   r   actionr   s         r+   r   #LudoGame.create_standard_action_set   s    W7?
}}V$ $$""6+=>)0.
 	v99
)))$$VYY/  FII.r*   c           
      J   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 R
                  R                  5         [        U5       HT  u  p4U R                  U   Ul        [        S5       Vs/ s H  n[        SSUS-   S9PM     snUl        SUl        0 Ul        MV     U R%                  S	5        U R'                  SS
9  gs  snf s  snf )zStart the game.playingTr   
individualrw   yardr   r   r   r   zgame_pig/mus.oggnew_turnN)statusgame_activerT   get_active_playersset_turn_players_team_manager	team_modesetup_teamsr{   reset_all_scores	enumeraterS   r/   r   r   r2   r3   r4   
play_music_start_turn)r   active_playerspir   js         r+   on_startLudoGame.on_start   s   002n- (4$&&'G1'GH++- #>2IA--a0FLQVWXQYQYA	QGQYFM %&F!"$F 3 	*+$' (Hs   !DD c                 r   > [         TU ]  5         U R                  (       d  g[        R                  " U 5        g)zRun per-tick logic (bots).N)r   on_tickr   r   )r   r   s    r+   r   LudoGame.on_tick   s'    $r*   c                     [        X5      $ )z
Bot logic.r   r   r   s     r+   r   LudoGame.bot_think   s    &&r*   r   c                 l   U R                   n[        U[        5      (       a  0 Ul        U(       a  SU l        U R                  5       U l        SU l        U(       a;  UR                  (       a*  [        R                  " U[        R                  " SS5      S9  U R                  5         U R                  5         g)zStart a player's turn.r   F   (   ticksN)current_player
isinstancer-   r4   rU   _save_turn_staterW   rV   r|   r   jolt_botrandomrandintannounce_turnrebuild_all_menus)r   r   r   s      r+   r   LudoGame._start_turn   s    $$fj))"$F%&D"$($9$9$;D!fmmvV^^B-CD r*   c                     U R                   (       a  U R                  SS9  gSU l        U R                  SS9  U R                  SS9  g)zEnd turn or grant extra turn.Fr   N)announceT)rV   r   rW   advance_turn)r   s    r+   	_end_turnLudoGame._end_turn   sG    ??e, $5)$'r*   c           	          0 nU R                    H[  nUR                  UR                   Vs/ s H'  nUR                  UR                  UR
                  S.PM)     snS.XR                  '   M]     U$ s  snf )z+Deep copy player token states for rollback.r   )r3   r2   )rI   r3   r2   r   r   r   r~   )r   r   r   ts       r+   r   LudoGame._save_turn_state   st    !#llF"("7"7 $]] +	 "#$%JJ()
 +
 E)) # s   .A0r   c                 .   U R                    Hu  nUR                  UR                  5      nU(       d  M'  US   Ul        [	        US   5       H2  u  pEUR
                  U   nUS   Ul        US   Ul        US   Ul        M4     Mw     U R                  5         g)z*Restore player token states from rollback.r3   r2   r   r   r   N)
rI   r   r~   r3   r   r2   r   r   r   _sync_team_scores)r   r   r   savedr   saved_tokentokens          r+   _restore_turn_stateLudoGame._restore_turn_state  s    llFIIfii(E$)*:$;F!"+E(O"<a()'2!,Z!8%0%@"	 #= # 	 r*   c                     U R                   R                  5         U R                   HJ  n[        U[        5      (       d  M  U R                   R                  UR                  UR                  5        ML     g)z-Sync TeamManager scores from finished counts.N)r   r   rI   r   r-   add_to_team_scorer{   r3   r   s     r+   r   LudoGame._sync_team_scores  sO    ++-llF&*--""44V[[&BWBWX #r*   c                 ,    SSSSS.nX!R                      $ )Nr      r.   r   rL   r/   )r   r   color_startss      r+   _get_start_positionLudoGame._get_start_position"  s     "rRHLL))r*   c                 ,    SSSSS.nX!R                      $ )N3         &   rL   r   )r   r   color_entriess      r+   _get_home_entry_position!LudoGame._get_home_entry_position&  s     "BrJ\\**r*   r   c                     XR                   ;   a  gU R                  R                  (       a  XR                  U5      :X  a  gg)NTF)ra   rJ   rD   r   )r   r   r   s      r+   _is_safe_squareLudoGame._is_safe_square*  s5    (((<<**x;S;STZ;[/[r*   exclude_playerc                     U R                    HF  nX2:X  a  M
  UR                   H,  nUR                  S:X  d  M  UR                  U:X  d  M'  XC4s  s  $    MH     g)Ntrack)NN)rI   r2   r   r   )r   r   r  r   r   s        r+   _get_token_at_positionLudoGame._get_token_at_position1  sM     llF';;')enn.H =( ' # r*   r   c           	         UR                   S:w  a  g U R                  UR                  U5      (       a  g U R                  UR                  U5      u  p4U(       an  U(       af  SUl         SUl        U R	                  SUR
                  UR                  UR
                  UR                  UR                  S9  U R                  S5        g g g )Nr  r   r   zludo-captures)r   r/   captured_playercaptured_colorr   game_pig/lose.ogg)	r   r  r   r  broadcast_lr{   r/   r   
play_sound)r   r   r   captured_tokenr	  s        r+   _check_captureLudoGame._check_capture<  s    ;;'!77*.*E*EennV\*]'o#)N &'N#{{ll / 4 4.44$11   OO/0 .>r*   rollc                     UR                   S:X  a  gUR                   S:X  a  US:H  $ UR                   S:X  a  gUR                   S:X  a  UR                  U-   U R                  :*  $ g)NfinishedFr   rZ   r  Thome_column)r   r   r[   )r   r   r  s      r+   _can_token_moveLudoGame._can_token_moveO  s_    ;;*$;;& 19;;'!;;-'>>D(D,C,CCCr*   c                     / n[        UR                  5       H/  u  pEU R                  XR5      (       d  M  UR                  XE45        M1     U$ N)r   r2   r  append)r   r   r  moveabler   r   s         r+   _get_moveable_tokensLudoGame._get_moveable_tokensZ  sB    !&--0HA##E00
+ 1 r*   r   c                    UR                   S:X  a   [        R                  " USUR                  S9$ UR                   S:X  a+  [        R                  " USUR                  UR                  S9$ UR                   S:X  a6  [        R                  " USUR                  UR                  U R
                  S	9$ [        R                  " US
UR                  S9$ )Nr   zludo-token-yard)r   r  zludo-token-track)r   r   r  zludo-token-home)r   r   totalzludo-token-finished)r   r   r   r   r   r[   )r   r   r   s      r+   _describe_tokenLudoGame._describe_tokena  s    ;;& ##F,=UEWEWXX;;'!##"((	  ;;-'##!((--  (=UEWEWXXr*   c                 p    U R                   S:w  a  gU R                  U:w  a  gUnUR                  (       a  gg Nr   zaction-not-playingzaction-not-your-turnzaction-not-availabler   r   r4   r   r   ludo_players      r+   r   LudoGame._is_roll_dice_enabledy  s6    ;;)#'&()"(##)r*   c                     U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ UnUR                  (       a  [        R                  $ [        R
                  $ Nr   r   r   HIDDENr   r4   VISIBLEr$  s      r+   r   LudoGame._is_roll_dice_hidden  sZ    ;;)#$$$&($$$"(##$$$!!!r*   token_indexc                 l    U R                   S:w  a  gU R                  U:w  a  gUnX#R                  ;  a  gg r"  r#  r   r   r-  r%  s       r+   _is_move_token_enabledLudoGame._is_move_token_enabled  s9    ;;)#'&()"(666)r*   c                 &    U R                  US5      $ Nr   r0  r   s     r+   _is_move_token_1_enabled!LudoGame._is_move_token_1_enabled      **6155r*   c                 &    U R                  US5      $ Nr   r4  r   s     r+   _is_move_token_2_enabled!LudoGame._is_move_token_2_enabled  r7  r*   c                 &    U R                  US5      $ rr   r4  r   s     r+   _is_move_token_3_enabled!LudoGame._is_move_token_3_enabled  r7  r*   c                 &    U R                  US5      $ Nr	   r4  r   s     r+   _is_move_token_4_enabled!LudoGame._is_move_token_4_enabled  r7  r*   c                     g r  r    r   s     r+   r    LudoGame._is_check_board_enabled  s    r*   c                 "    [         R                  $ r  )r   r*  r   s     r+   r   LudoGame._is_check_board_hidden  s       r*   c                     U R                   S:w  a  [        R                  $ U R                  U:w  a  [        R                  $ UnX#R                  ;  a  [        R                  $ [        R
                  $ r(  r)  r/  s       r+   _is_move_token_hiddenLudoGame._is_move_token_hidden  s]    ;;)#$$$&($$$"(666$$$!!!r*   c                 &    U R                  US5      $ r3  rH  r   s     r+   _is_move_token_1_hidden LudoGame._is_move_token_1_hidden      ))&!44r*   c                 &    U R                  US5      $ r9  rK  r   s     r+   _is_move_token_2_hidden LudoGame._is_move_token_2_hidden  rN  r*   c                 &    U R                  US5      $ rr   rK  r   s     r+   _is_move_token_3_hidden LudoGame._is_move_token_3_hidden  rN  r*   c                 &    U R                  US5      $ r@  rK  r   s     r+   _is_move_token_4_hidden LudoGame._is_move_token_4_hidden  rN  r*   	action_idc                    UnU R                  U5      nU(       a  UR                  OSnU R                  U5      nUc  [        R                  " US5      $ UR
                  R	                  U5      nU(       a  U$ [        R                  " US5      $ )Nr   r   )r   r   _token_index_from_actionr   r   r4   )r   r   rX  r%  r   r   r-  r@   s           r+   r   LudoGame._get_move_token_label  s~    "(}}V$ $$33I>##F,=>>((,,[9L(9::r*   c           	         Un[         R                  " SS5      U l        U R                  S5        U R	                  USSU R                  S9  U R                  X0R                  5      nU(       d$  U R	                  USS5        U R                  5         g [        U5      S:X  a4  U R                  X4S	   S   U R                  5        U R                  U5        g U R                  U5      nU(       a  UR                  OS
nU VVs0 s H  u  pxXpR                  X5      _M     snnUl        UR                  (       a*  [        R                   " U[         R                  " SS5      S9  U R#                  5         g s  snnf )Nr   rZ   zgame_pig/roll.oggzludo-you-rollz	ludo-rollr  zludo-you-no-moveszludo-no-movesr   r   r   r   r   )r   r   rT   r  broadcast_personal_lr  r   len_move_token_after_mover   r   r  r4   r|   r   r   update_all_menus)	r   r   rX  r%  r  r   r   idxr   s	            r+   r   LudoGame._action_roll_dice  s@   "(1-+,!!	 	" 	
 ,,[..I%%#
 NNx=A[1+a.$..I[)}}[) $$GO$
GOC%%e44x$
  ==vV^^B-CD$
s    E2c                     UnU R                  U5      nUb  XCR                  ;  a  g 0 Ul        UR                  U   nU R                  X5U R                  5        U R                  U5        g r  )rZ  r4   r2   r`  rT   ra  )r   r   rX  r%  r-  r   s         r+   r   LudoGame._action_move_token  se    "(33I>+5M5M"M#% "";/T^^<%r*   c                     UR                  S5      (       a3   [        UR                  S5      S   5      nSUs=::  a  S::  a   US-
  $   g g ! [         a     g f = f)Nr   _r   rw   )
startswithr(   split
ValueError)r   rX  r   s      r+   rZ  !LudoGame._token_index_from_action  sf    .."9??3#7#;< L%A%#a'' &	  s   A 
AAc                 6   U R                  U5      nU(       d  g UR                  n/ nU R                   H  n[        U[        5      (       d  M  UR                  [        R                  " USUR                  UR                  UR                  S95        UR                   H#  nUR                  U R                  Xt5      5        M%     M     U R                  S:  a/  UR                  [        R                  " USU R                  S95        U R                  X5        g )Nzludo-board-player)r   r/   r  r   zludo-last-rollr]  )r   r   rI   r   r-   r  r   r   r{   r/   r3   r2   r  rT   
status_box)r   r   rX  r   r   linesr   r   s           r+   r   LudoGame._action_check_board  s    }}V$Aa,,LL  '66''-- T11%@A "  >>ALL))&2BXY&r*   c                 ^   [         R                  " US5      /nU R                  (       d  U$ [        U R                  R	                  SSS9S5       HY  u  pEU R                  R                  XR5      n[         R                  " USUR                  S9nUR                  U SU SU 35        M[     U$ )	z-Format end screen with finished token counts.zgame-final-scoresT)by_score
descendingr   zgame-points)countz. z: )r   r   r   r   get_sorted_teamsget_team_nametotal_scorer  )r   resultr   rp  indexteamr{   pointss           r+   format_end_screenLudoGame.format_end_screen  s    !!&*=>?!!L$//$/OQR
KE %%33DAD!%%fm4CSCSTFLLE7"TF"VH56
 r*   c                    SSK J n  [        R                  " U R                  5      u  p#n[	        U R                  5       U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S.S9$ s  snf )	z*Build game result with winner information.r   )datetimeis_virtual_botF)rz   player_namer|   r  N)winner_namefinal_scores)	game_type	timestampduration_ticksplayer_resultscustom_data)r  r   	summarizer   r   rl   now	isoformatsound_scheduler_tickr   r   r~   r{   r|   getattrrw  )r   r  sorted_teamswinnerr  r   s         r+   build_game_resultLudoGame.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[ ,
 	
s   8?C"spacesc           	      D   U R                  U5      nU(       a  UR                  OSnUR                  S:X  ap  SUl        U R                  U5      Ul        U R                  SUR                  UR                  UR                  S9  U R                  S5        U R                  X5        g UR                  S:X  Ga  U R                  U5      nUR                  U-   nUR                  U::  Ga  Xv:  Ga  Xv-
  nXR                  :  a  SUl        U R                  Ul        U=R                  S-  sl        U R                  R                  UR                  S5        U R                  S	UR                  UR                  UR                  UR                  S
9  U R                  S5        g SUl        Xl        U R                  SUR                  UR                  UR                  S9  U R                  S5        g US-
  U R                   -  S-   Ul        U R                  SUR                  UR                  UR                  UR                  S9  U R                  S5        U R                  X5        g UR                  S:X  Ga'  U=R                  U-  sl        UR                  U R                  :  a  SUl        U R                  Ul        U=R                  S-  sl        U R                  R                  UR                  S5        U R                  S	UR                  UR                  UR                  UR                  S
9  U R                  S5        g U R                  SUR                  UR                  UR                  UR                  U R                  S9  U R                  S5        g g )Nr   r   r  zludo-enter-board)r   r/   r   zgame_dominos/play.oggr  r   zludo-home-finish)r   r/   r   r  game_pig/win.oggr  zludo-enter-homezgame_dominos/draw.oggzludo-move-track)r   r/   r   r   zludo-move-home)r   r/   r   r   r  )r   r   r   r   r   r  r{   r/   r   r  r  r   r[   r3   r   r   rY   )	r   r   r   r  r   r   
home_entrynew_pos	overshoots	            r+   r`  LudoGame._move_tokenH  s$   }}V$ $$;;& !EK!55f=EN"{{ll((	   OO34.;;'!66v>Jnnv-G~~+0D#0	 7 77",EK%)%<%<EN))Q.)&&88aH$$*%{{$ll#00!'!6!6 %  OO$67  #0EK%.N$$)%{{$ll#00	 %  OO$;<&{d.?.??1DEN!{{ll((   OO34.;;-'NNf$N~~!8!88(!%!8!8%%*%""44V[[!D  &!;; ,,,,#22 !   23  $!;; ,,,,"^^11 !   781 (r*   c                    UR                   S:  aG  U R                  S5        U R                  SUR                  UR                  S9  U R                  5         g U R                  S:X  a  U =R                  S-  sl        U R                  R                  nUS:  a  U R                  U:  az  U R                  SUR                  U R                  S	9  U R                  (       a,  U R                  U R                  5        U R                  S
5        SU l        U R                  5         g U R                  USS5        SU l        U R                  5         g U R                  5         g )Nrw   r  zludo-winner)r   r/   rZ   r   r   zludo-too-many-sixes)r   ru  r  zludo-you-extra-turnzludo-extra-turnT)r3   r  r  r{   r/   finish_gamerT   rU   rJ   r;   rW   r   r   r^  rV   )r   r   	max_sixess      r+   ra  LudoGame._after_move  s'     A%OO./]6;;fllS>>Q""a'"::I1}!7!79!D  )!;;00 ! 
 ((,,T-B-BCOO$78)*& %%%!
 #DONNr*   )rU   rV   r   rT   r   rW   )F)rb   N)Qr!   r"   r#   r$   r%   r   r5   rI   r-   r'   r8   rJ   rS   r&   rT   r(   rU   rV   rE   rW   r6   rY   r[   ra   classmethodrg   rl   ro   rs   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  tupler   r  r  r  r  r  r   r   r   r0  r5  r:  r=  rA  r   r   rH  rL  rP  rS  rV  r   r   r   rZ  r   r}  r   r  r`  ra  r)   __classcell__)r   s   @r+   rG   rG   @   s    I %d ;GT*; =G[=$5_`M49`IssJ/3d39o,3L##4KLL$s)L      &S & &      Bs B# Bt BPZ BZ I 82 	 ,(8 ' '3: '!D !T !($sDy/ "!c4i !T !Y** * *+z +c + Z D 		-7		y4d!22	3	1Z 1	 1d 1&	Y 	c 	d 	: S T%PSU^P^J_E` YY Y Y Y0F sTz "6 "j "V # #PT* 6v 6#* 66v 6#* 66v 6#* 66v 6#* 6f t !V !
 !"F " " "5f 5 55f 5 55f 5 55f 5 5
;F 
;s 
;s 
;# #3 #4 #J& &C &D &# #* '& 'S 'T '4 S	 
: 
:S9* S9Y S9 S9PT S9j *      r*   rG   )$r%   dataclassesr   r   r   baser   r   registryr   game_utils.actionsr
   r   r   game_utils.bot_helperr   game_utils.game_resultr   r   game_utils.optionsr   r   r   r   game_utils.teamsr   messages.localizationr   server.core.ui.keybindsr   botr   r   r-   r8   rG   r    r*   r+   <module>r     s    2 (   $ ? ? . > R R 1 1 0     ? ? ? +  4 {	t {	  {	r*   