1<?php ...
 2 
 3namespace Thunk\Verbs\Examples\Monopoly\States;
 4 
 5use Carbon\CarbonImmutable;
 6use Illuminate\Support\Collection;
 7use Thunk\Verbs\Examples\Monopoly\Game\Bank;
 8use Thunk\Verbs\Examples\Monopoly\Game\Board;
 9use Thunk\Verbs\Examples\Monopoly\Game\Phase;
10use Thunk\Verbs\State; 
11 
12class GameState extends State
13{
14    public bool $started = false;
15 
16    public Board $board;
17 
18    public Bank $bank;
19 
20    public array $player_ids = [];
21 
22    public ?int $active_player_id = null;
23 
24    public Phase $phase = Phase::Move;
25 
26    public bool $phase_complete = false;
27 
28    public ?array $last_roll = null;
29 
30    public CarbonImmutable $started_at;
31 
32    /** @return Collection<int, PlayerState> */
33    public function players(): Collection
34    {
35        return collect($this->player_ids)->map(fn (int $id) => PlayerState::load($id));
36    }
37 
38    public function activePlayer(): ?PlayerState
39    {
40        return $this->active_player_id ? PlayerState::load($this->active_player_id) : null;
41    }
42 
43    public function hasPlayer(PlayerState|int $player): bool
44    {
45        if ($player instanceof PlayerState) {
46            $player = $player->id;
47        }
48 
49        return in_array($player, $this->player_ids);
50    }
51 
52    public function moveToNextPlayer(): static
53    {
54        $active_index = array_search($this->active_player_id, $this->player_ids);
55 
56        $this->active_player_id = $this->player_ids[$active_index + 1] ?? $this->player_ids[0];
57 
58        return $this;
59    }
60}