duck-tag/lib/duck_tag.ex
2018-05-10 22:39:42 +03:00

85 lines
1.7 KiB
Elixir

defmodule DuckTag do
require Logger
use Amnesia
alias DuckTag.DB.Manager.GameDB
import Ex2ms
@doc """
Start new game by adding new players. Do this when all nodes are connected.
"""
def add_players() do
Logger.debug("PLEASE ADD PLAYERS BY TAGGING DEVICES WITH THEIR RESPECTIVE TAGS.")
GameDB.Device.clear()
GameDB.Player.clear()
Amnesia.transaction do
GameDB.State.first!()
|> GameDB.State.set_status(:init_players)
end
end
@doc """
Add respawn points, do this after adding players.
"""
def add_respawns() do
Logger.debug("PLEASE ADD RESPAWN POINTS BY TAGGING DEVICES WITH ANY TAG.")
Amnesia.transaction do
GameDB.State.first!()
|> GameDB.State.set_status(:init_respawns)
end
end
@doc """
Start gameplay!
"""
def start_game() do
Logger.debug("Resetting players...")
Amnesia.transaction do
selection =
GameDB.Player.select(
fun do
p -> p
end
)
selection
|> Amnesia.Selection.coerce(GameDB.Player)
|> Amnesia.Selection.values()
|> Enum.each(fn player ->
GameDB.Player.init_player(player)
end)
end
Amnesia.transaction do
GameDB.State.first!()
|> GameDB.State.set_status(:game_on)
end
end
@doc """
Stop running game.
"""
def stop_game() do
Amnesia.transaction do
selection =
GameDB.Player.select(
fun do
p -> p
end
)
selection
|> Amnesia.Selection.coerce(GameDB.Player)
|> Amnesia.Selection.values()
|> Enum.each(&GameDB.Player.set_status(&1, :out))
end
Amnesia.transaction do
GameDB.State.first!()
|> GameDB.State.set_status(:stopped)
end
end
end