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: %{