diff --git a/apps/amethyst/lib/api/game.ex b/apps/amethyst/lib/api/game.ex index f059f13..b1df089 100644 --- a/apps/amethyst/lib/api/game.ex +++ b/apps/amethyst/lib/api/game.ex @@ -40,10 +40,25 @@ defmodule Amethyst.API.Game do end end - @spec start(Amethyst.API.Game, term()) :: no_return() + def child_spec(mod, refs) do + %{ + id: __MODULE__, + start: {__MODULE__, :start_link, [mod, refs]} + } + end + + @spec start(Amethyst.API.Game, term()) :: {:ok, pid} def start(mod, refs) do - true = refs |> Enum.all?(fn {_key, pid } -> Process.link(pid) end) - loop(mod, refs) + pid = spawn(fn -> + true = refs |> Enum.all?(fn {_key, pid } -> Process.link(pid) end) + loop(mod, refs) + end) + {:ok, pid} + end + def start_link(mod, refs) do + {:ok, pid} = start(mod, refs) + Process.link(pid) + {:ok, pid} end defp loop(mod, refs) do receive do diff --git a/apps/amethyst/lib/apps/game_coordinator.ex b/apps/amethyst/lib/apps/game_coordinator.ex index f912274..e53ec66 100644 --- a/apps/amethyst/lib/apps/game_coordinator.ex +++ b/apps/amethyst/lib/apps/game_coordinator.ex @@ -66,7 +66,10 @@ defmodule Amethyst.GameCoordinator do # We should gracefully handle situations where we cannot create a game. {:ok, refs} = type.instantiate(game_supervisor_pid) refs = refs |> Map.put(:game_supervisor, game_supervisor_pid) |> Map.put(:task_supervisor, task_supervisor_pid) - pid = spawn(Amethyst.API.Game, :start, [type, refs]) + {:ok, pid} = DynamicSupervisor.start_child( + game_supervisor_pid, + Amethyst.API.Game.child_spec(type, refs) + ) games = [{type, pid, []} | games] {pid, games} end diff --git a/apps/example_game/lib/example/game.ex b/apps/example_game/lib/example/game.ex index 6eae968..6c7bdb7 100644 --- a/apps/example_game/lib/example/game.ex +++ b/apps/example_game/lib/example/game.ex @@ -9,8 +9,9 @@ defmodule Example.Game do end @impl true - def login(from, cfg, _state) do + def login(from, cfg, refs) do Logger.info("Player logged in from #{inspect(from)}: #{inspect(cfg)}") + Logger.info("The refs for this game are #{inspect(refs)}") :ok end end