nodes/turn.pyΒΆ

Part of Tanks of Freedom.

 1"""TurnManager: alternates blue / red turns, tracks game-over state.
 2
 3Pure state: visual feedback (HUD label, end-turn flash) is the world's job.
 4"""
 5
 6from __future__ import annotations
 7
 8from enum import Enum, auto
 9
10from simvx.core import Signal
11
12from .data import PLAYER_BLUE, PLAYER_RED
13
14
15class GameState(Enum):
16    PLAYER_TURN = auto()
17    AI_TURN = auto()
18    GAME_OVER = auto()
19
20
21class TurnManager:
22    def __init__(self):
23        self.current = PLAYER_BLUE
24        self.turn_number = 1
25        self.state = GameState.PLAYER_TURN
26        self.winner: int | None = None
27        self.turn_started = Signal()  # (player)
28        self.turn_ended = Signal()  # (player)
29        self.game_over = Signal()  # (winner)
30
31    def end_turn(self) -> None:
32        self.turn_ended(self.current)
33        if self.state == GameState.GAME_OVER:
34            return
35        if self.current == PLAYER_BLUE:
36            self.current = PLAYER_RED
37            self.state = GameState.AI_TURN
38        else:
39            self.current = PLAYER_BLUE
40            self.state = GameState.PLAYER_TURN
41            self.turn_number += 1
42        self.turn_started(self.current)
43
44    def declare_winner(self, player: int) -> None:
45        self.winner = player
46        self.state = GameState.GAME_OVER
47        self.game_over(player)