diff --git a/apps/arena/lib/arena/game/skill.ex b/apps/arena/lib/arena/game/skill.ex index 984907ec8..e22575d5a 100644 --- a/apps/arena/lib/arena/game/skill.ex +++ b/apps/arena/lib/arena/game/skill.ex @@ -288,6 +288,37 @@ defmodule Arena.Game.Skill do put_in(game_state, [:players, entity.id], entity) end + def do_mechanic(game_state, %{category: :projectile} = entity, %{type: "spawn_pool"} = pool_params, skill_params) do + last_id = game_state.last_id + 1 + + skill_direction = maybe_multiply_by_range(skill_params.skill_direction, skill_params.auto_aim?, pool_params.range) + + target_position = %{ + x: entity.position.x + skill_direction.x, + y: entity.position.y + skill_direction.y + } + + Process.send_after(self(), {:activate_pool, last_id}, pool_params.activation_delay) + + pool_params = + Map.merge( + %{ + id: last_id, + position: target_position, + owner_id: entity.aditional_info.owner_id, + skill_key: entity.aditional_info.skill_key, + status: :WAITING + }, + pool_params + ) + + pool = + Entities.new_pool(pool_params) + + put_in(game_state, [:pools, last_id], pool) + |> put_in([:last_id], last_id) + end + def do_mechanic(game_state, player, %{type: "spawn_pool"} = pool_params, skill_params) do last_id = game_state.last_id + 1 diff --git a/apps/arena/lib/arena/game_updater.ex b/apps/arena/lib/arena/game_updater.ex index 0786da67e..cdb307511 100644 --- a/apps/arena/lib/arena/game_updater.ex +++ b/apps/arena/lib/arena/game_updater.ex @@ -831,7 +831,7 @@ defmodule Arena.GameUpdater do |> Map.put(:external_wall, Entities.new_external_wall(0, config.map.radius)) |> Map.put(:square_wall, config.map.square_wall) |> Map.put(:zone, %{ - radius: config.map.radius, + radius: config.map.radius - 5000, should_start?: if(config.game.game_mode == :DEATHMATCH, do: false, else: config.game.zone_enabled), started: false, enabled: false, @@ -1305,7 +1305,7 @@ defmodule Arena.GameUpdater do game_state, projectile, projectile.aditional_info.on_explode_mechanics, - %{skill_direction: projectile.direction} + %{skill_direction: projectile.direction, auto_aim?: false} ) else game_state diff --git a/apps/arena/lib/arena/matchmaking/game_launcher.ex b/apps/arena/lib/arena/matchmaking/game_launcher.ex index 19d7c5d40..3098a8e36 100644 --- a/apps/arena/lib/arena/matchmaking/game_launcher.ex +++ b/apps/arena/lib/arena/matchmaking/game_launcher.ex @@ -19,7 +19,12 @@ defmodule Arena.Matchmaking.GameLauncher do "Bob", "El javo", "Alberso", - "Thomas" + "Thomas", + "Timmy", + "Pablito", + "Nicolino", + "Cangrejo", + "Mansito" ] # API diff --git a/apps/arena/lib/arena/matchmaking/pair_mode.ex b/apps/arena/lib/arena/matchmaking/pair_mode.ex index bf8da15b3..7a96eb5b3 100644 --- a/apps/arena/lib/arena/matchmaking/pair_mode.ex +++ b/apps/arena/lib/arena/matchmaking/pair_mode.ex @@ -19,7 +19,12 @@ defmodule Arena.Matchmaking.PairMode do "Bob", "El javo", "Alberso", - "Thomas" + "Thomas", + "Timmy", + "Pablito", + "Nicolino", + "Cangrejo", + "Mansito" ] # API diff --git a/apps/arena/lib/arena/matchmaking/quick_game_mode.ex b/apps/arena/lib/arena/matchmaking/quick_game_mode.ex index 0c97f96f5..df1106975 100644 --- a/apps/arena/lib/arena/matchmaking/quick_game_mode.ex +++ b/apps/arena/lib/arena/matchmaking/quick_game_mode.ex @@ -17,7 +17,12 @@ defmodule Arena.Matchmaking.QuickGameMode do "Bob", "El javo", "Alberso", - "Thomas" + "Thomas", + "Timmy", + "Pablito", + "Nicolino", + "Cangrejo", + "Mansito" ] # API diff --git a/apps/arena_load_test/lib/arena_load_test/socket_handler.ex b/apps/arena_load_test/lib/arena_load_test/socket_handler.ex index 2908df784..40e80e93a 100644 --- a/apps/arena_load_test/lib/arena_load_test/socket_handler.ex +++ b/apps/arena_load_test/lib/arena_load_test/socket_handler.ex @@ -71,7 +71,7 @@ defmodule ArenaLoadTest.SocketHandler do # This is enough for now. Will request bots from the bots app in future iterations. # https://github.com/lambdaclass/mirra_backend/issues/410 defp get_random_active_character() do - ["muflus", "h4ck", "uma", "valtimer", "kenzu", "otix", "shinko"] + ["muflus", "h4ck", "uma", "valtimer", "kenzu", "otix", "shinko", "uren"] |> Enum.random() end diff --git a/apps/configurator/lib/configurator_web/controllers/map_configuration_controller.ex b/apps/configurator/lib/configurator_web/controllers/map_configuration_controller.ex index 71c8bddbe..130820a08 100644 --- a/apps/configurator/lib/configurator_web/controllers/map_configuration_controller.ex +++ b/apps/configurator/lib/configurator_web/controllers/map_configuration_controller.ex @@ -163,6 +163,7 @@ defmodule ConfiguratorWeb.MapConfigurationController do |> 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: [] diff --git a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/index.html.heex b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/index.html.heex index cd157f3d5..9b1f79f82 100644 --- a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/index.html.heex +++ b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/index.html.heex @@ -60,6 +60,18 @@ <% end %> + <:col :let={map_configuration} label="Square Wall"> + <%= if is_nil(map_configuration.square_wall) do %> +

