diff --git a/EpinelPS/GameData/Currency.cs b/EpinelPS/GameData/Currency.cs index f515548..3aa39af 100644 --- a/EpinelPS/GameData/Currency.cs +++ b/EpinelPS/GameData/Currency.cs @@ -11,9 +11,9 @@ namespace EpinelPS CharacterExp2 = 3000, FriendshipPoint = 4000, ArenaChip = 5000, - CharPremiumTicket = 5100, - CharCustomizeTicket = 5200, - CharCorporationTicket = 5300, + CharPremiumTicket = 5100, //normal cards + CharCustomizeTicket = 5200, //spec cards + CharCorporationTicket = 5300, //unused ArenaTicket = 6001, _2NdArenaTicket = 6002, InterceptTicket2 = 6003, diff --git a/EpinelPS/GameData/JsonStaticData.cs b/EpinelPS/GameData/JsonStaticData.cs index 688d8fc..c82345d 100644 --- a/EpinelPS/GameData/JsonStaticData.cs +++ b/EpinelPS/GameData/JsonStaticData.cs @@ -137,6 +137,7 @@ public int piece_id; public string original_rare = ""; public string corporation = ""; + public string corporation_sub_type = ""; public int grade_core_id; public int name_code; public int grow_grade; diff --git a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs index aec29ed..4506ba9 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs @@ -21,6 +21,8 @@ namespace EpinelPS.LobbyServer.Gacha protected override async Task HandleAsync() { var req = await ReadData(); + var IncreasedChanceCharacterID = req.Tid; + // Count determines whether we select 1 or 10 characters int numberOfPulls = req.Count == 1 ? 1 : 10; @@ -39,7 +41,8 @@ namespace EpinelPS.LobbyServer.Gacha var srCharacters = allCharacterData.Where(c => c.original_rare == "SR").ToList(); // Separate Pilgrim SSRs and non-Pilgrim SSRs - var pilgrimCharacters = allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation == "PILGRIM").ToList(); + // treat overspec as pilgrim + var pilgrimCharacters = allCharacterData.Where(c => (c.original_rare == "SSR" && c.corporation == "PILGRIM") || (c.original_rare == "SSR" && c.corporation_sub_type == "OVERSPEC")).ToList(); var ssrCharacters = allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation != "PILGRIM").ToList(); var selectedCharacters = new List(); @@ -55,7 +58,7 @@ namespace EpinelPS.LobbyServer.Gacha // New method: Select characters based on req.Count value, with each character having its category determined independently, excluding characters in the normalPullsExclusionList for (int i = 0; i < numberOfPulls; i++) { - var character = SelectRandomCharacter(rCharacters, srCharacters, ssrCharacters, pilgrimCharacters, normalPullsExclusionList); + var character = SelectRandomCharacter(rCharacters, srCharacters, ssrCharacters, pilgrimCharacters, normalPullsExclusionList, IncreasedChanceCharacterID, allCharacterData); selectedCharacters.Add(character); } } @@ -245,46 +248,60 @@ namespace EpinelPS.LobbyServer.Gacha await WriteDataAsync(response); } - private static CharacterRecord SelectRandomCharacter(List rCharacters, List srCharacters, List ssrCharacters, List pilgrimCharacters, List exclusionList) - { - // Remove excluded characters from each category - var availableRCharacters = rCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); - var availableSRCharacters = srCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); - var availableSSRCharacters = ssrCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); - var availablePilgrimCharacters = pilgrimCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); + private static CharacterRecord SelectRandomCharacter(List rCharacters,List srCharacters,List ssrCharacters,List pilgrimCharacters,List exclusionList,int increasedChanceCharacterID,List allCharacterData) + { + // Remove excluded characters from each category + var availableRCharacters = rCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); + var availableSRCharacters = srCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); + var availableSSRCharacters = ssrCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); + var availablePilgrimCharacters = pilgrimCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); - // Each time we call this method, a new category will be selected for a single character - double roll = random.NextDouble() * 100; // Roll from 0 to 100 + // Find the IncreasedChanceCharacterID in the SSR list + var increasedChanceCharacter = availableSSRCharacters.FirstOrDefault(c => c.id == increasedChanceCharacterID); + bool isPilgrimOrOverspec = increasedChanceCharacter != null && (increasedChanceCharacter.corporation == "PILGRIM" || increasedChanceCharacter.corporation_sub_type == "OVERSPEC"); - if (roll < 53 && availableRCharacters.Count != 0) - { - // R category - return availableRCharacters[random.Next(availableRCharacters.Count)]; - } - else if (roll < 53 + 43 && availableSRCharacters.Count != 0) - { - // SR category - return availableSRCharacters[random.Next(availableSRCharacters.Count)]; - } - else - { - // SSR category - double ssrRoll = random.NextDouble() * 100; + double increasedChance = increasedChanceCharacterID != 1 ? (isPilgrimOrOverspec ? 1.0 : 2.0): 0.0; - if (ssrRoll < 4.55 && availablePilgrimCharacters.Count != 0) - { - // PILGRIM SSR - return availablePilgrimCharacters[random.Next(availablePilgrimCharacters.Count)]; - } - else if (availableSSRCharacters.Count != 0) - { - // Non-PILGRIM SSR - return availableSSRCharacters[random.Next(availableSSRCharacters.Count)]; - } - } + double roll = random.NextDouble() * 100; // Roll from 0 to 100 + + if (roll < 53 && availableRCharacters.Count != 0) + { + // R category + return availableRCharacters[random.Next(availableRCharacters.Count)]; + } + else if (roll < 53 + 43 && availableSRCharacters.Count != 0) + { + // SR category + return availableSRCharacters[random.Next(availableSRCharacters.Count)]; + } + else + { + // SSR category + double ssrRoll = random.NextDouble() * 100; + + if (increasedChanceCharacter != null && ssrRoll < increasedChance) + { + // Increased Chance SSR + return increasedChanceCharacter; + } + + ssrRoll -= increasedChance; + + if (ssrRoll < 4.55 && availablePilgrimCharacters.Count != 0) + { + // PILGRIM SSR + return availablePilgrimCharacters[random.Next(availablePilgrimCharacters.Count)]; + } + else if (availableSSRCharacters.Count != 0) + { + // Non-PILGRIM SSR + return availableSSRCharacters[random.Next(availableSSRCharacters.Count)]; + } + } + + // Fallback to a random R character if somehow no SSR characters are left after exclusion + return availableRCharacters.Count != 0 ? availableRCharacters[random.Next(availableRCharacters.Count)] : throw new Exception("cannot find any characters"); + } - // Fallback to a random R character if somehow no SSR characters are left after exclusion - return availableRCharacters.Count != 0 ? availableRCharacters[random.Next(availableRCharacters.Count)] : throw new Exception("cannot find any characters"); - } } } \ No newline at end of file diff --git a/EpinelPS/Program.cs b/EpinelPS/Program.cs index 64b7e05..12cff9e 100644 --- a/EpinelPS/Program.cs +++ b/EpinelPS/Program.cs @@ -309,55 +309,56 @@ namespace EpinelPS } } } - else if (input == "addallmaterials") - { - if (selectedUser == 0) - { - Console.WriteLine("No user selected"); - } - else - { - var user = JsonDb.Instance.Users.FirstOrDefault(x => x.ID == selectedUser); - if (user == null) - { - Console.WriteLine("Selected user does not exist"); - selectedUser = 0; - prompt = "# "; - } - else - { - int amount = 1000000; - if (args.Length >= 2) - { - int.TryParse(args[1], out amount); - } + else if (input.StartsWith("addallmaterials")) + { + if (selectedUser == 0) + { + Console.WriteLine("No user selected"); + } + else + { + var user = JsonDb.Instance.Users.FirstOrDefault(x => x.ID == selectedUser); + if (user == null) + { + Console.WriteLine("Selected user does not exist"); + selectedUser = 0; + prompt = "# "; + } + else + { + int amount = 1; // Default amount if not provided + if (args.Length >= 2 && int.TryParse(args[1], out int parsedAmount)) + { + amount = parsedAmount; + } - foreach (var tableItem in GameData.Instance.itemMaterialTable.Values) - { - ItemData? item = user.Items.FirstOrDefault(i => i.ItemType == tableItem.id); + foreach (var tableItem in GameData.Instance.itemMaterialTable.Values) + { + ItemData? item = user.Items.FirstOrDefault(i => i.ItemType == tableItem.id); - if (item == null) - { - user.Items.Add(new ItemData - { - Isn = user.GenerateUniqueItemId(), - ItemType = tableItem.id, - Level = 1, - Exp = 1, - Count = amount - }); - } - else - { - item.Count += amount; - } - } + if (item == null) + { + user.Items.Add(new ItemData + { + Isn = user.GenerateUniqueItemId(), + ItemType = tableItem.id, + Level = 1, + Exp = 1, + Count = amount + }); + } + else + { + item.Count += amount; + } + } + + Console.WriteLine($"Added {amount} of all materials to user " + user.Username); + JsonDb.Save(); + } + } + } - Console.WriteLine($"Added {amount} of all materials to user " + user.Username); - JsonDb.Save(); - } - } - } else if (input == "finishalltutorials") { if (selectedUser == 0)