Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GH-1027] Add game mode params per map #1032

Merged
merged 12 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from 11 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
56 changes: 56 additions & 0 deletions apps/configurator/lib/configurator/utils.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
defmodule Configurator.Utils do
@moduledoc """
Helper module
"""

def list_curse_skills_by_version_grouped_by_type(version_id) do
GameBackend.Units.Skills.list_curse_skills_by_version(version_id)
|> Enum.group_by(& &1.type)
end

def parse_json_params(map_configuration_params) do
map_configuration_params
|> Map.update("initial_positions", "", &parse_json/1)
|> Map.update("solo_initial_positions", "", &parse_json/1)
|> Map.update("team_initial_positions", "", &parse_json/1)
|> Map.update("obstacles", "", &parse_json/1)
|> Map.update("bushes", "", &parse_json/1)
|> Map.update("pools", "", &parse_json/1)
|> Map.update("crates", "", &parse_json/1)
|> Map.update("square_wall", "", &parse_json/1)
end

defp parse_json(""), do: []
defp parse_json(nil), do: []

defp parse_json(json_param) do
case Jason.decode(json_param) do
{:ok, json} -> json
{:error, _} -> json_param
end
end

def embed_to_string(embeds) when is_list(embeds) do
embeds
|> Enum.map(&embed_to_string/1)
|> Enum.reject(&(&1 == nil))
|> Jason.encode!()
|> Jason.Formatter.pretty_print()
end

def embed_to_string([]), do: ""
def embed_to_string(nil), do: nil
def embed_to_string(string) when is_binary(string), do: string

def embed_to_string(%Ecto.Changeset{action: :replace}) do
nil
end

def embed_to_string(%Ecto.Changeset{} = changeset) do
changeset.params |> Map.delete("id")
end

def embed_to_string(struct) when is_map(struct) do
struct
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule ConfiguratorWeb.CharacterController do
alias GameBackend.Units.Characters
alias GameBackend.Units.Characters.Character
alias GameBackend.Configuration
alias GameBackend.Utils
alias Configurator.Utils

def index(conn, %{"version_id" => version_id}) do
characters = Characters.get_curse_characters_by_version(version_id)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule ConfiguratorWeb.GameModeConfigurationController do
use ConfiguratorWeb, :controller

alias GameBackend.Configuration

def index(conn, %{"version_id" => version_id}) do
game_mode_configurations = Configuration.list_game_mode_configurations_by_version(version_id)
render(conn, :index, game_mode_configurations: game_mode_configurations, version_id: version_id)
end

def new(conn, %{"version_id" => version_id}) do
version = Configuration.get_version!(version_id)

render(conn, :new, version: version)
end

def show(conn, %{"id" => id}) do
game_mode_configuration = Configuration.get_game_mode_configuration!(id)
version = Configuration.get_version!(game_mode_configuration.version_id)
render(conn, :show, game_mode_configuration: game_mode_configuration, version: version)
end

def edit(conn, %{"id" => id}) do
game_mode_configuration = Configuration.get_game_mode_configuration!(id)
version = Configuration.get_version!(game_mode_configuration.version_id)

render(conn, :edit, game_mode_configuration: game_mode_configuration, version: version)
end

def delete(conn, %{"id" => id}) do
game_mode_configuration = Configuration.get_game_mode_configuration!(id)
version_id = game_mode_configuration.version_id
{:ok, _game_mode_configuration} = Configuration.delete_game_mode_configuration(game_mode_configuration)

conn
|> put_flash(:info, "Game Mode configuration deleted successfully.")
|> redirect(to: ~p"/versions/#{version_id}/game_mode_configurations")
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule ConfiguratorWeb.GameModeConfigurationHTML do
use ConfiguratorWeb, :html

embed_templates "game_mode_configuration_html/*"
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<.header>
Edit Game Mode configuration <%= @game_mode_configuration.id %>
<:subtitle>Use this form to manage Game Mode Configuration records in your database.</:subtitle>
</.header>

