Packages
islands_text_client
0.1.39
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.57
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.26
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.14
0.2.13
0.2.12
0.2.11
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.99
0.1.98
0.1.97
0.1.96
0.1.95
0.1.94
0.1.93
0.1.91
0.1.90
0.1.89
0.1.88
0.1.87
0.1.86
0.1.85
0.1.84
0.1.83
0.1.82
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
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.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.3
0.1.2
0.1.1
0.1.0
Text client for the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/text_client/input.ex
defmodule Islands.TextClient.Input do
@moduledoc false
use PersistConfig
alias Islands.TextClient.Player.React.GameOver
alias Islands.TextClient.{Prompter, State}
@type t :: String.t() | {:error, atom} | :eof
@board_range Application.get_env(@app, :board_range)
@help_message Application.get_env(@app, :help_message)
@invalid_move_message Application.get_env(@app, :invalid_move_message)
@island_type_codes Application.get_env(@app, :island_type_codes)
@spec check(t, State.t()) :: State.t() | no_return
def check({:error, reason}, state) do
GameOver.end_game(["Game ended: #{reason}"], state)
end
def check(:eof, state) do
GameOver.end_game(["Looks like you gave up."], state)
end
def check(input, %State{} = state) do
input
|> String.split()
|> case do
[code, row, col] when code in @island_type_codes ->
with {row, ""} when row in @board_range <- Integer.parse(row),
{col, ""} when col in @board_range <- Integer.parse(col),
do: put_in(state.move, [code, row, col]),
else: (_ -> Prompter.accept_move(state, @invalid_move_message))
[row, col] ->
with {row, ""} when row in @board_range <- Integer.parse(row),
{col, ""} when col in @board_range <- Integer.parse(col),
do: put_in(state.move, [row, col]),
else: (_ -> Prompter.accept_move(state, @invalid_move_message))
[] ->
row = Enum.random(@board_range)
col = Enum.random(@board_range)
put_in(state.move, [row, col])
[move] when move in ["all", "set", "stop"] ->
put_in(state.move, [move])
["help"] ->
Prompter.accept_move(state, @help_message)
_other ->
Prompter.accept_move(state, @invalid_move_message)
end
end
end