N/A

+ <% else %> + <.button type="button" phx-click={show_modal("square-wall-#{map_configuration.id}")}>Show + <.modal id={"square-wall-#{map_configuration.id}"}> +

+ <%= embed_to_string(map_configuration.square_wall) |> Jason.encode!() |> Jason.Formatter.pretty_print() %> +

+ + <% end %> + <:action :let={map_configuration}> <.link navigate={~p"/map_configurations/#{map_configuration}"}>View diff --git a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/map_configuration_form.html.heex b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/map_configuration_form.html.heex index bd760a537..5fa9b6a8c 100644 --- a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/map_configuration_form.html.heex +++ b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/map_configuration_form.html.heex @@ -6,9 +6,14 @@ <.input field={f[:version_id]} type="select" - options={Enum.map(GameBackend.Configuration.list_versions(), fn version -> {version.name, version.id} end)} + options={ + Enum.map(GameBackend.Configuration.list_versions(), fn version -> + {version.name, version.id} + end) + } label="Version" - /> <.input field={f[:name]} type="text" label="Name" /> + /> + <.input field={f[:name]} type="text" label="Name" /> <.input field={f[:radius]} type="number" label="Radius" step="any" /> <.input field={f[:initial_positions]} @@ -16,6 +21,12 @@ label="Initial positions" value={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()} + /> <.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)} /> diff --git a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/show.html.heex b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/show.html.heex index 2d704f427..1a6121a38 100644 --- a/apps/configurator/lib/configurator_web/controllers/map_configuration_html/show.html.heex +++ b/apps/configurator/lib/configurator_web/controllers/map_configuration_html/show.html.heex @@ -97,6 +97,21 @@ <% end %> +
+
Square Wall
+
+ <%= if is_nil(@map_configuration.square_wall) do %> +

N/A

+ <% else %> + <.button type="button" phx-click={show_modal("square-wall-#{@map_configuration.id}")}>Show + <.modal id={"square-wall-#{@map_configuration.id}"}> +

+ <%= embed_to_string(@map_configuration.square_wall) |> Jason.encode!() |> Jason.Formatter.pretty_print() %> +

