
    Ii                    :    S r SSKJr  SSKJr   " S S5      rS/rg)z@Mixin for games structured as rounds of sequential player turns.    )annotations)ClassVarc                      \ rS rSr% SrSrS\S'   SrS\S'   SS	 jrSS
 jr	SS jr
SS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)RoundBasedGameMixin   a  Shared lifecycle for round-based turn-taking games.

Provides default implementations for:
    - on_start(): Initialize game state and start first round.
    - _start_round(): Increment round counter, reset turn order, announce.
    - _start_turn(): Reset player state, announce turn, set up bots, rebuild menus.
    - _on_turn_end(): Advance to next player or end round.

Games override hooks to customize behavior:
    - get_team_mode(): Return team mode string (default "individual").
    - should_reset_all_scores(): Whether to reset TeamManager scores on start.
    - _reset_player_for_game(player): Per-player init at game start.
    - _reset_player_for_round(player): Per-player init at round start.
    - _reset_player_for_turn(player): Per-player init at turn start.
    - _announce_turn_start(player): Custom turn announcement.
    - _setup_bot_for_turn(player): Bot initialization at turn start.

Games MUST implement:
    - _on_round_end(): Handle end of a round (too divergent to share).
zgame_pig/roundstart.oggzClassVar[str | None]round_start_soundzgame_pig/mus.oggzClassVar[str]
game_musicc                    g)z3Return the team mode string. Default: "individual".
individual selfs    Gc:\Users\dbart\PlayPalace11\server\game_utils\round_based_game_mixin.pyget_team_mode!RoundBasedGameMixin.get_team_mode%   s        c                    g)z6Return True to reset TeamManager scores on game start.Fr   r   s    r   should_reset_all_scores+RoundBasedGameMixin.should_reset_all_scores)   s    r   c                    g)z<Reset per-player state at game start. Override in each game.Nr   r   players     r   _reset_player_for_game*RoundBasedGameMixin._reset_player_for_game-       r   c                    g)z6Reset per-player state at round start. Default: no-op.Nr   r   s     r   _reset_player_for_round+RoundBasedGameMixin._reset_player_for_round0   r   r   c                    g)z<Reset per-player state at turn start. Override in each game.Nr   r   s     r   _reset_player_for_turn*RoundBasedGameMixin._reset_player_for_turn3   r   r   c                $    U R                  5         g)z@Announce the start of a player's turn. Default: announce_turn().N)announce_turnr   s     r   _announce_turn_start(RoundBasedGameMixin._announce_turn_start6   s    r   c                    g)z3Set up bot AI for the current turn. Default: no-op.Nr   r   s     r   _setup_bot_for_turn'RoundBasedGameMixin._setup_bot_for_turn:   r   r   c                    [        S5      e)z8Handle end of a round. Must be implemented by each game.z$Games must implement _on_round_end())NotImplementedErrorr   s    r   _on_round_end!RoundBasedGameMixin._on_round_end=   s    !"HIIr   c                
   SU l         SU l        SU l        U R                  5       nU R	                  U5        U R                  5       U R                  l        U R                  R                  U Vs/ s H  o"R                  PM     sn5        U R                  5       (       a  U R                  R                  5         U H  nU R                  U5        M     U R                  U R                  5        U R                  5         gs  snf )z,Initialize game state and start first round.playingTr   N)statusgame_activeroundget_active_playersset_turn_playersr   _team_manager	team_modesetup_teamsnamer   reset_all_scoresr   
play_musicr	   _start_round)r   active_playerspr   s       r   on_startRoundBasedGameMixin.on_startE   s    
002n-'+'9'9';$&&'G1'GH''))//1$F''/ % 	( (Hs   /D c                h   U =R                   S-  sl         U R                  U R                  5       5        U R                  (       a  U R	                  U R                  5        U R                  SU R                   S9  U R                  5        H  nU R                  U5        M     U R                  5         g)zStart a new round.   zgame-round-start)r1   N)r1   r3   r2   r   
play_soundbroadcast_lr   _start_turnr   s     r   r:    RoundBasedGameMixin._start_roundZ   s    

a
d5578!!OOD223+4::>--/F((0 0 	r   c                    U R                   nU(       d  gU R                  U5        U R                  U5        U R                  U5        U R	                  5         g)zStart a player's turn.N)current_playerr    r$   r'   rebuild_all_menusr   s     r   rC   RoundBasedGameMixin._start_turni   sI    $$##F+!!&)  ( r   c                    U R                   [        U R                  5      S-
  :  a  U R                  5         gU R	                  SS9  U R                  5         g)z,Advance to next player or trigger round end.r@   F)announceN)
turn_indexlenturn_playersr+   advance_turnrC   r   s    r   _on_turn_end RoundBasedGameMixin._on_turn_endt   sG    ??c$"3"34q88 u-r   )r0   r1   r/   N)returnstr)rQ   bool)rQ   None)__name__
__module____qualname____firstlineno____doc__r   __annotations__r	   r   r   r   r   r    r$   r'   r+   r=   r:   rC   rO   __static_attributes__r   r   r   r   r      sa    * /H+G 2J2KEKBJ*	!r   r   N)rY   
__future__r   typingr   r   __all__r   r   r   <module>r_      s%    F " r rj !
!r   