
    Ii                         S r SSKJrJr  SSKJrJr  SSKJr  \(       a  SSK	J
r
  SSKJr  \ " S S5      5       r\ " S	 S
\5      5       rg)zTable management for games.    )	dataclassfield)TYPE_CHECKINGAny)DataClassJSONMixin)Game)Userc                   2    \ rS rSr% Sr\\S'   Sr\\S'   Sr	g)TableMember   z{Member of a table (player or spectator).

Attributes:
    username: Member username.
    is_spectator: True if spectating.
usernameFis_spectator N)
__name__
__module____qualname____firstlineno____doc__str__annotations__r   bool__static_attributes__r       7c:\Users\dbart\PlayPalace11\server\core\tables\table.pyr   r      s     ML$r   r   c            	       p   \ rS rSr% Sr\\S'   \\S'   \\S'   \" \S9r	\\
   \S'   Sr\S-  \S	'   S
r\\S'   \" SSS9rS\S'   \" \SS9r\\S4   \S'   \" SSS9r\\S'   \" SSS9r\\S'   \" SSS9r\\S'   S r\S6S j5       r\R.                  S7S j5       rS8S\SSS\SS4S jjrS\SS4S jrS\SS4S  jrS\SSSS4S! jrS\\
   4S" jrS\\
   4S# jr\S\4S$ j5       r S9S%\S&\SS4S' jjr!S:S(\S)\SS4S* jjr"S;S+ jr#S\S,\SS4S- jr$S;S. jr%S/\S\4S0 jr&S;S1 jr'S\SS4S2 jr(S3\SS4S4 jr)S5r*g)<Table   zGame table holding members and a game instance.

Tables track membership and forward events to the game. Role logic
(player vs spectator) is handled by the game.
table_id	game_typehost)default_factorymembersN	game_jsonwaitingstatusF)defaultreprGame | None_game)r!   r'   r	   _users_manager_server_dbc                 J    SU l         0 U l        SU l        SU l        SU l        g)z-Initialize non-serialized runtime references.N)r)   r*   r+   r,   r-   selfs    r   __post_init__Table.__post_init__0   s%    
r   returnc                     U R                   $ )z!Return the current game instance.)r)   r/   s    r   game
Table.game8   s     zzr   c                 J    Xl         U(       a  UR                  5       U l        gg)z2Set the game instance and update serialized state.Nr)   to_jsonr#   )r0   values     r   r5   r6   =   s     
"]]_DN r   r   useras_spectatorc                     U R                    H  nUR                  U:X  d  M    g   U R                   R                  [        XS95        X R                  U'   g)zAdd a member to the table.

Args:
    username: Member username.
    user: User instance.
    as_spectator: True to join as spectator.
N)r   r   )r"   r   appendr   r*   )r0   r   r;   r<   members        r   
add_memberTable.add_memberD   sF     llF(* # 	KUV $Hr   c                     U R                    Vs/ s H  o"R                  U:w  d  M  UPM     snU l         U R                  R                  US5        U R                   (       d  U R	                  5         ggs  snf )zRemove a member from the table.N)r"   r   r*   popdestroy)r0   r   ms      r   remove_memberTable.remove_memberT   sT    #'<<J<a::3I<J$' ||LLN 	 Ks
   A3A3zUser | Nonec                 8    U R                   R                  U5      $ )zGet a user by username.)r*   getr0   r   s     r   get_userTable.get_user]   s    {{x((r   c                      X R                   U'   g)z8Attach a user to a member (e.g., after deserialization).N)r*   )r0   r   r;   s      r   attach_userTable.attach_usera   s     $Hr   c                 j    U R                    Vs/ s H  oR                  (       a  M  UPM     sn$ s  snf )zGet all non-spectator members.r"   r   r0   rE   s     r   get_playersTable.get_playerse   s"    <<><a~~<>>>   00c                 j    U R                    Vs/ s H  oR                  (       d  M  UPM     sn$ s  snf )zGet all spectator members.rQ   rR   s     r   get_spectatorsTable.get_spectatorsi   s"    <<:<a>><:::rU   c                 4    [        U R                  5       5      $ )z+Get the number of players (non-spectators).)lenrS   r/   s    r   player_countTable.player_countm   s     4##%&&r   textbufferc                 l    U R                   R                  5        H  u  p4UR                  X5        M     g)zSend a message to all members.N)r*   itemsspeak)r0   r]   r^   r   r;   s        r   	broadcastTable.broadcastr   s'    "kk//1NHJJt$ 2r   namevolumec                 h    U R                   R                  5        H  nUR                  X5        M     g)zPlay a sound for all members.N)r*   values
play_sound)r0   rd   re   r;   s       r   broadcast_soundTable.broadcast_soundw   s%    KK&&(DOOD) )r   c                 \    U R                   (       a  U R                   R                  5         gg)z$Called every tick. Forwards to game.N)r)   on_tickr/   s    r   rl   Table.on_tick|   s    ::JJ  r   eventc                     U R                   (       aK  U R                   R                   H0  nUR                  U:X  d  M  U R                   R                  X25          g   gg)zHandle an event from a member.N)r)   playersrd   handle_event)r0   r   rn   players       r   rq   Table.handle_event   sC    ::**,,;;(*JJ++F: - r   c                 f    U R                   (       a   U R                   R                  5       U l        gg)z)Save the current game state to game_json.Nr8   r/   s    r   save_game_stateTable.save_game_state   s"    ::!ZZ//1DN r   min_playersc                      U R                   U:  $ )zCheck if the game can start.)r[   )r0   rw   s     r   	can_startTable.can_start   s      K//r   c                 ^    U R                   (       a  U R                   R                  U 5        gg)z-Destroy this table. Called by Game.destroy().N)r+   on_table_destroyr/   s    r   rD   Table.destroy   s     ==MM**40 r   c                 ^    U R                   (       a  U R                   R                  X5        gg)z<Save game state and close table. Called by game save action.N)r,   on_table_saverJ   s     r   save_and_closeTable.save_and_close   s     <<LL&&t6 r   resultc                 ^    U R                   (       a  U R                   R                  U5        gg)zDSave a game result to the database. Called by game when it finishes.N)r,   on_game_result)r0   r   s     r   save_game_resultTable.save_game_result   s     <<LL''/ r   )r-   r)   r+   r,   r*   r#   r"   )r3   r(   )r:   r(   r3   N)F)misc)d   )r3   N)+r   r   r   r   r   r   r   r   listr"   r   r#   r%   r)   dictr*   r+   r   r,   r-   r1   propertyr5   setterr   r@   rF   rK   rN   rS   rW   intr[   rb   ri   rl   rq   ru   ry   rD   r   r   r   r   r   r   r   r      s
    MN
I!&t!<GT+< IsTz FC !E:E=: %d GFDfG$U3Hc3E2GS2T.C.   
[[- -%3 %f %D %UY % c d ) ) )%C %v %$ %?T+. ?;[ 1 ; 'c ' '%c %3 %D %
*C * *t *
!
S  $ 2
0S 0T 01
7s 7t 7
0s 0t 0r   r   N)r   dataclassesr   r   typingr   r   mashumaro.mixins.jsonr   server.games.baser   server.core.users.baser	   r   r   r   r   r   <module>r      sR    ! ( % 4&+ 	 	 	 E0 E0 E0r   