
    Iix                     N    S r SSKJr  \(       a  SSKJr  SSKJr   " S S5      rg)	z8Mixin providing turn management functionality for games.    )TYPE_CHECKING   )Player)Userc                       \ rS rSrSr\SS j5       r\R                  SS j5       rSS\S	   S
\	SS4S jjr
SS\	SS4S jjrSS\SS4S jjrSS jrSS jrSS\	SS4S jjrSS\SS4S jjr\S\S	   4S j5       rSrg)TurnManagementMixin
   aL  Manage turn order, skips, and turn announcements.

Expected Game attributes:
    turn_player_ids: list[str].
    turn_index: int.
    turn_direction: int.
    turn_skip_count: int.
    get_player_by_id(player_id) -> Player | None.
    get_user(player) -> User | None.
    broadcast_l(message_id, **kwargs).
    rebuild_all_menus().
returnPlayer | Nonec                     U R                   (       d  gU R                  [        U R                   5      -  nU R                   U   nU R                  U5      $ )z?Get the current player based on turn_index and turn_player_ids.N)turn_player_ids
turn_indexlenget_player_by_id)selfindex	player_ids      Fc:\Users\dbart\PlayPalace11\server\game_utils\turn_management_mixin.pycurrent_player"TurnManagementMixin.current_player   sJ     ###d&:&:";;((/	$$Y//    Nc                     Ub  UR                   U R                  ;  a  gU R                  R                  UR                   5      U l        g)z.Set the current player by updating turn_index.N)idr   r   r   r   players     r   r   r   !   s9     >VYYd.B.BB..44VYY?r   playersr   reset_indexc                 n    U Vs/ s H  o3R                   PM     snU l        U(       a  SU l        ggs  snf )zSet the list of players in turn order.

Args:
    players: List of players to include in turn rotation.
    reset_index: If True, reset turn_index to 0.
r   N)r   r   r   )r   r   r   ps       r   set_turn_players$TurnManagementMixin.set_turn_players(   s1     /66gg6DO   7s   2announcec                 J   U R                   (       d  g/ nU R                  S:  a  U =R                  S-  sl        U R                  U R                  -   [	        U R                   5      -  U l        U R
                  nU(       a  UR                  U5        U R                  S:  a  M  U H  nU R                  U5        M     U R                  U R                  -   [	        U R                   5      -  U l        U(       a  U R                  5         U R                  5         U R
                  $ )zAdvance to the next player's turn (respects turn_direction and skips).

Args:
    announce: If True, announce the turn and play sound.

Returns:
    The new current player.
Nr      )
r   turn_skip_countr   turn_directionr   r   appendon_player_skippedannounce_turnrebuild_all_menus)r   r"   skipped_playersskippeds       r   advance_turn TurnManagementMixin.advance_turn3   s     ## +-""Q&  A% #1D1DDDL`L`HaaDO))G&&w/ ""Q& 'G""7+ '  ??T-@-@@CH\H\D]]  """r   countc                 .    U =R                   U-  sl         g)zkQueue players to be skipped on next turn advance.

Args:
    count: Number of players to skip (default 1).
N)r%   )r   r/   s     r   skip_next_players%TurnManagementMixin.skip_next_playersS   s     	%r   c                 8    U R                  SUR                  S9  g)ztCalled when a player is skipped. Override to customize announcement.

Args:
    player: The player who was skipped.
zgame-player-skipped)r   N)broadcast_lnamer   s     r   r(   %TurnManagementMixin.on_player_skipped[   s     	.v{{Cr   c                 .    U =R                   S-  sl         g)z2Reverse the turn direction (forward <-> backward).N)r&   )r   s    r   reverse_turn_direction*TurnManagementMixin.reverse_turn_directionc   s    r!r   c                 ^    SU l         SU l        SU l        U(       a  U R                  5         gg)ziReset to the first player in turn order.

Args:
    announce: If True, announce the turn and play sound.
r   r$   N)r   r&   r%   r)   )r   r"   s     r   reset_turn_order$TurnManagementMixin.reset_turn_orderg   s/        r   
turn_soundc                     U R                   nU(       d  gU R                  U5      nU(       a>  UR                  R                  SU R	                  5       S9(       a  UR                  U5        U R                  USS5        g)z:Announce the current player's turn with sound and message.Nplay_turn_sound)	game_typezgame-your-turnzgame-turn-start)r   get_userpreferencesget_effectiveget_type
play_soundbroadcast_personal_l)r   r>   r   users       r   r)   !TurnManagementMixin.announce_turns   sk    $$ }}V$D$$223DPTP]P]P_2`OOJ' 	!!&*:<MNr   c                 r    U R                    Vs/ s H  nU R                  U5      =nc  M  UPM     sn$ s  snf )z&Get the list of players in turn order.)r   r   )r   r   r   s      r   turn_players TurnManagementMixin.turn_players   sB    
 "11
1	**955 1
 	
 
s   44)r&   r   r   r%   )r
   r   )r   r   r
   N)T)r$   )r   r   r
   N)r
   N)F)zgame_pig/turn.ogg)__name__
__module____qualname____firstlineno____doc__propertyr   setterlistboolr    r-   intr1   r(   r9   r<   strr)   rK   __static_attributes__ r   r   r   r   
   s     0 0 @ @	 X 	 T 	 UY 	 #T #_ #@&s &4 &D"
! 
!$ 
!O Od O 
d8n 
 
r   r   N)rQ   typingr   
games.baser   server.core.users.baser   r   rY   r   r   <module>r]      s     >  #+~
 ~
r   