
    IiQ,                         S r SSKJrJr  \(       a  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  SS
KJr  / SQr " S S5      rg)z0Mixin providing lobby action handlers for games.    )TYPE_CHECKINGAny   Player)User   )ResolvedAction)MenuItemEscapeBehavior)Bot)Localization)AliceBobCharlieDianaEveFrankGraceHenryIvyJackKateLeoMiaNoahOliviaPeteQuinnRoseSamTinaUmaVicWendyXanderYaraZackc            	       ^   \ rS rSrSrSSS\SS4S jrSSS\S-  4S	 jrSSS
\S\SS4S jrSSS\SS4S jr	SSS\SS4S jr
SSS\SS4S jrS!S jrSSS\SS4S jrSSS\SS4S jrS"S jrS\SSSS4S jrS\4S jrS\4S jrS#S\S\S\SS4S jjrS\SSSS4S jrS\SSSS4S jrS rg)$LobbyActionsMixin.   a  Handle lobby actions and player lifecycle management.

Expected Game attributes:
    status: str.
    host: str.
    players: list[Player].
    _table: Table reference.
    _users: dict.
    _destroyed: bool.
    _actions_menu_open: set[str].
    player_action_sets: dict.
    get_user(player) -> User | None.
    broadcast_l(), broadcast_sound().
    prestart_validate(), on_start().
    attach_user(), rebuild_all_menus().
    get_all_enabled_actions().
    _get_keybind_for_action().
    setup_keybinds(), setup_player_actions().
playerr   	action_idreturnNc                    U R                  5       nU(       aJ  U HC  n[        U[        5      (       a  Uu  pVU R                  " U4SS0UD6  M3  U R                  USS9  ME     gU R                  S5        U R	                  5         g)zStart the game.buffertable)r0   Nzgame-starting)prestart_validate
isinstancetuplebroadcast_lon_start)selfr,   r-   errorserror	error_keykwargss          Dc:\Users\dbart\PlayPalace11\server\game_utils\lobby_actions_mixin.py_action_start_game$LobbyActionsMixin._action_start_gameC   s     '')eU++(-%I$$YIwI&I$$U7$;    	) 	    c                 8   ^  [        U 4S j[         5       S5      $ )z Get bot name for add_bot action.c              3      >#    U  HN  oR                  5       TR                   Vs1 s H  o"R                  R                  5       iM     sn;  d  MJ  Uv   MP     g s  snf 7fNlowerplayersname.0nxr7   s      r<   	<genexpr>7LobbyActionsMixin._bot_input_add_bot.<locals>.<genexpr>Z   s<     ]	1WWYt||6\|!vv||~|6\%\QQ	6\   "A#AAAN)next	BOT_NAMES)r7   r,   s   ` r<   _bot_input_add_bot$LobbyActionsMixin._bot_input_add_botW   s    ]	]
 	
r?   bot_namec                   ^  UR                  5       (       dK  [        U 4S j[         5       S5      nU(       d*  T R                  U5      nU(       a  UR	                  S5        g[        U5      nT R                  UR                  USS9nT R                  R                  U5        T R                  UR                  U5        T R                  U5        T R                  SUS9  T R                  S5        T R                  5         g)	z!Add a bot with the selected name.c              3      >#    U  HN  oR                  5       TR                   Vs1 s H  o"R                  R                  5       iM     sn;  d  MJ  Uv   MP     g s  snf 7frB   rC   rG   s      r<   rK   4LobbyActionsMixin._action_add_bot.<locals>.<genexpr>c   sA     aIqSWS_S_:`S_a66<<>S_:`)`I:`rM   Nzno-bot-names-availableTis_botztable-joinedr,   zjoin.ogg)striprN   rO   get_userspeak_lr   create_playeruuidrE   appendattach_useridsetup_player_actionsr5   broadcast_soundrebuild_all_menus)r7   r,   rR   r-   userbot_user
bot_players   `      r<   _action_add_bot!LobbyActionsMixin._action_add_bot^   s     ~~aIaH }}V,LL!9:x=''x'M
J'1!!*-9Z( r?   c                    [        [        U R                  5      S-
  SS5       H  nU R                  U   R                  (       d  M#  U R                  R	                  U5      nU R
                  R	                  UR                  S5        U R                  R	                  UR                  S5        U R                  SUR                  S9  U R                  S5          O   U R                  5         g)z"Remove the last bot from the game.r	   N
table-leftrX   	leave.ogg)rangelenrE   rW   popplayer_action_setsr`   _usersr5   rF   rb   rc   )r7   r,   r-   ibots        r<   _action_remove_bot$LobbyActionsMixin._action_remove_botw   s    s4<<(1,b"5A||A%%%ll&&q)''++CFFD9-  chh ?$$[1 6 	 r?   c                 B   U R                   S:w  a  gUR                  (       + Ul        UR                  (       a,  U R                  SUR                  S9  U R	                  S5        O+U R                  SUR                  S9  U R	                  S5        U R                  5         g)z#Toggle spectator mode for a player.waitingNznow-spectatingrX   zjoin_spectator.oggznow-playingleave_spectator.ogg)statusis_spectatorr5   rF   rb   rc   r7   r,   r-   s      r<   _action_toggle_spectator*LobbyActionsMixin._action_toggle_spectator   s    ;;)#"("5"55-fkkB  !56]6;;?  !67 r?   c                 n   U R                  U5      nU(       d  gSU R                  UR                  '   UR                  S5        [	        [
        R                  " UR                  S5      SS9[	        [
        R                  " UR                  S5      SS9/nUR                  SUS	[        R                  S
9  g)z0Prompt for confirmation before leaving the game.Nleave_game_confirmzconfirm-leave-gamez
confirm-nonotextr`   zconfirm-yesyesFmultiletterescape_behavior)rZ   _pending_actionsr`   r[   r   r   getlocale	show_menur   SELECT_LAST)r7   r,   r-   rd   itemss        r<   _action_leave_game$LobbyActionsMixin._action_leave_game   s    }}V$+?fii()*,**4;;E$O,**4;;F5Q
 	 *66	 	 	
r?   c                    UR                   (       a  U R                   Vs/ s H   o"R                  UR                  :w  d  M  UPM"     snU l        U R                  R	                  UR                  S5        U R
                  R	                  UR                  S5        U R                  SUR                  S9  U R                  S5        U R                  5         gU R                  S:X  a  UR                  (       d  SUl        U R
                  R	                  UR                  S5        [        UR                  UR                  S9nU R                  UR                  U5        U R                  SUR                  S9  U R                  S	5        [        S
 U R                   5       5      nU(       d  U R                  5         ggU R                   Vs/ s H   o"R                  UR                  :w  d  M  UPM"     snU l        U R                  R	                  UR                  S5        U R
                  R	                  UR                  S5        U R                  SUR                  S9  U R                  S	5        [        S U R                   5       5      nU(       d  U R                  5         gU R                  S:X  a  UR                  U R                   :X  ab  U R                  (       aQ  U R                   HA  nUR                  (       a  M  UR                  U l        U R                  SUR                  S9    O   U R                  5         ggs  snf s  snf )zLeave the game.Nzspectator-leftrX   rx   playingT)r]   zplayer-replaced-by-botrl   c              3   B   #    U  H  oR                   (       + v   M     g 7frB   rV   rH   ps     r<   rK   8LobbyActionsMixin._perform_leave_game.<locals>.<genexpr>   s     @<a\\<   rk   c              3   B   #    U  H  oR                   (       + v   M     g 7frB   rV   r   s     r<   rK   r      s     <|!XX|r   rw   znew-host)rz   rE   r`   rp   ro   rq   r5   rF   rb   rc   ry   rW   r   r_   anydestroyhost)r7   r,   r   re   
has_humanss        r<   _perform_leave_game%LobbyActionsMixin._perform_leave_game   sg    '+||I|!ttvyy7HA|IDL##''		48KKOOFIIt,-fkkB  !67""$;;)#FMM !FMKKOOFIIt, 6;;VYY7HVYY15fkkJ  - @4<<@@J  $(<<E<a446993D<E##FIIt4		4(fkk:[) <t||<<
LLN;;)#{{dii'DLLA888$%FF	((AFF(C	 & ""$ $_ JB Fs   MMM
.M
c                    / nU R                  U5       H~  nUR                  nU R                  UR                  R                  5      nU(       a  USUR                  5        S3-  nUR                  [        XTR                  R                  S95        M     U R                  U5      nU(       a  U(       a  UR                  [        [        R                  " UR                  S5      SS95        U R                  R                  UR                  5        UR                  S5        UR                  SUS[         R"                  S	9  gU(       a  UR                  S
5        gg)zShow the actions menu.z ()r   backgo_backzcontext-menuactions_menuTr   zno-actions-availableN)get_all_enabled_actionslabel_get_keybind_for_actionactionr`   upperr^   r   rZ   r   r   r   _actions_menu_openaddr[   r   r   r   )r7   r,   r-   r   resolvedr   keybind_keyrd   s           r<   _action_show_actions_menu+LobbyActionsMixin._action_show_actions_menu   s   44V<HNNE66x7I7IJK2k//12!44LLu1C1CDE = }}V$ELL|'7'7V'LQZ[\##''		2LL(NN  . : :	   LL/0 r?   c                 r    U R                   (       a&  U R                   R                  UR                  5        gg)zBSave the current table state (host only). This destroys the table.N)_tablesave_and_closerF   r{   s      r<   _action_save_table$LobbyActionsMixin._action_save_table   s$    ;;KK&&v{{3 r?   c                 j    SU l         U R                  (       a  U R                  R                  5         gg)z'Request destruction of this game/table.TN)
_destroyedr   r   r7   s    r<   r   LobbyActionsMixin.destroy  s%    ;;KK! r?   	host_name	host_userr   c                     Xl         SU l        U R                  5         U R                  X5        [	        U S5      (       a  U R                  5         U R                  5         g)z.Initialize the game in lobby mode with a host.rw   _reset_transcriptsN)r   ry   setup_keybinds
add_playerhasattrr   rc   )r7   r   r   s      r<   initialize_lobby"LobbyActionsMixin.initialize_lobby
  sL    		-4-..##% r?   c                 :    [        S U R                   5       5      $ )z Get the number of human players.c              3   J   #    U  H  oR                   (       a  M  S v   M     g7fr	   NrV   r   s     r<   rK   4LobbyActionsMixin.get_human_count.<locals>.<genexpr>  s     ;l((11l   #	#sumrE   r   s    r<   get_human_count!LobbyActionsMixin.get_human_count  s    ;dll;;;r?   c                 :    [        S U R                   5       5      $ )zGet the number of bot players.c              3   J   #    U  H  oR                   (       d  M  S v   M     g7fr   rV   r   s     r<   rK   2LobbyActionsMixin.get_bot_count.<locals>.<genexpr>  s     7lhh11lr   r   r   s    r<   get_bot_countLobbyActionsMixin.get_bot_count  s    7dll777r?   	player_idrF   rW   c                     SSK Jn  U" XUS9$ )zDCreate a new player. Override in subclasses for custom player types.r   r   )r`   rF   rW   )
games.baser   )r7   r   rF   rW   r   s        r<   r\   LobbyActionsMixin.create_player  s     	(f==r?   rd   c                    [        US5      =(       a    UR                  n[        USS5      nU R                  UR                  XS9nXEl        U R                  R                  U5        U R                  UR                  U5        U R                  U5        [        U S5      (       a&  U R                  R                  UR                  / 5        U$ )zAdd a player to the game.rW   is_virtual_botFrV   _transcripts)r   rW   getattrr\   r]   r   rE   r^   r_   r`   ra   r   
setdefault)r7   rF   rd   rW   r   r,   s         r<   r   LobbyActionsMixin.add_player%  s    x(8T[[ '7?##DIIt#C .F#D)!!&)4((((B7r?   c                 H   U R                  UR                  USS9nSUl        U R                  R	                  U5        U R                  UR                  U5        U R                  U5        [        U S5      (       a&  U R                  R                  UR                  / 5        U$ )zAdd a spectator to the game.FrV   Tr   )r\   r]   rz   rE   r^   r_   r`   ra   r   r   r   )r7   rF   rd   r,   s       r<   add_spectatorLobbyActionsMixin.add_spectator3  s    ##DIItE#B"F#D)!!&)4((((B7r?   )r   r   rE   ry   )r,   r   r.   N)r.   N)F)__name__
__module____qualname____firstlineno____doc__strr=   rP   rg   rt   r|   r   r   r   r   r   r   intr   r   boolr\   r   r   __static_attributes__ r?   r<   r*   r*   .   so   ( c d (
 
cDj 
!h !# !# !RV !2! !c !d !!x !C !D !
 
c 
d 
$=%~1 1S 1T 124 4c 4d 4"!# !& !T !< <8s 8>s ># >t >PX >s & X 	# 	V 	 	r?   r*   N)r   typingr   r   r   r   server.core.users.baser   actionsr
   r   r   server.core.users.botr   messages.localizationr   rO   r*   r   r?   r<   <module>r      s3    6 %#+' ; % 0	<N Nr?   