diff --git a/apps/bear_necessities_web/lib/bear_necessities_web/live/game.ex b/apps/bear_necessities_web/lib/bear_necessities_web/live/game.ex index 5b854fd..a8e95de 100644 --- a/apps/bear_necessities_web/lib/bear_necessities_web/live/game.ex +++ b/apps/bear_necessities_web/lib/bear_necessities_web/live/game.ex @@ -2,8 +2,6 @@ defmodule BearNecessitiesWeb.Game do use Phoenix.LiveView require Logger - @action_keys ["ArrowRight", "ArrowLeft", "ArrowUp", "ArrowDown"] - alias BearNecessitiesWeb.Playfield def render(assigns) do @@ -11,6 +9,7 @@ defmodule BearNecessitiesWeb.Game do end def mount(_session, %{id: id} = socket) do + pid = Player.setup_player() field = Game.get_field(id) players = Game.get_players() @@ -20,6 +19,8 @@ defmodule BearNecessitiesWeb.Game do |> assign(:viewport, []) |> assign(:pos_x, nil) |> assign(:pos_y, nil) + |> assign(:set_setting, false) + |> assign(:player_id, pid) |> assign(:field, field) |> assign(:players, players) |> assign(:bear, %Bear{started: false}) @@ -48,10 +49,8 @@ defmodule BearNecessitiesWeb.Game do {:noreply, socket} end - def handle_event("key_move", key, %{id: id} = socket) - when key in @action_keys do - bear = Player.move(id, move_to(key)) - + def handle_event("key_move", key, %{id: id, assigns: %{player_id: pid}} = socket) do + bear = Player.move(id, pid, key) viewport = ViewPort.get_viewport(id) socket = @@ -63,7 +62,17 @@ defmodule BearNecessitiesWeb.Game do {:noreply, socket} end - def handle_event("key_move", _, socket) do + def handle_event("set_setting", value, socket) do + socket = assign(socket, :set_setting, Player.set_setting(value)) + {:noreply, socket} + end + + def handle_event( + "set_movement", + key, + %{assigns: %{player_id: pid, set_setting: set_setting}} = socket + ) do + socket = assign(socket, :set_setting, Player.update_movement(pid, key, set_setting)) {:noreply, socket} end @@ -84,9 +93,4 @@ defmodule BearNecessitiesWeb.Game do reason end - - def move_to("ArrowRight"), do: :right_arrow - def move_to("ArrowLeft"), do: :left_arrow - def move_to("ArrowUp"), do: :up_arrow - def move_to("ArrowDown"), do: :down_arrow end diff --git a/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/scoreboard.html.leex b/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/scoreboard.html.leex index 577988b..20435f2 100644 --- a/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/scoreboard.html.leex +++ b/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/scoreboard.html.leex @@ -10,5 +10,4 @@ <% end %> <% end %> - diff --git a/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/template.html.leex b/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/template.html.leex index 9f15204..f3ef7a9 100644 --- a/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/template.html.leex +++ b/apps/bear_necessities_web/lib/bear_necessities_web/templates/playfield/template.html.leex @@ -1,46 +1,51 @@ -<%= if @bear.started do %> - -
-
-

Hello, <%= @bear.display_name %>

- X: <%= @pos_x %> - Y: <%= @pos_y %> - - - - - +<%= if @set_setting == false do %> + <%= if @bear.started do %> + +
+
+

Hello, <%= @bear.display_name %>

+ X: <%= @pos_x %> + Y: <%= @pos_y %> + + +
+ +
+ <%= for row <- @viewport do %> +
+ <%= for tile <- row do %> +
+
+
+ <% end %> +
+ <% end %> +
-
- <%= for row <- @viewport do %> -
- <%= for tile <- row do %> -
-
-
- <% end %> -
- <% end %> -
-
+ <% else %> -<% else %> +
+

Bear
Necessities

-
-

Bear
Necessities

+ - + <%= form_tag "#", [phx_submit: :start] do %> + <%= label(:player, :display_name, "What is Your Name?") %> +


+ <%= text_input(:player, :display_name, value: "Player1", class: "input") %> + + <%= submit("Start", phx_disable_with: "Starting...", class: "button red") %> + <% end %> +
+ <% end %> +<% end %> - <%= form_tag "#", [phx_submit: :start] do %> - <%= label(:player, :display_name, "What is Your Name?") %> -


- <%= text_input(:player, :display_name, value: "Player1", class: "input") %> - <%= submit("Start", phx_disable_with: "Starting...", class: "button red") %> - <% end %> +<%= BearNecessitiesWeb.Playfield.render("scoreboard.html", assigns) %> +<%= if @set_setting != false do %> +
+ Set key for <%= @set_setting %>
<% end %> - -<%= BearNecessitiesWeb.Playfield.render("scoreboard.html", assigns) %> diff --git a/apps/game/lib/player.ex b/apps/game/lib/player.ex index 8a9dc22..5eb6927 100644 --- a/apps/game/lib/player.ex +++ b/apps/game/lib/player.ex @@ -2,37 +2,68 @@ defmodule Player do use GenServer require Logger - defstruct [:display_name, :score, :bear] + @default_actions %{ + "ArrowUp" => "up", + "ArrowDown" => "down", + "ArrowLeft" => "left", + "ArrowRight" => "right" + } + + defstruct actions: @default_actions def start_link(default) when is_list(default) do GenServer.start_link(__MODULE__, default, name: __MODULE__) end @impl true - def init([]) do - {:ok, []} + def init(opts \\ %{}) do + {:ok, %Player{}} end @impl true - def handle_call({:action, user_input, id}, _pid, _) do + def handle_call({:update_movement, key, direction}, _pid, %{actions: actions} = state) do + actions = Map.update(actions, key, "up", fn _ -> direction end) + {:reply, actions, %{state | actions: actions}} + end + + @impl true + def handle_call({:action, user_input, id}, _pid, %{actions: actions} = state) do bear = - case user_input do - :up_arrow -> Bear.move(id, :up) - :down_arrow -> Bear.move(id, :down) - :left_arrow -> Bear.move(id, :left) - :right_arrow -> Bear.move(id, :right) + case Map.get(actions, user_input) do + "up" -> Bear.move(id, :up) + "down" -> Bear.move(id, :down) + "left" -> Bear.move(id, :left) + "right" -> Bear.move(id, :right) :space -> Bear.claw(id) + _ -> Game.get_bear(id) end - {:reply, bear, []} + {:reply, bear, state} end - def move(player_id, way) do - GenServer.call(Player, {:action, way, player_id}) + def move(player_id, pid, key) do + GenServer.call(pid, {:action, key, player_id}) end - def start(display_name, id) do - Player.start_link([]) + def setup_player() do + case Player.start_link([]) do + {:error, {:already_started, pid}} -> pid + pid -> pid + end + end + + def start(display_name, id, opts \\ %{}) do Game.create_bear(display_name: display_name, id: id, started: true) end + + def set_setting("false"), do: "up" + def set_setting("up"), do: "down" + def set_setting("down"), do: "left" + def set_setting("left"), do: "right" + def set_setting("right"), do: false + + def update_movement(pid, key, direction) do + GenServer.call(pid, {:update_movement, key, direction}) + set_setting(direction) + end end