<%= live_render(@conn, ConfiguratorWeb.GameModeConfigurationsLive.Form,
session: %{"version" => @version, "game_mode_configuration" => @game_mode_configuration}
) %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<.header>
Listing Game Mode configurations
<:actions>
<.link href={~p"/versions/#{@version_id}/game_mode_configurations/new"}>
<.button>New Game Mode configuration</.button>
</.link>
</:actions>
</.header>
<.table
id="game_mode_configurations"
rows={@game_mode_configurations}
row_click={&JS.navigate(~p"/versions/#{@version_id}/game_mode_configurations/#{&1}")}
>
<:col :let={game_mode_configuration} label="Name"><%= game_mode_configuration.name %></:col>
<:col :let={game_mode_configuration} label="Zone enabled"><%= game_mode_configuration.zone_enabled %></:col>
<:col :let={game_mode_configuration} label="Bots enabled"><%= game_mode_configuration.bots_enabled %></:col>
<:col :let={game_mode_configuration} label="Match duration ms"><%= game_mode_configuration.match_duration_ms %></:col>
<:col :let={game_mode_configuration} label="Respawn time ms"><%= game_mode_configuration.respawn_time_ms %></:col>

<:action :let={game_mode_configuration}>
<.button type="button" phx-click={show_modal("map-params-#{game_mode_configuration.id}")}>Map params</.button>
<.modal id={"map-params-#{game_mode_configuration.id}"}>
<.header>
Map params for the game mode
</.header>
<%= for params <- GameBackend.Configuration.get_map_params_for_game_mode(game_mode_configuration.id) do %>
<.list>
<:item title="Map"><%= params.map.name %></:item>
<:item title="Amount of players"><%= params.amount_of_players %></:item>
<:item title="Solo - Initial Positions"><%= Jason.encode!(params.solo_initial_positions) %></:item>
<:item title="Team - Initial Positions"><%= Jason.encode!(params.team_initial_positions) %></:item>
</.list>
<% end %>
</.modal>
</:action>

<:action :let={game_mode_configuration}>
<div class="sr-only">
<.link navigate={~p"/versions/#{@version_id}/game_mode_configurations/#{game_mode_configuration}"}>Show</.link>
</div>
<.link navigate={~p"/versions/#{@version_id}/game_mode_configurations/#{game_mode_configuration}/edit"}>Edit</.link>
</:action>
<:action :let={game_mode_configuration}>
<.link
href={~p"/versions/#{@version_id}/game_mode_configurations/#{game_mode_configuration}"}
method="delete"
data-confirm="Are you sure?"
>
Delete
</.link>
</:action>
</.table>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<.header>
New Game Mode configuration
<:subtitle>Use this form to manage Game Mode Configuration records in your database.</:subtitle>
</.header>

<%= live_render(@conn, ConfiguratorWeb.GameModeConfigurationsLive.Form, session: %{"version" => @version}) %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<.header>
Game Mode configuration <%= @game_mode_configuration.id %>
<:subtitle>Version: <%= @version.name %></:subtitle>
<:actions>
<.link href={~p"/versions/#{@version}/game_mode_configurations/#{@game_mode_configuration}/edit"}>
<.button>Edit Game Mode Configuration</.button>
</.link>
</:actions>
</.header>

<.list>
<:item title="Name"><%= @game_mode_configuration.name %></:item>
<:item title="Zone enabled"><%= @game_mode_configuration.zone_enabled %></:item>
<:item title="Bots enabled"><%= @game_mode_configuration.bots_enabled %></:item>
<:item title="Match duration ms"><%= @game_mode_configuration.match_duration_ms %></:item>
<:item title="Respawn time ms"><%= @game_mode_configuration.respawn_time_ms %></:item>
</.list>

