Current section

Files

Jump to
islands_engine lib islands engine tally.ex
Raw

lib/islands/engine/tally.ex

defmodule Islands.Engine.Tally do
@moduledoc false
use PersistConfig
alias __MODULE__
alias Islands.Engine.Tally.Score
alias Islands.Engine.{Game, Grid, Server, State}
@enforce_keys [
:game_state,
:player1_state,
:player2_state,
:request,
:response,
:board,
:guesses,
:board_score,
:guesses_score
]
defstruct [
:game_state,
:player1_state,
:player2_state,
:request,
:response,
:board,
:guesses,
:board_score,
:guesses_score
]
@type t :: %Tally{
game_state: State.game_state(),
player1_state: State.player_state(),
player2_state: State.player_state(),
request: Server.request(),
response: Server.response(),
board: Grid.t(),
guesses: Grid.t(),
board_score: {atom, non_neg_integer, non_neg_integer},
guesses_score: {atom, non_neg_integer, non_neg_integer}
}
@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(),
board_score: game[player_id].board |> Score.for(),
guesses_score: game[player_id].guesses |> Score.for()
}
end
def new(_game, _player_id), do: {:error, :invalid_tally_args}
end