From 3f09b81a9df22b4ef5cfbc4a5d659ef11821e095 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 15:54:18 -0300 Subject: [PATCH 01/14] Add new skin_name proto message & Player field --- apps/arena/lib/arena/entities.ex | 3 ++ apps/arena/lib/arena/game_updater.ex | 1 + .../lib/arena/matchmaking/game_launcher.ex | 21 +++++--- .../lib/arena/serialization/messages.pb.ex | 1 + apps/arena/lib/arena/socket_handler.ex | 2 +- .../serialization/messages.pb.ex | 1 + apps/bot_manager/lib/protobuf/messages.pb.ex | 1 + .../assets/js/protobuf/messages_pb.js | 50 ++++++++++++++++++- .../lib/game_client/protobuf/messages.pb.ex | 1 + apps/serialization/messages.proto | 1 + 10 files changed, 73 insertions(+), 9 deletions(-) diff --git a/apps/arena/lib/arena/entities.ex b/apps/arena/lib/arena/entities.ex index 1c87d2c8b..ac78c7b01 100644 --- a/apps/arena/lib/arena/entities.ex +++ b/apps/arena/lib/arena/entities.ex @@ -25,6 +25,7 @@ defmodule Arena.Entities do position: position, direction: direction, character_name: character_name, + skin_name: skin_name, config: config, now: now, team: team @@ -74,6 +75,7 @@ defmodule Arena.Entities do last_skill_triggered_inside_bush: now, natural_healing_damage_interval: character.natural_healing_damage_interval, character_name: character.name, + skin_name: skin_name, forced_movement: false, power_ups: 0, power_up_damage_modifier: config.game.power_up_damage_modifier, @@ -437,6 +439,7 @@ defmodule Arena.Entities do stamina_interval: get_in(entity, [:aditional_info, :stamina_interval]), recharging_stamina: get_in(entity, [:aditional_info, :recharging_stamina]), character_name: get_in(entity, [:aditional_info, :character_name]), + skin_name: get_in(entity, [:aditional_info, :skin_name]), effects: get_in(entity, [:aditional_info, :effects]), power_ups: get_in(entity, [:aditional_info, :power_ups]), inventory: get_in(entity, [:aditional_info, :inventory]), diff --git a/apps/arena/lib/arena/game_updater.ex b/apps/arena/lib/arena/game_updater.ex index 98782b07b..b05a550cb 100644 --- a/apps/arena/lib/arena/game_updater.ex +++ b/apps/arena/lib/arena/game_updater.ex @@ -924,6 +924,7 @@ defmodule Arena.GameUpdater do position: pos, direction: direction, character_name: player.character_name, + skin_name: player.skin_name, config: config, now: now } diff --git a/apps/arena/lib/arena/matchmaking/game_launcher.ex b/apps/arena/lib/arena/matchmaking/game_launcher.ex index a8c2e21f1..24dd0fe0e 100644 --- a/apps/arena/lib/arena/matchmaking/game_launcher.ex +++ b/apps/arena/lib/arena/matchmaking/game_launcher.ex @@ -11,8 +11,8 @@ defmodule Arena.Matchmaking.GameLauncher do GenServer.start_link(__MODULE__, [], name: __MODULE__) end - def join(client_id, character_name, player_name) do - GenServer.call(__MODULE__, {:join, client_id, character_name, player_name}) + def join(params) do + GenServer.call(__MODULE__, {:join, params}) end def leave(client_id) do @@ -28,13 +28,14 @@ defmodule Arena.Matchmaking.GameLauncher do end @impl true - def handle_call({:join, client_id, character_name, player_name}, {from_pid, _}, %{clients: clients} = state) do + def handle_call({:join, params}, {from_pid, _}, %{clients: clients} = state) do batch_start_at = maybe_make_batch_start_at(state.clients, state.batch_start_at) client = %{ - client_id: client_id, - character_name: character_name, - name: player_name, + client_id: params.client_id, + character_name: params.character_name, + skin_name: params.skin_name, + name: params.player_name, from_pid: from_pid, type: :human } @@ -124,7 +125,13 @@ defmodule Arena.Matchmaking.GameLauncher do Enum.map(1..missing_clients//1, fn i -> client_id = UUID.generate() - %{client_id: client_id, character_name: Enum.random(characters).name, name: Enum.at(bot_names, i - 1), type: :bot} + %{ + client_id: client_id, + skin_name: "Basic", + character_name: Enum.random(characters).name, + name: Enum.at(bot_names, i - 1), + type: :bot + } end) end diff --git a/apps/arena/lib/arena/serialization/messages.pb.ex b/apps/arena/lib/arena/serialization/messages.pb.ex index 768840713..90490fe61 100644 --- a/apps/arena/lib/arena/serialization/messages.pb.ex +++ b/apps/arena/lib/arena/serialization/messages.pb.ex @@ -593,6 +593,7 @@ defmodule Arena.Serialization.Player do field(:max_health, 20, proto3_optional: true, type: :uint64, json_name: "maxHealth") field(:inventory, 21, repeated: true, type: Arena.Serialization.Player.InventoryEntry, map: true) field(:blocked_actions, 22, proto3_optional: true, type: :bool, json_name: "blockedActions") + field(:skin_name, 23, proto3_optional: true, type: :string, json_name: "skinName") end defmodule Arena.Serialization.Effect do diff --git a/apps/arena/lib/arena/socket_handler.ex b/apps/arena/lib/arena/socket_handler.ex index 0b82f14b1..ec7a9cbde 100644 --- a/apps/arena/lib/arena/socket_handler.ex +++ b/apps/arena/lib/arena/socket_handler.ex @@ -45,7 +45,7 @@ defmodule Arena.SocketHandler do @impl true def websocket_init(state) do Logger.info("Websocket INIT called") - state.matchmaking_queue.join(state.client_id, state.character_name, state.player_name) + state.matchmaking_queue.join(state) joined_msg = LobbyEvent.encode(%LobbyEvent{event: {:joined, %JoinedLobby{}}}) {:reply, {:binary, joined_msg}, state} end diff --git a/apps/arena_load_test/lib/arena_load_test/serialization/messages.pb.ex b/apps/arena_load_test/lib/arena_load_test/serialization/messages.pb.ex index c5d647564..0897552a2 100644 --- a/apps/arena_load_test/lib/arena_load_test/serialization/messages.pb.ex +++ b/apps/arena_load_test/lib/arena_load_test/serialization/messages.pb.ex @@ -652,6 +652,7 @@ defmodule ArenaLoadTest.Serialization.Player do ) field(:blocked_actions, 22, proto3_optional: true, type: :bool, json_name: "blockedActions") + field(:skin_name, 23, proto3_optional: true, type: :string, json_name: "skinName") end defmodule ArenaLoadTest.Serialization.Effect do diff --git a/apps/bot_manager/lib/protobuf/messages.pb.ex b/apps/bot_manager/lib/protobuf/messages.pb.ex index 948abf280..a5384fed7 100644 --- a/apps/bot_manager/lib/protobuf/messages.pb.ex +++ b/apps/bot_manager/lib/protobuf/messages.pb.ex @@ -593,6 +593,7 @@ defmodule BotManager.Protobuf.Player do field(:max_health, 20, proto3_optional: true, type: :uint64, json_name: "maxHealth") field(:inventory, 21, repeated: true, type: BotManager.Protobuf.Player.InventoryEntry, map: true) field(:blocked_actions, 22, proto3_optional: true, type: :bool, json_name: "blockedActions") + field(:skin_name, 23, proto3_optional: true, type: :string, json_name: "skinName") end defmodule BotManager.Protobuf.Effect do diff --git a/apps/game_client/assets/js/protobuf/messages_pb.js b/apps/game_client/assets/js/protobuf/messages_pb.js index f9400a8d6..6dd3d72db 100644 --- a/apps/game_client/assets/js/protobuf/messages_pb.js +++ b/apps/game_client/assets/js/protobuf/messages_pb.js @@ -7052,7 +7052,8 @@ matchPosition: (f = jspb.Message.getField(msg, 18)) == null ? undefined : f, team: (f = jspb.Message.getField(msg, 19)) == null ? undefined : f, maxHealth: (f = jspb.Message.getField(msg, 20)) == null ? undefined : f, inventoryMap: (f = msg.getInventoryMap()) ? f.toObject(includeInstance, proto.Item.toObject) : [], -blockedActions: (f = jspb.Message.getBooleanField(msg, 22)) == null ? undefined : f +blockedActions: (f = jspb.Message.getBooleanField(msg, 22)) == null ? undefined : f, +skinName: (f = jspb.Message.getField(msg, 23)) == null ? undefined : f }; if (includeInstance) { @@ -7185,6 +7186,10 @@ proto.Player.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {boolean} */ (reader.readBool()); msg.setBlockedActions(value); break; + case 23: + var value = /** @type {string} */ (reader.readString()); + msg.setSkinName(value); + break; default: reader.skipField(); break; @@ -7364,6 +7369,13 @@ proto.Player.serializeBinaryToWriter = function(message, writer) { f ); } + f = /** @type {string} */ (jspb.Message.getField(message, 23)); + if (f != null) { + writer.writeString( + 23, + f + ); + } }; @@ -8138,6 +8150,42 @@ proto.Player.prototype.hasBlockedActions = function() { }; +/** + * optional string skin_name = 23; + * @return {string} + */ +proto.Player.prototype.getSkinName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 23, "")); +}; + + +/** + * @param {string} value + * @return {!proto.Player} returns this + */ +proto.Player.prototype.setSkinName = function(value) { + return jspb.Message.setField(this, 23, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.Player} returns this + */ +proto.Player.prototype.clearSkinName = function() { + return jspb.Message.setField(this, 23, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.Player.prototype.hasSkinName = function() { + return jspb.Message.getField(this, 23) != null; +}; + + diff --git a/apps/game_client/lib/game_client/protobuf/messages.pb.ex b/apps/game_client/lib/game_client/protobuf/messages.pb.ex index bdf2224a1..20b3d2e83 100644 --- a/apps/game_client/lib/game_client/protobuf/messages.pb.ex +++ b/apps/game_client/lib/game_client/protobuf/messages.pb.ex @@ -593,6 +593,7 @@ defmodule GameClient.Protobuf.Player do field(:max_health, 20, proto3_optional: true, type: :uint64, json_name: "maxHealth") field(:inventory, 21, repeated: true, type: GameClient.Protobuf.Player.InventoryEntry, map: true) field(:blocked_actions, 22, proto3_optional: true, type: :bool, json_name: "blockedActions") + field(:skin_name, 23, proto3_optional: true, type: :string, json_name: "skinName") end defmodule GameClient.Protobuf.Effect do diff --git a/apps/serialization/messages.proto b/apps/serialization/messages.proto index 9fe540c6a..ac5dd0a7d 100644 --- a/apps/serialization/messages.proto +++ b/apps/serialization/messages.proto @@ -223,6 +223,7 @@ message Player { optional uint64 max_health = 20; map inventory = 21; optional bool blocked_actions = 22; + optional string skin_name = 23; } message Effect { From 4fa63579238aabfdc2ba1afa503a2cbd731be6d6 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:08:38 -0300 Subject: [PATCH 02/14] Add migration, schema and assocs for new Skin and UnitSkin tables --- .../lib/game_backend/units/characters/skin.ex | 35 +++++++++++++++++++ .../lib/game_backend/units/unit.ex | 3 ++ .../lib/game_backend/users/unit_skin.ex | 33 +++++++++++++++++ .../20250205222245_add_unit_skins.exs | 21 +++++++++++ 4 files changed, 92 insertions(+) create mode 100644 apps/game_backend/lib/game_backend/units/characters/skin.ex create mode 100644 apps/game_backend/lib/game_backend/users/unit_skin.ex create mode 100644 apps/game_backend/priv/repo/migrations/20250205222245_add_unit_skins.exs diff --git a/apps/game_backend/lib/game_backend/units/characters/skin.ex b/apps/game_backend/lib/game_backend/units/characters/skin.ex new file mode 100644 index 000000000..6d64dfc57 --- /dev/null +++ b/apps/game_backend/lib/game_backend/units/characters/skin.ex @@ -0,0 +1,35 @@ +defmodule GameBackend.Units.Characters.Skin do + @moduledoc """ + Characters are the template on which units are based. + """ + + use GameBackend.Schema + import Ecto.Changeset + + alias GameBackend.Units.Characters.Character + + @derive {Jason.Encoder, + only: [ + :is_default, + :character_id + ]} + + schema "skins" do + field(:name, :string) + field(:is_default, :boolean, default: false) + belongs_to(:character, Character) + + timestamps() + end + + @doc false + def changeset(character, attrs) do + character + |> cast(attrs, [ + :name, + :is_default, + :character_id + ]) + |> validate_required([:name, :is_default, :character_id]) + end +end diff --git a/apps/game_backend/lib/game_backend/units/unit.ex b/apps/game_backend/lib/game_backend/units/unit.ex index e45b26e48..4528706f2 100644 --- a/apps/game_backend/lib/game_backend/units/unit.ex +++ b/apps/game_backend/lib/game_backend/units/unit.ex @@ -10,6 +10,7 @@ defmodule GameBackend.Units.Unit do alias GameBackend.Campaigns.Level alias GameBackend.Items.Item alias GameBackend.Units.Characters.Character + alias GameBackend.Units.UnitSkin alias GameBackend.Users.User schema "units" do @@ -26,6 +27,7 @@ defmodule GameBackend.Units.Unit do belongs_to(:character, Character) has_many(:items, Item) + has_many(:skins, UnitSkin) timestamps() end @@ -44,6 +46,7 @@ defmodule GameBackend.Units.Unit do :campaign_level_id, :prestige ]) + |> cast_assoc(:skins) |> validate_required([:level, :selected, :character_id]) end diff --git a/apps/game_backend/lib/game_backend/users/unit_skin.ex b/apps/game_backend/lib/game_backend/users/unit_skin.ex new file mode 100644 index 000000000..b313c4e90 --- /dev/null +++ b/apps/game_backend/lib/game_backend/users/unit_skin.ex @@ -0,0 +1,33 @@ +defmodule GameBackend.Units.UnitSkin do + @moduledoc """ + The Currencies context. + """ + + use GameBackend.Schema + import Ecto.Changeset + + alias GameBackend.Units.Unit + alias GameBackend.Units.Characters.Skin + + @derive {Jason.Encoder, + only: [ + :unit_id, + :skin_id, + :selected + ]} + + schema "unit_skins" do + field(:selected, :boolean, default: false) + belongs_to(:unit, Unit) + belongs_to(:skin, Skin) + + timestamps() + end + + @doc false + def changeset(character, attrs) do + character + |> cast(attrs, [:unit_id, :skin_id, :selected]) + |> validate_required([:skin_id]) + end +end diff --git a/apps/game_backend/priv/repo/migrations/20250205222245_add_unit_skins.exs b/apps/game_backend/priv/repo/migrations/20250205222245_add_unit_skins.exs new file mode 100644 index 000000000..9b0f20b76 --- /dev/null +++ b/apps/game_backend/priv/repo/migrations/20250205222245_add_unit_skins.exs @@ -0,0 +1,21 @@ +defmodule GameBackend.Repo.Migrations.AddUnitSkins do + use Ecto.Migration + + def change do + create table(:skins) do + add(:name, :string) + add(:is_default, :boolean) + add(:character_id, references(:characters)) + + timestamps(type: :utc_datetime) + end + + create table(:unit_skins) do + add(:selected, :boolean) + add(:unit_id, references(:units)) + add(:skin_id, references(:skins)) + + timestamps(type: :utc_datetime) + end + end +end From 76937dd1aa9e808900b051a218242036b2b0610f Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:09:39 -0300 Subject: [PATCH 03/14] Upgrade arena version --- apps/arena/mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/arena/mix.exs b/apps/arena/mix.exs index 4066edee0..a9a4a1d61 100644 --- a/apps/arena/mix.exs +++ b/apps/arena/mix.exs @@ -4,7 +4,7 @@ defmodule Arena.MixProject do def project do [ app: :arena, - version: "0.18.1", + version: "0.19.1", build_path: "../../_build", config_path: "../../config/config.exs", deps_path: "../../deps", From 6357a60cd16a3c8a4800835d602dc458a3eaf18d Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:23:32 -0300 Subject: [PATCH 04/14] Send selected character and skin when creating and starting game --- apps/arena/lib/arena/socket_handler.ex | 15 +++++++++++- apps/game_backend/lib/game_backend/units.ex | 2 +- .../curse_of_mirra/user_controller.ex | 24 +++++++++++++++++-- apps/gateway/lib/gateway/router.ex | 1 + 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/apps/arena/lib/arena/socket_handler.ex b/apps/arena/lib/arena/socket_handler.ex index ec7a9cbde..60d8f69f4 100644 --- a/apps/arena/lib/arena/socket_handler.ex +++ b/apps/arena/lib/arena/socket_handler.ex @@ -29,8 +29,20 @@ defmodule Arena.SocketHandler do user_id end + gateway_url = Application.get_env(:arena, :gateway_url) + url = "#{gateway_url}/curse/users/#{user_id}/get_unit" + + {:ok, %{character_name: character_name, skin_name: skin_name}} = + case Finch.build(:get, url, [{"content-type", "application/json"}]) + |> Finch.request(Arena.Finch) do + {:ok, payload} -> + {:ok, Jason.decode!(payload.body, [{:keys, :atoms}])} + + {:error, _} -> + {:error, %{}} + end + matchmaking_queue = Matchmaking.get_queue(:cowboy_req.binding(:mode, req)) - character_name = :cowboy_req.binding(:character_name, req) player_name = :cowboy_req.binding(:player_name, req) {:cowboy_websocket, req, @@ -38,6 +50,7 @@ defmodule Arena.SocketHandler do client_id: user_id, matchmaking_queue: matchmaking_queue, character_name: character_name, + skin_name: skin_name, player_name: player_name }} end diff --git a/apps/game_backend/lib/game_backend/units.ex b/apps/game_backend/lib/game_backend/units.ex index e52a557c6..8ab28556e 100644 --- a/apps/game_backend/lib/game_backend/units.ex +++ b/apps/game_backend/lib/game_backend/units.ex @@ -105,7 +105,7 @@ defmodule GameBackend.Units do limit: 1 ) |> Repo.one() - |> Repo.preload([:character, :user]) + |> Repo.preload([:character, :user, [skins: :skin]]) @doc """ Gets the user's single selected unit. Fails if they have many or none. diff --git a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex index 5c6cdd066..d229e2c73 100644 --- a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex +++ b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex @@ -7,6 +7,7 @@ defmodule Gateway.Controllers.CurseOfMirra.UserController do alias GameBackend.Users alias GameBackend.Rewards alias GameBackend.Utils + alias GameBackend.Units action_fallback Gateway.Controllers.FallbackController @@ -18,6 +19,13 @@ defmodule Gateway.Controllers.CurseOfMirra.UserController do end end + def get_unit(conn, %{"user_id" => user_id}) do + with unit <- Units.get_selected_unit(user_id), + unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do + send_resp(conn, 200, Jason.encode!(%{character_name: unit.character.name, skin_name: unit_skin.skin.name})) + end + end + def claim_daily_reward(conn, %{"user_id" => user_id}) do with {:ok, user} <- Users.get_user(user_id), {:ok, :can_claim} <- Rewards.user_can_claim(user), @@ -38,9 +46,21 @@ defmodule Gateway.Controllers.CurseOfMirra.UserController do end def create_guest_user(conn, %{"client_id" => client_id}) do - with {:ok, %{user: user}} <- Users.insert_curse_user_and_insert_daily_quests() do + with {:ok, %{user: user}} <- Users.insert_curse_user_and_insert_daily_quests(), + {:ok, unit} <- Units.get_selected_unit(user.id), + unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do gateway_jwt = TokenManager.generate_user_token(user, client_id) - send_resp(conn, 200, Jason.encode!(%{user_id: user.id, gateway_jwt: gateway_jwt})) + + send_resp( + conn, + 200, + Jason.encode!(%{ + user_id: user.id, + gateway_jwt: gateway_jwt, + character_name: unit.character.name, + skin_name: unit_skin.skin.name + }) + ) end end diff --git a/apps/gateway/lib/gateway/router.ex b/apps/gateway/lib/gateway/router.ex index 37a0d7b59..2dfaa301a 100644 --- a/apps/gateway/lib/gateway/router.ex +++ b/apps/gateway/lib/gateway/router.ex @@ -36,6 +36,7 @@ defmodule Gateway.Router do scope "/users/:user_id/" do put "/currency", CurrencyController, :modify_currency get "/claim_daily_reward", UserController, :claim_daily_reward + get "/get_unit", UserController, :get_unit get "/get_daily_reward_status", UserController, :get_daily_reward_status scope "/quest" do From 43f70c6ed52901256f6dd4d8ad8307b2823c885b Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:24:55 -0300 Subject: [PATCH 05/14] Add skin params to seeds --- .../lib/game_backend/units/characters.ex | 15 +++ priv/repo/seeds.exs | 126 ++++++++++++++++-- 2 files changed, 128 insertions(+), 13 deletions(-) diff --git a/apps/game_backend/lib/game_backend/units/characters.ex b/apps/game_backend/lib/game_backend/units/characters.ex index 0fe1ac237..bcfdf903b 100644 --- a/apps/game_backend/lib/game_backend/units/characters.ex +++ b/apps/game_backend/lib/game_backend/units/characters.ex @@ -8,6 +8,7 @@ defmodule GameBackend.Units.Characters do alias Ecto.Multi alias GameBackend.Repo alias GameBackend.Units.Characters.Character + alias GameBackend.Units.Characters.Skin ############## # Characters # @@ -199,4 +200,18 @@ defmodule GameBackend.Units.Characters do Repo.all(q) end + + @doc """ + Inserts a Skin. + ## Examples + iex> insert_skin(%{field: value}) + {:ok, %Skin{}} + iex> insert_skin(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + """ + def insert_skin(attrs \\ %{}) do + %Skin{} + |> Skin.changeset(attrs) + |> Repo.insert() + end end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index cbafee15c..37074c247 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -1268,21 +1268,121 @@ uren_params = %{ } # Insert characters +characters = + [ + muflus_params, + h4ck_params, + uma_params, + valtimer_params, + kenzu_params, + otix_params, + shinko_params, + uren_params + ] + |> Enum.reduce([], fn char_params, characters -> + {:ok, character} = + Map.put(char_params, :game_id, curse_of_mirra_id) + |> Map.put(:faction, "none") + |> Characters.insert_character() + + characters ++ [character] + end) + +# Skins params +h4ck_fenix_params = %{ + is_default: false, + name: "Fenix", + character_id: Enum.find(characters, fn c -> c.name == "h4ck" end).id +} + +h4ck_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "h4ck" end).id +} + +muflus_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "muflus" end).id +} + +uma_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "uma" end).id +} + +valtimer_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "valtimer" end).id +} + +kenzu_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "kenzu" end).id +} + +otix_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "otix" end).id +} + +shinko_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "shinko" end).id +} + +uren_basic_params = %{ + is_default: true, + name: "Basic", + character_id: Enum.find(characters, fn c -> c.name == "uren" end).id +} + +uma_chroma_params = %{ + is_default: true, + name: "Chroma", + character_id: Enum.find(characters, fn c -> c.name == "uma" end).id +} + +valtimer_chroma_params = %{ + is_default: true, + name: "Chroma", + character_id: Enum.find(characters, fn c -> c.name == "valtimer" end).id +} + +kenzu_chroma_params = %{ + is_default: true, + name: "Chroma", + character_id: Enum.find(characters, fn c -> c.name == "kenzu" end).id +} + +otix_chroma_params = %{ + is_default: true, + name: "Chroma", + character_id: Enum.find(characters, fn c -> c.name == "otix" end).id +} + +# Insert skins [ - muflus_params, - h4ck_params, - uma_params, - valtimer_params, - kenzu_params, - otix_params, - shinko_params, - uren_params + h4ck_fenix_params, + h4ck_basic_params, + muflus_basic_params, + uma_basic_params, + valtimer_basic_params, + kenzu_basic_params, + otix_basic_params, + shinko_basic_params, + uma_chroma_params, + valtimer_chroma_params, + kenzu_chroma_params, + otix_chroma_params ] -|> Enum.each(fn char_params -> - Map.put(char_params, :game_id, curse_of_mirra_id) - |> Map.put(:faction, "none") - |> Characters.insert_character() -end) +|> Enum.each(fn skin_params -> Characters.insert_skin(skin_params) end) game_configuration_1 = %{ tick_rate_ms: 30, From d741590efd929de28f2ecd69440131e6981a9717 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:26:26 -0300 Subject: [PATCH 06/14] Mark random unit as selected when creating new user --- .../lib/game_backend/curse_of_mirra/users.ex | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex b/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex index d41660c09..3c6d11ef2 100644 --- a/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex +++ b/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex @@ -32,6 +32,7 @@ defmodule GameBackend.CurseOfMirra.Users do Units.get_unit_default_values(char_params.name) ] end) + |> mark_random_unit_as_selected() %{ game_id: Utils.get_game_id(:curse_of_mirra), @@ -42,4 +43,17 @@ defmodule GameBackend.CurseOfMirra.Users do last_daily_quest_generation_at: NaiveDateTime.utc_now() } end + + defp mark_random_unit_as_selected(units) do + random_index = Enum.random(0..(length(units) - 1)) + + Enum.with_index(units) + |> Enum.map(fn {unit, index} -> + if index == random_index do + Map.put(unit, :selected, true) + else + unit + end + end) + end end From 4f11f0d0106bb4e01909cc75318d2da393c53681 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:28:28 -0300 Subject: [PATCH 07/14] Insert unit skins when inserting units --- apps/game_backend/lib/game_backend/units.ex | 10 ++++++++++ apps/game_backend/lib/game_backend/users.ex | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/game_backend/lib/game_backend/units.ex b/apps/game_backend/lib/game_backend/units.ex index 8ab28556e..964ad17cf 100644 --- a/apps/game_backend/lib/game_backend/units.ex +++ b/apps/game_backend/lib/game_backend/units.ex @@ -16,6 +16,7 @@ defmodule GameBackend.Units do alias GameBackend.Units.Characters alias GameBackend.Repo alias GameBackend.Units.Unit + alias GameBackend.Units.UnitSkin alias GameBackend.Units.Characters.Character @doc """ @@ -244,4 +245,13 @@ defmodule GameBackend.Units do character_id: Characters.get_character_id_by_name_and_game_id(character_name, Utils.get_game_id(:curse_of_mirra)) } end + + @doc """ + Inserts a UnitSkin into the database. + """ + def insert_unit_skin(attrs) do + %UnitSkin{} + |> UnitSkin.changeset(attrs) + |> Repo.insert() + end end diff --git a/apps/game_backend/lib/game_backend/users.ex b/apps/game_backend/lib/game_backend/users.ex index e7a03d6ab..58b5deee0 100644 --- a/apps/game_backend/lib/game_backend/users.ex +++ b/apps/game_backend/lib/game_backend/users.ex @@ -18,6 +18,8 @@ defmodule GameBackend.Users do alias GameBackend.Repo alias GameBackend.Transaction alias GameBackend.Users.{Currencies, DungeonSettlementLevel, GoogleUser, KalineTreeLevel, User, Unlock, Upgrade} + alias GameBackend.Units + alias GameBackend.Units.Characters.Skin alias GameBackend.Units.Unit @doc """ @@ -81,7 +83,7 @@ defmodule GameBackend.Users do as: :user, where: u.id == ^id and u.game_id == ^game_id, preload: [ - [units: [:character, :items]], + [units: [:character, :items, skins: [:skin]]], [currencies: [:currency]] ], select: %{u | quest_refresh_at: ^quest_refresh_at} @@ -684,6 +686,19 @@ defmodule GameBackend.Users do {:ok, :quests_generated} end end) + |> Multi.run(:insert_unit_skins, fn _, %{insert_user: user} -> + Enum.each(user.units, fn unit -> + # TODO: When users can buy skins, we should only insert the "default" ones. + # https://github.com/lambdaclass/mirra_backend/issues/1080 + skins = Repo.all(from(s in Skin, where: s.character_id == ^unit.character_id)) + + Enum.each(skins, fn skin -> + Units.insert_unit_skin(%{unit_id: unit.id, skin_id: skin.id, selected: skin.is_default}) + end) + end) + + {:ok, :unit_skins_inserted} + end) |> Multi.run(:user, fn _, %{insert_user: user} -> get_user_by_id_and_game_id(user.id, curse_id) end) From e2f15ee3e0684a487177a39b1058099bc0ac5b11 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:30:46 -0300 Subject: [PATCH 08/14] Send selected unit and skin when logging in --- .../lib/gateway/controllers/auth_controller.ex | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/gateway/lib/gateway/controllers/auth_controller.ex b/apps/gateway/lib/gateway/controllers/auth_controller.ex index be7d9d331..7ba452544 100644 --- a/apps/gateway/lib/gateway/controllers/auth_controller.ex +++ b/apps/gateway/lib/gateway/controllers/auth_controller.ex @@ -6,6 +6,7 @@ defmodule Gateway.Controllers.AuthController do alias Gateway.Auth.TokenManager alias Gateway.Auth.GoogleTokenManager alias GameBackend.Users + alias GameBackend.Units action_fallback Gateway.Controllers.FallbackController @@ -41,9 +42,21 @@ defmodule Gateway.Controllers.AuthController do hashed_client_id = :crypto.hash(:sha256, client_id), {:ok, ^hashed_client_id} <- Base.url_decode64(claims["dev"]), {:ok, _} <- Users.maybe_generate_daily_quests_for_curse_user(claims["sub"]), - {:ok, user} <- Users.get_user_by_id_and_game_id(claims["sub"], curse_id) do + {:ok, user} <- Users.get_user_by_id_and_game_id(claims["sub"], curse_id), + unit <- Units.get_selected_unit(user.id), + unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do new_gateway_jwt = TokenManager.generate_user_token(user, client_id) - send_resp(conn, 200, Jason.encode!(%{gateway_jwt: new_gateway_jwt, user_id: user.id})) + + send_resp( + conn, + 200, + Jason.encode!(%{ + gateway_jwt: new_gateway_jwt, + user_id: user.id, + character_name: unit.character.name, + skin_name: unit_skin.skin.name + }) + ) end end end From 721549b92f3c60ea9b82c12b65c439fef9e650df Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:32:37 -0300 Subject: [PATCH 09/14] Add new endpoint to select units' character and skin --- apps/game_backend/lib/game_backend/units.ex | 43 ++++++++++++++++++- .../curse_of_mirra/character_controller.ex | 24 +++++++++++ apps/gateway/lib/gateway/router.ex | 5 +++ 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 apps/gateway/lib/gateway/controllers/curse_of_mirra/character_controller.ex diff --git a/apps/game_backend/lib/game_backend/units.ex b/apps/game_backend/lib/game_backend/units.ex index 964ad17cf..aae454f70 100644 --- a/apps/game_backend/lib/game_backend/units.ex +++ b/apps/game_backend/lib/game_backend/units.ex @@ -12,12 +12,13 @@ defmodule GameBackend.Units do import Ecto.Query + alias Ecto.Multi alias GameBackend.Utils alias GameBackend.Units.Characters alias GameBackend.Repo alias GameBackend.Units.Unit - alias GameBackend.Units.UnitSkin alias GameBackend.Units.Characters.Character + alias GameBackend.Units.UnitSkin @doc """ Inserts a unit. @@ -135,11 +136,14 @@ defmodule GameBackend.Units do Fails if there are more than one unit of the same character. Returns nil if there are none. """ def get_unit_by_character_name(character_name, user_id) do + character_name = String.downcase(character_name) + case Repo.one( from(unit in user_units_query(user_id), join: character in Character, on: unit.character_id == character.id, - where: character.name == ^character_name + where: character.name == ^character_name, + preload: [skins: :skin] ) ) do nil -> {:error, :not_found} @@ -246,6 +250,41 @@ defmodule GameBackend.Units do } end + def list_units_by_user(user_id) do + {:ok, Repo.all(from(u in Unit, where: u.user_id == ^user_id, preload: :character))} + end + + def select_unit_character(units, character_name) do + character_name = String.downcase(character_name) + + Enum.reduce(units, Multi.new(), fn unit, multi -> + Multi.update( + multi, + "select_character_#{unit.id}", + Unit.changeset(unit, %{selected: unit.character.name == character_name}) + ) + end) + |> Repo.transaction() + end + + def select_unit_skin(unit, skin_name) do + Enum.reduce(unit.skins, Multi.new(), fn unit_skin, multi -> + Multi.update( + multi, + "select_skin_#{unit_skin.id}", + UnitSkin.changeset(unit_skin, %{selected: unit_skin.skin.name == skin_name}) + ) + end) + |> Repo.transaction() + end + + def has_skin?(unit, skin_name) do + case Enum.any?(unit.skins, fn unit_skin -> unit_skin.skin.name == skin_name end) |> IO.inspect() do + true -> {:ok, :skin_exists} + _ -> {:error, :skin_not_found} + end + end + @doc """ Inserts a UnitSkin into the database. """ diff --git a/apps/gateway/lib/gateway/controllers/curse_of_mirra/character_controller.ex b/apps/gateway/lib/gateway/controllers/curse_of_mirra/character_controller.ex new file mode 100644 index 000000000..1d6e68d8d --- /dev/null +++ b/apps/gateway/lib/gateway/controllers/curse_of_mirra/character_controller.ex @@ -0,0 +1,24 @@ +defmodule Gateway.Controllers.CurseOfMirra.CharacterController do + @moduledoc """ + Controller for Character modifications. + """ + use Gateway, :controller + alias GameBackend.Units + + action_fallback Gateway.Controllers.FallbackController + + def select(conn, params) do + with {:ok, units} <- Units.list_units_by_user(params["user_id"]), + {:ok, _transaction} <- Units.select_unit_character(units, params["character_name"]) do + send_resp(conn, 200, Jason.encode!(%{character_name: params["character_name"]})) + end + end + + def select_skin(conn, params) do + with {:ok, unit} <- Units.get_unit_by_character_name(params["character_name"], params["user_id"]), + {:ok, :skin_exists} <- Units.has_skin?(unit, params["skin_name"]), + {:ok, _transaction} <- Units.select_unit_skin(unit, params["skin_name"]) do + send_resp(conn, 200, Jason.encode!(%{character_name: params["character_name"], skin_name: params["skin_name"]})) + end + end +end diff --git a/apps/gateway/lib/gateway/router.ex b/apps/gateway/lib/gateway/router.ex index 2dfaa301a..c72d0d5a0 100644 --- a/apps/gateway/lib/gateway/router.ex +++ b/apps/gateway/lib/gateway/router.ex @@ -50,6 +50,11 @@ defmodule Gateway.Router do put "/equip", ItemController, :equip end + scope "/characters" do + post "/select", CharacterController, :select + post "/select_skin", CharacterController, :select_skin + end + scope "/stores" do put "/:store_name/buy_item", StoreController, :buy_item end From 66cd6b83668df922f61105bdcb57a0406dc982c8 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:33:41 -0300 Subject: [PATCH 10/14] Update game mode params every 30 seconds --- apps/arena/lib/arena/matchmaking/deathmatch_mode.ex | 4 ++-- apps/arena/lib/arena/matchmaking/duo_mode.ex | 4 ++-- apps/arena/lib/arena/matchmaking/game_launcher.ex | 4 ++-- apps/arena/lib/arena/matchmaking/trio_mode.ex | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/arena/lib/arena/matchmaking/deathmatch_mode.ex b/apps/arena/lib/arena/matchmaking/deathmatch_mode.ex index 3ea1f63df..5be9e1dad 100644 --- a/apps/arena/lib/arena/matchmaking/deathmatch_mode.ex +++ b/apps/arena/lib/arena/matchmaking/deathmatch_mode.ex @@ -26,7 +26,7 @@ defmodule Arena.Matchmaking.DeathmatchMode do @impl true def init(_) do Process.send_after(self(), :launch_game?, 300) - Process.send_after(self(), :update_params, 20_000) + Process.send_after(self(), :update_params, 30_000) {:ok, %{clients: [], batch_start_at: 0}} end @@ -101,7 +101,7 @@ defmodule Arena.Matchmaking.DeathmatchMode do game_mode_configuration end - Process.send_after(self(), :update_params, 5000) + Process.send_after(self(), :update_params, 30_000) {:noreply, Map.put(state, :game_mode_configuration, game_mode_configuration)} end diff --git a/apps/arena/lib/arena/matchmaking/duo_mode.ex b/apps/arena/lib/arena/matchmaking/duo_mode.ex index 3e3b38b6a..d89da48de 100644 --- a/apps/arena/lib/arena/matchmaking/duo_mode.ex +++ b/apps/arena/lib/arena/matchmaking/duo_mode.ex @@ -24,7 +24,7 @@ defmodule Arena.Matchmaking.DuoMode do @impl true def init(_) do Process.send_after(self(), :launch_game?, 300) - Process.send_after(self(), :update_params, 20_000) + Process.send_after(self(), :update_params, 30_000) {:ok, %{clients: [], batch_start_at: 0}} end @@ -89,7 +89,7 @@ defmodule Arena.Matchmaking.DuoMode do game_mode_configuration end - Process.send_after(self(), :update_params, 5000) + Process.send_after(self(), :update_params, 30_000) {:noreply, Map.put(state, :game_mode_configuration, game_mode_configuration)} end diff --git a/apps/arena/lib/arena/matchmaking/game_launcher.ex b/apps/arena/lib/arena/matchmaking/game_launcher.ex index 24dd0fe0e..e63bebeb9 100644 --- a/apps/arena/lib/arena/matchmaking/game_launcher.ex +++ b/apps/arena/lib/arena/matchmaking/game_launcher.ex @@ -23,7 +23,7 @@ defmodule Arena.Matchmaking.GameLauncher do @impl true def init(_) do Process.send_after(self(), :launch_game?, 300) - Process.send_after(self(), :update_params, 20_000) + Process.send_after(self(), :update_params, 30_000) {:ok, %{clients: [], batch_start_at: 0}} end @@ -96,7 +96,7 @@ defmodule Arena.Matchmaking.GameLauncher do game_mode_configuration end - Process.send_after(self(), :update_params, 5000) + Process.send_after(self(), :update_params, 30_000) {:noreply, Map.put(state, :game_mode_configuration, game_mode_configuration)} end diff --git a/apps/arena/lib/arena/matchmaking/trio_mode.ex b/apps/arena/lib/arena/matchmaking/trio_mode.ex index 2f5fce9e7..02fb87f00 100644 --- a/apps/arena/lib/arena/matchmaking/trio_mode.ex +++ b/apps/arena/lib/arena/matchmaking/trio_mode.ex @@ -24,7 +24,7 @@ defmodule Arena.Matchmaking.TrioMode do @impl true def init(_) do Process.send_after(self(), :launch_game?, 300) - Process.send_after(self(), :update_params, 20_000) + Process.send_after(self(), :update_params, 30_000) {:ok, %{clients: [], batch_start_at: 0}} end @@ -89,7 +89,7 @@ defmodule Arena.Matchmaking.TrioMode do game_mode_configuration end - Process.send_after(self(), :update_params, 5000) + Process.send_after(self(), :update_params, 30_000) {:noreply, Map.put(state, :game_mode_configuration, game_mode_configuration)} end From 294296e3afab4a157c8abbc5f2533cc87faca2d2 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:36:42 -0300 Subject: [PATCH 11/14] Format elixir code --- .../lib/gateway/controllers/curse_of_mirra/user_controller.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex index d229e2c73..61783382e 100644 --- a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex +++ b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex @@ -47,8 +47,8 @@ defmodule Gateway.Controllers.CurseOfMirra.UserController do def create_guest_user(conn, %{"client_id" => client_id}) do with {:ok, %{user: user}} <- Users.insert_curse_user_and_insert_daily_quests(), - {:ok, unit} <- Units.get_selected_unit(user.id), - unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do + {:ok, unit} <- Units.get_selected_unit(user.id), + unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do gateway_jwt = TokenManager.generate_user_token(user, client_id) send_resp( From c40eb796a72c334de287e74bffe294b126e730ed Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 16:41:00 -0300 Subject: [PATCH 12/14] Delete missing inspect --- apps/game_backend/lib/game_backend/units.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game_backend/lib/game_backend/units.ex b/apps/game_backend/lib/game_backend/units.ex index aae454f70..87e6f8543 100644 --- a/apps/game_backend/lib/game_backend/units.ex +++ b/apps/game_backend/lib/game_backend/units.ex @@ -279,7 +279,7 @@ defmodule GameBackend.Units do end def has_skin?(unit, skin_name) do - case Enum.any?(unit.skins, fn unit_skin -> unit_skin.skin.name == skin_name end) |> IO.inspect() do + case Enum.any?(unit.skins, fn unit_skin -> unit_skin.skin.name == skin_name end) do true -> {:ok, :skin_exists} _ -> {:error, :skin_not_found} end From cb2e471b49ce97d2e51bb114fd72154a7fc3add0 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 17:27:17 -0300 Subject: [PATCH 13/14] Delete json and retrieve active characters from DB --- .../lib/game_backend/curse_of_mirra/config.ex | 9 --- .../lib/game_backend/curse_of_mirra/users.ex | 9 ++- apps/game_backend/lib/game_backend/units.ex | 6 +- apps/game_backend/priv/characters_config.json | 72 ------------------- .../curse_of_mirra/user_controller.ex | 2 +- priv/repo/seeds.exs | 1 + 6 files changed, 10 insertions(+), 89 deletions(-) delete mode 100644 apps/game_backend/priv/characters_config.json diff --git a/apps/game_backend/lib/game_backend/curse_of_mirra/config.ex b/apps/game_backend/lib/game_backend/curse_of_mirra/config.ex index 365a4201a..d021df4e5 100644 --- a/apps/game_backend/lib/game_backend/curse_of_mirra/config.ex +++ b/apps/game_backend/lib/game_backend/curse_of_mirra/config.ex @@ -18,15 +18,6 @@ defmodule GameBackend.CurseOfMirra.Config do |> Quests.upsert_quests() end - def get_characters_config() do - {:ok, characters_config_json} = - Application.app_dir(:game_backend, "priv/characters_config.json") - |> File.read() - - Jason.decode!(characters_config_json, [{:keys, :atoms}]) - |> Map.get(:characters) - end - def import_stores_config() do curse_of_mirra_id = Utils.get_game_id(:curse_of_mirra) diff --git a/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex b/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex index 3c6d11ef2..63fb5b8a9 100644 --- a/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex +++ b/apps/game_backend/lib/game_backend/curse_of_mirra/users.ex @@ -2,11 +2,12 @@ defmodule GameBackend.CurseOfMirra.Users do @moduledoc """ Module to work with users logic """ + alias GameBackend.Units.Characters alias GameBackend.Units alias GameBackend.Repo alias GameBackend.Users.User alias GameBackend.Utils - alias GameBackend.CurseOfMirra.Config + alias GameBackend.Configuration @doc """ Generates a default map with its associations for a new user @@ -24,12 +25,14 @@ defmodule GameBackend.CurseOfMirra.Users do amount_of_users = Repo.aggregate(User, :count) username = "User_#{amount_of_users + 1}" ################################################################## + version = Configuration.get_current_version() + active_characters = Characters.get_curse_characters_by_version(version.id) |> Enum.filter(fn c -> c.active end) units = - Enum.reduce(Config.get_characters_config(), [], fn char_params, acc -> + Enum.reduce(active_characters, [], fn char_params, acc -> acc ++ [ - Units.get_unit_default_values(char_params.name) + Units.get_unit_default_values(char_params) ] end) |> mark_random_unit_as_selected() diff --git a/apps/game_backend/lib/game_backend/units.ex b/apps/game_backend/lib/game_backend/units.ex index 87e6f8543..383677b85 100644 --- a/apps/game_backend/lib/game_backend/units.ex +++ b/apps/game_backend/lib/game_backend/units.ex @@ -13,8 +13,6 @@ defmodule GameBackend.Units do import Ecto.Query alias Ecto.Multi - alias GameBackend.Utils - alias GameBackend.Units.Characters alias GameBackend.Repo alias GameBackend.Units.Unit alias GameBackend.Units.Characters.Character @@ -241,12 +239,12 @@ defmodule GameBackend.Units do |> Repo.update() end - def get_unit_default_values(character_name) do + def get_unit_default_values(char_params) do %{ level: 1, prestige: 0, selected: false, - character_id: Characters.get_character_id_by_name_and_game_id(character_name, Utils.get_game_id(:curse_of_mirra)) + character_id: char_params.id } end diff --git a/apps/game_backend/priv/characters_config.json b/apps/game_backend/priv/characters_config.json deleted file mode 100644 index a848f9738..000000000 --- a/apps/game_backend/priv/characters_config.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "characters": [ - { - "name": "muflus", - "active": true, - "base_speed": 0.63, - "base_size": 110.0, - "base_health": 440, - "base_stamina": 3, - "stamina_interval": 2000, - "max_inventory_size": 1, - "natural_healing_interval": 1000, - "natural_healing_damage_interval": 3500, - "skills": { - "1": "muflus_crush", - "2": "muflus_leap", - "3": "muflus_dash" - } - }, - { - "name": "h4ck", - "active": true, - "base_speed": 0.7, - "base_size": 90.0, - "base_health": 400, - "base_stamina": 3, - "stamina_interval": 1800, - "max_inventory_size": 1, - "natural_healing_interval": 1000, - "natural_healing_damage_interval": 3500, - "skills": { - "1": "h4ck_slingshot", - "2": "h4ck_denial_of_service", - "3": "h4ck_dash" - } - }, - { - "name": "uma", - "active": true, - "base_speed": 0.67, - "base_size": 95.0, - "base_health": 400, - "base_stamina": 3, - "stamina_interval": 2000, - "max_inventory_size": 1, - "natural_healing_interval": 1000, - "natural_healing_damage_interval": 3500, - "skills": { - "1": "uma_avenge", - "2": "uma_veil_radiance", - "3": "uma_sneak" - } - }, - { - "name": "valtimer", - "active": false, - "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, - "skills": { - "1": "valt_antimatter", - "2": "valt_singularity", - "3": "valt_warp" - } - } - ] -} diff --git a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex index 61783382e..17a10cd39 100644 --- a/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex +++ b/apps/gateway/lib/gateway/controllers/curse_of_mirra/user_controller.ex @@ -47,7 +47,7 @@ defmodule Gateway.Controllers.CurseOfMirra.UserController do def create_guest_user(conn, %{"client_id" => client_id}) do with {:ok, %{user: user}} <- Users.insert_curse_user_and_insert_daily_quests(), - {:ok, unit} <- Units.get_selected_unit(user.id), + unit <- Units.get_selected_unit(user.id), unit_skin <- Enum.find(unit.skins, fn unit_skin -> unit_skin.selected end) do gateway_jwt = TokenManager.generate_user_token(user, client_id) diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 37074c247..47933aefe 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -1377,6 +1377,7 @@ otix_chroma_params = %{ kenzu_basic_params, otix_basic_params, shinko_basic_params, + uren_basic_params, uma_chroma_params, valtimer_chroma_params, kenzu_chroma_params, From 5eae09d1908c231f3d24a3630ba723f56af3de35 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 13 Feb 2025 18:20:22 -0300 Subject: [PATCH 14/14] Upgrade arena version (once again) --- apps/arena/mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/arena/mix.exs b/apps/arena/mix.exs index a9a4a1d61..00e03f840 100644 --- a/apps/arena/mix.exs +++ b/apps/arena/mix.exs @@ -4,7 +4,7 @@ defmodule Arena.MixProject do def project do [ app: :arena, - version: "0.19.1", + version: "0.20.1", build_path: "../../_build", config_path: "../../config/config.exs", deps_path: "../../deps",