+ + <% end %> +
+
<.back navigate={~p"/map_configurations"}>Back to Map Configurations diff --git a/apps/configurator/test/configurator_web/controllers/map_configuration_controller_test.exs b/apps/configurator/test/configurator_web/controllers/map_configuration_controller_test.exs index d425f3b7f..64b5a3dd6 100644 --- a/apps/configurator/test/configurator_web/controllers/map_configuration_controller_test.exs +++ b/apps/configurator/test/configurator_web/controllers/map_configuration_controller_test.exs @@ -13,7 +13,8 @@ defmodule ConfiguratorWeb.MapConfigurationControllerTest do bushes: "", pools: "", crates: "", - active: true + active: true, + square_wall: "" } @update_attrs %{ name: "another_map", @@ -23,7 +24,8 @@ defmodule ConfiguratorWeb.MapConfigurationControllerTest do bushes: "", pools: "", crates: "", - active: false + active: false, + square_wall: nil } @invalid_attrs %{ name: nil, @@ -33,7 +35,8 @@ defmodule ConfiguratorWeb.MapConfigurationControllerTest do bushes: nil, pools: nil, crates: nil, - active: nil + active: nil, + square_wall: "" } describe "index" do diff --git a/apps/game_backend/lib/game_backend/curse_of_mirra/map_configuration.ex b/apps/game_backend/lib/game_backend/curse_of_mirra/map_configuration.ex index eaa8240d7..b8546528a 100644 --- a/apps/game_backend/lib/game_backend/curse_of_mirra/map_configuration.ex +++ b/apps/game_backend/lib/game_backend/curse_of_mirra/map_configuration.ex @@ -58,7 +58,6 @@ defmodule GameBackend.CurseOfMirra.MapConfiguration do def changeset(square_wall, attrs) do square_wall |> cast(attrs, [:right, :left, :top, :bottom]) - |> validate_required([:right, :left, :top, :bottom]) end end diff --git a/apps/game_backend/lib/game_backend/matches/arena_match_result.ex b/apps/game_backend/lib/game_backend/matches/arena_match_result.ex index 605680bab..865cfbc9e 100644 --- a/apps/game_backend/lib/game_backend/matches/arena_match_result.ex +++ b/apps/game_backend/lib/game_backend/matches/arena_match_result.ex @@ -54,8 +54,8 @@ defmodule GameBackend.Matches.ArenaMatchResult do |> validate_inclusion(:result, ["win", "loss", "abandon"]) ## TODO: This enums should actually be read from config ## https://github.com/lambdaclass/mirra_backend/issues/601 - |> validate_inclusion(:character, ["h4ck", "muflus", "uma", "valtimer", "kenzu", "otix", "shinko"]) - |> validate_inclusion(:killed_by, ["h4ck", "muflus", "uma", "valtimer", "kenzu", "otix", "shinko", "zone"]) + |> validate_inclusion(:character, ["h4ck", "muflus", "uma", "valtimer", "kenzu", "otix", "shinko", "uren"]) + |> validate_inclusion(:killed_by, ["h4ck", "muflus", "uma", "valtimer", "kenzu", "otix", "shinko", "uren", "zone"]) |> foreign_key_constraint(:user_id) end end diff --git a/apps/game_client/lib/game_client_web/controllers/page_html/home.html.heex b/apps/game_client/lib/game_client_web/controllers/page_html/home.html.heex index 00284ec4e..9dcd94527 100644 --- a/apps/game_client/lib/game_client_web/controllers/page_html/home.html.heex +++ b/apps/game_client/lib/game_client_web/controllers/page_html/home.html.heex @@ -1,6 +1,6 @@ <%= if assigns[:current_user_id] do %> <.form :let={f} for={%{}} action={~p"/"}> - <.input field={f[:character]} name="character" label="Select a Character" type="select" options={["muflus", "h4ck", "uma", "valtimer", "kenzu", "otix", "shinko"]} value=""/> + <.input field={f[:character]} name="character" label="Select a Character" type="select" options={["muflus", "h4ck", "uma", "valtimer", "kenzu", "otix", "shinko", "uren"]} value=""/> <.input field={f[:user_id]} name="user_id" type="hidden" value={assigns[:user_id]}/> <.button type="submit" name="game_mode" value="battle-royale">Play Battle Royal <.button type="submit" name="game_mode" value="pair">Play Pair diff --git a/config/config.exs b/config/config.exs index a180a0d74..ef14f6048 100644 --- a/config/config.exs +++ b/config/config.exs @@ -119,7 +119,7 @@ config :arena, ArenaWeb.Endpoint, config :arena, Arena.Mailer, adapter: Swoosh.Adapters.Local # Amount of clients needed to start a game -config :arena, :players_needed_in_match, 7 +config :arena, :players_needed_in_match, 12 config :arena, :spawn_bots, false ################################ diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 395ff9951..5e2ff93a1 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -250,7 +250,7 @@ singularity_effect = %{ }, %{ name: "damage", - damage: 13, + damage: 15, effect_delay_ms: 400, execute_multiple_times: true } @@ -445,6 +445,41 @@ simple_shoot = %{ } } +simple_piercing_shoot = %{ + "type" => "simple_shoot", + "speed" => 0.8, + "duration_ms" => 2500, + "remove_on_collision" => false, + "projectile_offset" => 100, + "radius" => 150.0, + "damage" => 4 +} + +multi_piercing_shoot = %{ + "type" => "multi_shoot", + "angle_between" => 120.0, + "amount" => 3, + "speed" => 0.8, + "duration_ms" => 1500, + "remove_on_collision" => false, + "projectile_offset" => 100, + "damage" => 5, + "radius" => 150.0, + "on_explode_mechanics" => [ + %{ + "name" => "tornado", + "type" => "spawn_pool", + "activation_delay" => 250, + "duration_ms" => 4000, + "radius" => 350.0, + "range" => 0.0, + "shape" => "circle", + "vertices" => [], + "effect" => singularity_effect + } + ] +} + quickslash_1 = %{ "type" => "circle_hit", "damage" => 60, @@ -992,6 +1027,55 @@ skills = [ "mechanics" => [ putrid_elixir_bomb ] + }, + %{ + "name" => "uren_basic", + "type" => "basic", + "cooldown_mechanism" => "stamina", + "execution_duration_ms" => 450, + "activation_delay_ms" => 150, + "is_passive" => false, + "autoaim" => true, + "max_autoaim_range" => 1500, + "stamina_cost" => 1, + "can_pick_destination" => false, + "block_movement" => true, + "mechanics" => [simple_piercing_shoot], + "version_id" => version.id + }, + %{ + "name" => "uren_ultimate", + "type" => "ultimate", + "cooldown_mechanism" => "time", + "cooldown_ms" => 10000, + "execution_duration_ms" => 1000, + "activation_delay_ms" => 0, + "is_passive" => false, + "autoaim" => true, + "max_autoaim_range" => 1200, + "can_pick_destination" => false, + "block_movement" => true, + "mechanics" => [multi_piercing_shoot] + }, + %{ + "name" => "uren_dash", + "type" => "dash", + "cooldown_mechanism" => "time", + "cooldown_ms" => 4000, + "execution_duration_ms" => 250, + "activation_delay_ms" => 0, + "is_passive" => false, + "autoaim" => false, + "max_autoaim_range" => 0, + "can_pick_destination" => false, + "block_movement" => true, + "mechanics" => [ + %{ + "type" => "dash", + "speed" => 4, + "duration_ms" => 250 + } + ] } ] @@ -1161,6 +1245,23 @@ shinko_params = %{ version_id: version.id } +uren_params = %{ + name: "uren", + active: true, + base_speed: 0.68, + base_size: 100.0, + base_health: 400, + base_stamina: 3, + stamina_interval: 2000, + max_inventory_size: 1, + natural_healing_interval: 1000, + natural_healing_damage_interval: 3500, + basic_skill_id: skills["uren_basic"], + ultimate_skill_id: skills["uren_ultimate"], + dash_skill_id: skills["uren_dash"], + version_id: version.id +} + # Insert characters [ muflus_params, @@ -1169,7 +1270,8 @@ shinko_params = %{ valtimer_params, kenzu_params, otix_params, - shinko_params + shinko_params, + uren_params ] |> Enum.each(fn char_params -> Map.put(char_params, :game_id, curse_of_mirra_id) @@ -1184,14 +1286,14 @@ game_configuration_1 = %{ end_game_interval_ms: 1000, shutdown_game_wait_ms: 10000, natural_healing_interval_ms: 300, - zone_shrink_start_ms: 35000, - zone_shrink_radius_by: 10, + zone_shrink_start_ms: 15000, + zone_shrink_radius_by: 20, zone_shrink_interval: 100, - zone_stop_interval_ms: 13000, + zone_stop_interval_ms: 10000, zone_start_interval_ms: 20000, zone_damage_interval_ms: 1000, zone_damage: 40, - item_spawn_interval_ms: 7500, + item_spawn_interval_ms: 5000, bots_enabled: true, zone_enabled: true, bounties_options_amount: 3, @@ -3571,34 +3673,18 @@ merliot_map_config = %{ radius: 15000.0, active: true, initial_positions: [ - %{ - x: 5360.0, - y: -540.0 - }, - %{ - x: -5130.0, - y: -920.0 - }, - %{ - x: 555.0, - y: 4314.0 - }, - %{ - x: 2750.0, - y: -4200.0 - }, - %{ - x: -3700.0, - y: 2700.0 - }, - %{ - x: 4250.0, - y: 3000.0 - }, - %{ - x: -1842.0, - y: -4505.0 - } + %{x: -4961, y: 5001}, + %{x: -2417, y: 5103}, + %{x: 952, y: 5603}, + %{x: 4695, y: 4859}, + %{x: 5632, y: 2753}, + %{x: 5242, y: -316}, + %{x: 4908, y: -3698}, + %{x: 2442, y: -5476}, + %{x: -897, y: -5296}, + %{x: -4871, y: -4868}, + %{x: -4897, y: -2416}, + %{x: -5047, y: 853} ], obstacles: [ %{ @@ -5002,7 +5088,329 @@ merliot_map_config = %{ ] } ], - bushes: [], + bushes: [ + %{ + name: "Bottom Left A1", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: -6370, y: -5029}, + %{x: -5550, y: -5029}, + %{x: -5430, y: -5659}, + %{x: -6370, y: -5669} + ] + }, + %{ + name: "Bottom Left A2", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: -6370, y: -5669}, + %{x: -5114, y: -5649}, + %{x: -5107, y: -6427}, + %{x: -6349, y: -6434} + ] + }, + %{ + name: "Bottom Left A3", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: -5107, y: -6427}, + %{x: -5100, y: -6072}, + %{x: -4643, y: -6072}, + %{x: -4643, y: -6441} + ] + }, + %{ + name: "Bottom Mid A1", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: -2583, y: -6420}, + %{x: -2354, y: -5906}, + %{x: -1411, y: -5953}, + %{x: -1471, y: -6487} + ] + }, + %{ + name: "Bottom Mid A2", + radius: 1000, + shape: "polygon", + position: %{x: 0, y: 0}, + vertices: [ + %{x: -2220, y: -6063}, + %{x: -2219, y: -5587}, + %{x: -1774, y: -5566}, + %{x: -1774, y: -6089} + ] + }, + %{ + name: "Bottom Mid B1", + radius: 1800, + shape: "circle", + position: %{x: 1570, y: -7248}, + vertices: [] + }, + %{ + name: "Bottom Mid B2", + radius: 500, + shape: "circle", + position: %{x: 310, y: -6110}, + vertices: [] + }, + %{ + name: "Bottom Mid B3", + radius: 500, + shape: "circle", + position: %{x: 2712, y: -6114}, + vertices: [] + }, + %{ + name: "Bottom Mid C1", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: 4970, y: -6462}, + %{x: 4963, y: -6040}, + %{x: 6658, y: -6040}, + %{x: 6665, y: -6442} + ] + }, + %{ + name: "Bottom Mid C2", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: 5485, y: -6023}, + %{x: 5485, y: -5673}, + %{x: 6650, y: -5673}, + %{x: 6663, y: -6040} + ] + }, + %{ + name: "Bottom Mid C3", + radius: 0.0, + shape: "polygon", + position: %{ + x: 0.0, + y: 0.0 + }, + vertices: [ + %{x: 6000, y: -5614}, + %{x: 6000, y: -5275}, + %{x: 6628, y: -5275}, + %{x: 6656, y: -5599} + ] + }, + %{ + name: "Mid Left A1", + radius: 1800, + shape: "circle", + position: %{x: -6940, y: -1239}, + vertices: [] + }, + %{ + name: "Mid Left A2", + radius: 700, + shape: "circle", + position: %{x: -6020, y: -2129}, + vertices: [] + }, + %{ + name: "Mid Left A3", + radius: 700, + shape: "circle", + position: %{x: -6000, y: -439}, + vertices: [] + }, + %{ + name: "Mid Left B1", + radius: 500, + shape: "circle", + position: %{x: -6360, y: 2020}, + vertices: [] + }, + %{ + name: "Mid Left B2", + radius: 500, + shape: "circle", + position: %{x: -5810, y: 2220}, + vertices: [] + }, + %{ + name: "Top Left B1", + radius: 1000, + shape: "circle", + position: %{x: -6390, y: 6550}, + vertices: [] + }, + %{ + name: "Top Mid A1", + radius: 1700, + shape: "circle", + position: %{x: -1480, y: 6970}, + vertices: [] + }, + %{ + name: "Top Mid A2", + radius: 700, + shape: "circle", + position: %{x: 1859, y: 6110}, + vertices: [] + }, + %{ + name: "Top Right A1", + radius: 1700, + shape: "circle", + position: %{x: 7369, y: 6680}, + vertices: [] + }, + %{ + name: "Mid Right A1", + radius: 700, + shape: "circle", + position: %{x: 6653, y: 2360}, + vertices: [] + }, + %{ + name: "Mid Right A2", + radius: 700, + shape: "circle", + position: %{x: 6486, y: 655}, + vertices: [] + }, + %{ + name: "Mid Right A3", + radius: 700, + shape: "circle", + position: %{x: 6300, y: 2007}, + vertices: [] + }, + %{ + name: "Mid Right B1", + radius: 0, + shape: "polygon", + position: %{x: 0.0, y: 0.0}, + vertices: [ + %{x: 6085, y: -1374}, + %{x: 6596, y: -1374}, + %{x: 6497, y: -2222}, + %{x: 5911, y: -2222} + ] + }, + %{ + name: "Mid Right B2", + radius: 300, + shape: "circle", + position: %{x: 5626, y: -1885}, + vertices: [] + }, + %{ + name: "Mid Top A1", + radius: 1000, + shape: "circle", + position: %{x: 3799, y: 3810}, + vertices: [] + }, + %{ + name: "Mid Top A2", + radius: 0, + shape: "polygon", + position: %{x: 0.0, y: 0.0}, + vertices: [ + %{x: -2010, y: 4592}, + %{x: -421, y: 4368}, + %{x: -504, y: 3850}, + %{x: -2110, y: 4132} + ] + }, + %{ + name: "Mid Top A3", + radius: 700, + shape: "circle", + position: %{x: -3800, y: 3690}, + vertices: [] + }, + %{ + name: "Mid Bottom A1", + radius: 850, + shape: "circle", + position: %{x: -1570, y: -2879}, + vertices: [] + }, + %{ + name: "Mid Bottom B1", + radius: 850, + shape: "circle", + position: %{x: -1570, y: -2879}, + vertices: [] + }, + %{ + name: "Mid Bottom C1", + radius: 1000, + shape: "circle", + position: %{x: 1529, y: -3639}, + vertices: [] + }, + %{ + name: "Mid Bottom A4", + radius: 0.0, + shape: "polygon", + position: %{x: 0.0, y: 0.0}, + vertices: [ + %{x: 2480, y: -1523}, + %{x: 3445, y: -1518}, + %{x: 3445, y: -2205}, + %{x: 2489, y: -2242} + ] + }, + %{ + name: "Mid Top A1", + radius: 1000, + shape: "circle", + position: %{x: 4229, y: 1160}, + vertices: [] + }, + %{ + name: "Mid Top B1", + radius: 950, + shape: "circle", + position: %{x: -3110, y: 1220}, + vertices: [] + }, + %{ + name: "Mid Top C1", + radius: 900, + shape: "circle", + position: %{x: 1819, y: 3130}, + vertices: [] + } + ], pools: [], version_id: version.id, square_wall: %{