defmodule Islands.Engine.Tally do @moduledoc false use PersistConfig alias __MODULE__ alias Islands.Engine.{Game, Grid, State} @enforce_keys [ :game_state, :player1_state, :player2_state, :request, :response, :board, :guesses ] defstruct [ :game_state, :player1_state, :player2_state, :request, :response, :board, :guesses ] @type t :: %Tally{ game_state: State.game_state(), player1_state: State.player_state(), player2_state: State.player_state(), request: Game.request(), response: Game.response(), board: Grid.t(), guesses: Grid.t() } @player_ids Application.get_env(@app, :player_ids) @spec new(Game.t(), Game.player_id()) :: t def new(%Game{} = game, player_id) when player_id in @player_ids do %Tally{ game_state: game.state.game, player1_state: game.state.player1, player2_state: game.state.player2, request: game.request, response: game.response, board: game[player_id].board |> Grid.new(), guesses: game[player_id].guesses |> Grid.new() } end def new(_game, _player_id), do: {:error, :invalid_tally_args} end