<.button type="button" phx-click={show_modal("show-map-params-#{@game_mode_configuration.id}")}>
Map specific params
</.button>
<.modal id={"show-map-params-#{@game_mode_configuration.id}"}>
<.header>
Map params for the game mode
</.header>
<%= for params <- GameBackend.Configuration.get_map_params_for_game_mode(@game_mode_configuration.id) do %>
<.list>
<:item title="Map"><%= params.map.name %></:item>
<:item title="Amount of players"><%= params.amount_of_players %></:item>
<:item title="Solo - Initial Positions"><%= Jason.encode!(params.solo_initial_positions) %></:item>
<:item title="Team - Initial Positions"><%= Jason.encode!(params.team_initial_positions) %></:item>
</.list>
<% end %>
</.modal>

<.back navigate={~p"/versions/#{@version}/game_mode_configurations"}>Back to Game Mode Configurations</.back>
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ defmodule ConfiguratorWeb.MapConfigurationController do
alias GameBackend.Configuration
alias GameBackend.CurseOfMirra.MapConfiguration
alias GameBackend.Configuration
alias Configurator.Utils

def index(conn, %{"version_id" => version_id}) do
map_configurations = Configuration.list_map_configurations_by_version(version_id)
Expand All @@ -17,7 +18,7 @@ defmodule ConfiguratorWeb.MapConfigurationController do
end

def create(conn, %{"map_configuration" => map_configuration_params}) do
map_configuration_params = parse_json_params(map_configuration_params)
map_configuration_params = Utils.parse_json_params(map_configuration_params)

case Configuration.create_map_configuration(map_configuration_params) do
{:ok, map_configuration} ->
Expand Down Expand Up @@ -46,7 +47,7 @@ defmodule ConfiguratorWeb.MapConfigurationController do

def update(conn, %{"id" => id, "map_configuration" => map_configuration_params}) do
map_configuration = Configuration.get_map_configuration!(id)
map_configuration_params = parse_json_params(map_configuration_params)
map_configuration_params = Utils.parse_json_params(map_configuration_params)

case Configuration.update_map_configuration(map_configuration, map_configuration_params) do
{:ok, map_configuration} ->
Expand Down Expand Up @@ -156,24 +157,4 @@ defmodule ConfiguratorWeb.MapConfigurationController do
)
end
end

def parse_json_params(map_configuration_params) do
map_configuration_params
|> Map.update("initial_positions", "", &parse_json/1)
|> Map.update("obstacles", "", &parse_json/1)
|> Map.update("bushes", "", &parse_json/1)
|> Map.update("pools", "", &parse_json/1)
|> Map.update("crates", "", &parse_json/1)
|> Map.update("square_wall", "", &parse_json/1)
end

defp parse_json(""), do: []
defp parse_json(nil), do: []

defp parse_json(json_param) do
case Jason.decode(json_param) do
{:ok, json} -> json
{:error, _} -> json_param
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,4 @@ defmodule ConfiguratorWeb.MapConfigurationHTML do
attr :version, GameBackend.Configuration.Version, required: true

def map_configuration_form(assigns)

def embed_to_string(embeds) when is_list(embeds) do
embeds
|> Enum.map(&embed_to_string/1)
|> Enum.reject(&(&1 == nil))
|> Jason.encode!()
|> Jason.Formatter.pretty_print()
end

def embed_to_string(nil), do: nil
def embed_to_string([]), do: ""
def embed_to_string(string) when is_binary(string), do: string

def embed_to_string(%Ecto.Changeset{action: :replace}) do
nil
end

def embed_to_string(%Ecto.Changeset{} = changeset) do
changeset.params |> Map.delete("id")
end

