85 lines
1.7 KiB
Elixir
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
|