Probably handles increased chance in pickup gacha

And fixes command addallmaterials to actually work with ammount argument

increased chance needs testing but doesnt seem to break anything
This commit is contained in:
SELEKCJONER
2024-12-29 13:46:51 +01:00
parent cbd58df62f
commit 675eda043f
4 changed files with 107 additions and 88 deletions

View File

@@ -11,9 +11,9 @@ namespace EpinelPS
CharacterExp2 = 3000, CharacterExp2 = 3000,
FriendshipPoint = 4000, FriendshipPoint = 4000,
ArenaChip = 5000, ArenaChip = 5000,
CharPremiumTicket = 5100, CharPremiumTicket = 5100, //normal cards
CharCustomizeTicket = 5200, CharCustomizeTicket = 5200, //spec cards
CharCorporationTicket = 5300, CharCorporationTicket = 5300, //unused
ArenaTicket = 6001, ArenaTicket = 6001,
_2NdArenaTicket = 6002, _2NdArenaTicket = 6002,
InterceptTicket2 = 6003, InterceptTicket2 = 6003,

View File

@@ -137,6 +137,7 @@
public int piece_id; public int piece_id;
public string original_rare = ""; public string original_rare = "";
public string corporation = ""; public string corporation = "";
public string corporation_sub_type = "";
public int grade_core_id; public int grade_core_id;
public int name_code; public int name_code;
public int grow_grade; public int grow_grade;

View File

@@ -21,6 +21,8 @@ namespace EpinelPS.LobbyServer.Gacha
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
var req = await ReadData<ReqExecuteGacha>(); var req = await ReadData<ReqExecuteGacha>();
var IncreasedChanceCharacterID = req.Tid;
// Count determines whether we select 1 or 10 characters // Count determines whether we select 1 or 10 characters
int numberOfPulls = req.Count == 1 ? 1 : 10; 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(); var srCharacters = allCharacterData.Where(c => c.original_rare == "SR").ToList();
// Separate Pilgrim SSRs and non-Pilgrim SSRs // 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 ssrCharacters = allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation != "PILGRIM").ToList();
var selectedCharacters = new List<CharacterRecord>(); var selectedCharacters = new List<CharacterRecord>();
@@ -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 // 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++) 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); selectedCharacters.Add(character);
} }
} }
@@ -245,46 +248,60 @@ namespace EpinelPS.LobbyServer.Gacha
await WriteDataAsync(response); await WriteDataAsync(response);
} }
private static CharacterRecord SelectRandomCharacter(List<CharacterRecord> rCharacters, List<CharacterRecord> srCharacters, List<CharacterRecord> ssrCharacters, List<CharacterRecord> pilgrimCharacters, List<int> exclusionList) private static CharacterRecord SelectRandomCharacter(List<CharacterRecord> rCharacters,List<CharacterRecord> srCharacters,List<CharacterRecord> ssrCharacters,List<CharacterRecord> pilgrimCharacters,List<int> exclusionList,int increasedChanceCharacterID,List<CharacterRecord> allCharacterData)
{ {
// Remove excluded characters from each category // Remove excluded characters from each category
var availableRCharacters = rCharacters.Where(c => !exclusionList.Contains(c.id)).ToList(); var availableRCharacters = rCharacters.Where(c => !exclusionList.Contains(c.id)).ToList();
var availableSRCharacters = srCharacters.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 availableSSRCharacters = ssrCharacters.Where(c => !exclusionList.Contains(c.id)).ToList();
var availablePilgrimCharacters = pilgrimCharacters.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 // Find the IncreasedChanceCharacterID in the SSR list
double roll = random.NextDouble() * 100; // Roll from 0 to 100 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) double increasedChance = increasedChanceCharacterID != 1 ? (isPilgrimOrOverspec ? 1.0 : 2.0): 0.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 (ssrRoll < 4.55 && availablePilgrimCharacters.Count != 0) double roll = random.NextDouble() * 100; // Roll from 0 to 100
{
// PILGRIM SSR if (roll < 53 && availableRCharacters.Count != 0)
return availablePilgrimCharacters[random.Next(availablePilgrimCharacters.Count)]; {
} // R category
else if (availableSSRCharacters.Count != 0) return availableRCharacters[random.Next(availableRCharacters.Count)];
{ }
// Non-PILGRIM SSR else if (roll < 53 + 43 && availableSRCharacters.Count != 0)
return availableSSRCharacters[random.Next(availableSSRCharacters.Count)]; {
} // 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");
}
} }
} }

View File

@@ -309,55 +309,56 @@ namespace EpinelPS
} }
} }
} }
else if (input == "addallmaterials") else if (input.StartsWith("addallmaterials"))
{ {
if (selectedUser == 0) if (selectedUser == 0)
{ {
Console.WriteLine("No user selected"); Console.WriteLine("No user selected");
} }
else else
{ {
var user = JsonDb.Instance.Users.FirstOrDefault(x => x.ID == selectedUser); var user = JsonDb.Instance.Users.FirstOrDefault(x => x.ID == selectedUser);
if (user == null) if (user == null)
{ {
Console.WriteLine("Selected user does not exist"); Console.WriteLine("Selected user does not exist");
selectedUser = 0; selectedUser = 0;
prompt = "# "; prompt = "# ";
} }
else else
{ {
int amount = 1000000; int amount = 1; // Default amount if not provided
if (args.Length >= 2) if (args.Length >= 2 && int.TryParse(args[1], out int parsedAmount))
{ {
int.TryParse(args[1], out amount); amount = parsedAmount;
} }
foreach (var tableItem in GameData.Instance.itemMaterialTable.Values) foreach (var tableItem in GameData.Instance.itemMaterialTable.Values)
{ {
ItemData? item = user.Items.FirstOrDefault(i => i.ItemType == tableItem.id); ItemData? item = user.Items.FirstOrDefault(i => i.ItemType == tableItem.id);
if (item == null) if (item == null)
{ {
user.Items.Add(new ItemData user.Items.Add(new ItemData
{ {
Isn = user.GenerateUniqueItemId(), Isn = user.GenerateUniqueItemId(),
ItemType = tableItem.id, ItemType = tableItem.id,
Level = 1, Level = 1,
Exp = 1, Exp = 1,
Count = amount Count = amount
}); });
} }
else else
{ {
item.Count += amount; 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") else if (input == "finishalltutorials")
{ {
if (selectedUser == 0) if (selectedUser == 0)