Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions apps/bear_necessities_web/lib/bear_necessities_web/live/game.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ defmodule BearNecessitiesWeb.Game do
use Phoenix.LiveView
require Logger

@action_keys ["ArrowRight", "ArrowLeft", "ArrowUp", "ArrowDown"]

alias BearNecessitiesWeb.Playfield

def render(assigns) do
Playfield.render("template.html", assigns)
end

def mount(_session, %{id: id} = socket) do
pid = Player.setup_player()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't the right place to do this since we don't have a socket id yet, :(

field = Game.get_field(id)
players = Game.get_players()

Expand All @@ -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})
Expand Down Expand Up @@ -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 =
Expand All @@ -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

Expand All @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@
<% end %>
</ul>
<% end %>

</div>
Original file line number Diff line number Diff line change
@@ -1,46 +1,51 @@
<%= if @bear.started do %>

<div>
<div class="gui">
<h1>Hello, <%= @bear.display_name %></h1>
<span>X: <%= @pos_x %></span>
<span>Y: <%= @pos_y %></span>
<button phx-click="left" class="button small">left</button>
<button phx-click="down" class="button small">down</button>
<button phx-click="up" class="button small">up</button>
<button phx-click="right" class="button small">right</button>
<span phx-keydown="key_move" phx-target="window"></span>
<%= if @set_setting == false do %>
<%= if @bear.started do %>

<div>
<div class="gui">
<h1>Hello, <%= @bear.display_name %></h1>
<span>X: <%= @pos_x %></span>
<span>Y: <%= @pos_y %></span>
<button phx-click="set_setting" value="<%= @set_setting %>" class="button small">Settings</button>
<span phx-keydown="key_move" phx-target="window"></span>
</div>

<div class="map">
<%= for row <- @viewport do %>
<div class="row">
<%= for tile <- row do %>
<div class="tile <%= terrain_class(tile) %> ">
<div class="sprite <%= sprite_class(tile, @id) %>"></div>
</div>
<% end %>
</div>
<% end %>
</div>
</div>

<div class="map">
<%= for row <- @viewport do %>
<div class="row">
<%= for tile <- row do %>
<div class="tile <%= terrain_class(tile) %> ">
<div class="sprite <%= sprite_class(tile, @id) %>"></div>
</div>
<% end %>
</div>
<% end %>
</div>
</div>
<% else %>

<% else %>
<div class="lobby">
<h1>Bear<br>Necessities</h1>

<div class="lobby">
<h1>Bear<br>Necessities</h1>
<img src="/images/down.gif" class="player">

<img src="/images/down.gif" class="player">
<%= form_tag "#", [phx_submit: :start] do %>
<%= label(:player, :display_name, "What is Your Name?") %>
<br><br><br>
<%= text_input(:player, :display_name, value: "Player1", class: "input") %>

<%= submit("Start", phx_disable_with: "Starting...", class: "button red") %>
<% end %>
</div>
<% end %>
<% end %>

<%= form_tag "#", [phx_submit: :start] do %>
<%= label(:player, :display_name, "What is Your Name?") %>
<br><br><br>
<%= 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 %>
<div phx-keyup="set_movement" phx-value="<%= @set_setting %>" phx-target="window">
Set key for <%= @set_setting %>
</div>

<% end %>

<%= BearNecessitiesWeb.Playfield.render("scoreboard.html", assigns) %>
59 changes: 45 additions & 14 deletions apps/game/lib/player.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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