def embed_to_string(struct) when is_map(struct) do
struct
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<% else %>
<.button type="button" phx-click={show_modal("initial-positions-#{map_configuration.id}")}>Show</.button>
<.modal id={"initial-positions-#{map_configuration.id}"}>
<p class="whitespace-pre"><%= embed_to_string(map_configuration.initial_positions) %></p>
<p class="whitespace-pre"><%= Configurator.Utils.embed_to_string(map_configuration.initial_positions) %></p>
</.modal>
<% end %>
</:col>
Expand All @@ -26,7 +26,7 @@
<% else %>
<.button type="button" phx-click={show_modal("obstacles-#{map_configuration.id}")}>Show</.button>
<.modal id={"obstacles-#{map_configuration.id}"}>
<p class="whitespace-pre"><%= embed_to_string(map_configuration.obstacles) %></p>
<p class="whitespace-pre"><%= Configurator.Utils.embed_to_string(map_configuration.obstacles) %></p>
</.modal>
<% end %>
</:col>
Expand All @@ -36,7 +36,7 @@
<% else %>
<.button type="button" phx-click={show_modal("bushes-#{map_configuration.id}")}>Show</.button>
<.modal id={"bushes-#{map_configuration.id}"}>
<p class="whitespace-pre"><%= embed_to_string(map_configuration.bushes) %></p>
<p class="whitespace-pre"><%= Configurator.Utils.embed_to_string(map_configuration.bushes) %></p>
</.modal>
<% end %>
</:col>
Expand All @@ -46,7 +46,7 @@
<% else %>
<.button type="button" phx-click={show_modal("pools-#{map_configuration.id}")}>Show</.button>
<.modal id={"pools-#{map_configuration.id}"}>
<p class="whitespace-pre"><%= embed_to_string(map_configuration.pools) %></p>
<p class="whitespace-pre"><%= Configurator.Utils.embed_to_string(map_configuration.pools) %></p>
</.modal>
<% end %>
</:col>
Expand All @@ -56,7 +56,7 @@
<% else %>
<.button type="button" phx-click={show_modal("crates-#{map_configuration.id}")}>Show</.button>
<.modal id={"crates-#{map_configuration.id}"}>
<p class="whitespace-pre"><%= embed_to_string(map_configuration.crates) %></p>
<p class="whitespace-pre"><%= Configurator.Utils.embed_to_string(map_configuration.crates) %></p>
</.modal>
<% end %>
</:col>
Expand All @@ -67,7 +67,9 @@
<.button type="button" phx-click={show_modal("square-wall-#{map_configuration.id}")}>Show</.button>
<.modal id={"square-wall-#{map_configuration.id}"}>
<p class="whitespace-pre">
<%= embed_to_string(map_configuration.square_wall) |> Jason.encode!() |> Jason.Formatter.pretty_print() %>
<%= Configurator.Utils.embed_to_string(map_configuration.square_wall)
|> Jason.encode!()
|> Jason.Formatter.pretty_print() %>
</p>
</.modal>
<% end %>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,35 @@
field={f[:initial_positions]}
type="textarea"
label="Initial positions"
value={embed_to_string(f[:initial_positions].value)}
value={Configurator.Utils.embed_to_string(f[:initial_positions].value)}
/>
<.input
field={f[:square_wall]}
type="textarea"
label="Square Wall"
value={embed_to_string(f[:square_wall].value) |> Jason.encode!() |> Jason.Formatter.pretty_print()}
value={
Configurator.Utils.embed_to_string(f[:square_wall].value) |> Jason.encode!() |> Jason.Formatter.pretty_print()
}
/>
<.input
field={f[:obstacles]}
type="textarea"
label="Obstacles"
value={Configurator.Utils.embed_to_string(f[:obstacles].value)}
/>
<.input
field={f[:bushes]}
type="textarea"
label="Bushes"
value={Configurator.Utils.embed_to_string(f[:bushes].value)}
/>
<.input field={f[:pools]} type="textarea" label="Pools" value={Configurator.Utils.embed_to_string(f[:pools].value)} />
<.input
field={f[:crates]}
type="textarea"
label="Crates"
value={Configurator.Utils.embed_to_string(f[:crates].value)}
/>
<.input field={f[:obstacles]} type="textarea" label="Obstacles" value={embed_to_string(f[:obstacles].value)} />
<.input field={f[:bushes]} type="textarea" label="Bushes" value={embed_to_string(f[:bushes].value)} />
<.input field={f[:pools]} type="textarea" label="Pools" value={embed_to_string(f[:pools].value)} />
<.input field={f[:crates]} type="textarea" label="Crates" value={embed_to_string(f[:crates].value)} />
<:actions>
<.button>Save Map configuration</.button>
</:actions>
Expand Down
Loading
Loading