Packages
islands_engine
0.2.55
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.13
0.2.12
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.0
Models the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/engine/game_server/position_island.ex
defmodule Islands.Engine.GameServer.PositionIsland do
alias Islands.Engine.GameServer.ReplyTuple
alias Islands.Engine.GameServer
alias Islands.{Board, Coord, Game, Island, Request, State}
@spec handle_call(Request.t(), GenServer.from(), Game.t()) :: ReplyTuple.t()
def handle_call(
{:position_island = action, player_id, island_type, row, col} = request,
_from,
game
) do
with {:ok, state} <- State.check(game.state, {action, player_id}),
{:ok, origin} <- Coord.new(row, col),
{:ok, island} <- Island.new(island_type, origin),
%Board{} = board <- Game.player_board(game, player_id),
%Board{} = board <- Board.position_island(board, island) do
response = {:ok, Board.all_islands_positioned?(board) |> response()}
game
|> Game.update_board(player_id, board)
|> Game.update_state(state)
|> Game.update_request(request)
|> Game.update_response(response)
|> GameServer.save()
|> ReplyTuple.new(player_id)
else
:error ->
ReplyTuple.new(action, game, request, player_id)
{:error, reason} when is_atom(reason) ->
ReplyTuple.new(reason, game, request, player_id)
end
end
## Private functions
@spec response(boolean) :: atom
defp response(_all_islands_positioned? = true), do: :all_islands_positioned
defp response(_all_islands_positioned?), do: :island_positioned
end