mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 17:23:58 +00:00
SupporterCard Affix can now be changed.
This commit is contained in:
@@ -4,8 +4,7 @@ namespace MikuSB.GameServer.Game.Support;
|
||||
|
||||
public static class SupportAffixService
|
||||
{
|
||||
// Returns (affixId, tier) - both 1-based. Returns (0,0) if pool not found.
|
||||
public static (uint AffixId, uint Tier) GenerateRandomAffix(int poolId)
|
||||
public static (uint AffixId, uint Tier) GenerateRandomAffix(int poolId, IEnumerable<uint>? excludedAffixIds = null)
|
||||
{
|
||||
if (!GameData.SupportAffixPoolData.TryGetValue(poolId, out var pool))
|
||||
return (0, 0);
|
||||
@@ -32,9 +31,20 @@ public static class SupportAffixService
|
||||
if (selectedAffixs.Count == 0)
|
||||
return (0, 0);
|
||||
|
||||
var affixId = selectedAffixs[Random.Shared.Next(selectedAffixs.Count)];
|
||||
var excluded = excludedAffixIds?.ToHashSet() ?? [];
|
||||
var candidates = selectedAffixs.Where(x => !excluded.Contains((uint)x)).ToList();
|
||||
if (candidates.Count == 0)
|
||||
candidates = selectedAffixs.ToList();
|
||||
|
||||
var affixId = candidates[Random.Shared.Next(candidates.Count)];
|
||||
var tierCount = GameData.SupportAffixData.GetValueOrDefault(affixId)?.TierCount ?? 5;
|
||||
var tier = (uint)(Random.Shared.Next(tierCount) + 1);
|
||||
return ((uint)affixId, tier);
|
||||
}
|
||||
|
||||
public static uint GenerateTier(uint affixId)
|
||||
{
|
||||
var tierCount = GameData.SupportAffixData.GetValueOrDefault((int)affixId)?.TierCount ?? 5;
|
||||
return (uint)(Random.Shared.Next(tierCount) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
70
GameServer/Game/Support/SupportAffixStateService.cs
Normal file
70
GameServer/Game/Support/SupportAffixStateService.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using MikuSB.Database.Inventory;
|
||||
|
||||
namespace MikuSB.GameServer.Game.Support;
|
||||
|
||||
public static class SupportAffixStateService
|
||||
{
|
||||
public const int PairSize = 2;
|
||||
public const int MaxLogicalSlots = 5;
|
||||
public const int ActiveThirdAffixSlot = 3;
|
||||
public const int PendingMaxAffixSlot = 4;
|
||||
public const int PendingInitialAffixSlot = 5;
|
||||
|
||||
public static void EnsureCapacity(GameSupportCardInfo card, int logicalSlot = MaxLogicalSlots)
|
||||
{
|
||||
var minCount = Math.Clamp(logicalSlot, 1, MaxLogicalSlots) * PairSize;
|
||||
while (card.Affixs.Count < minCount)
|
||||
card.Affixs.Add(0);
|
||||
}
|
||||
|
||||
public static (uint AffixId, uint Tier) GetAffix(GameSupportCardInfo card, int logicalSlot)
|
||||
{
|
||||
if (logicalSlot < 1 || logicalSlot > MaxLogicalSlots)
|
||||
return (0, 0);
|
||||
|
||||
var index = (logicalSlot - 1) * PairSize;
|
||||
if (card.Affixs.Count <= index + 1)
|
||||
return (0, 0);
|
||||
|
||||
return (card.Affixs[index], card.Affixs[index + 1]);
|
||||
}
|
||||
|
||||
public static bool HasAffix(GameSupportCardInfo card, int logicalSlot)
|
||||
{
|
||||
var (affixId, tier) = GetAffix(card, logicalSlot);
|
||||
return affixId > 0 && tier > 0;
|
||||
}
|
||||
|
||||
public static void SetAffix(GameSupportCardInfo card, int logicalSlot, uint affixId, uint tier)
|
||||
{
|
||||
if (logicalSlot < 1 || logicalSlot > MaxLogicalSlots)
|
||||
return;
|
||||
|
||||
EnsureCapacity(card, logicalSlot);
|
||||
var index = (logicalSlot - 1) * PairSize;
|
||||
card.Affixs[index] = affixId;
|
||||
card.Affixs[index + 1] = tier;
|
||||
}
|
||||
|
||||
public static void ClearAffix(GameSupportCardInfo card, int logicalSlot)
|
||||
{
|
||||
SetAffix(card, logicalSlot, 0, 0);
|
||||
}
|
||||
|
||||
public static void CopyAffix(GameSupportCardInfo card, int fromSlot, int toSlot)
|
||||
{
|
||||
var (affixId, tier) = GetAffix(card, fromSlot);
|
||||
SetAffix(card, toSlot, affixId, tier);
|
||||
}
|
||||
|
||||
public static uint GetVisibleInitialAffixIndex(GameSupportCardInfo card)
|
||||
{
|
||||
return HasAffix(card, PendingInitialAffixSlot) ? card.AffixId : 0;
|
||||
}
|
||||
|
||||
public static void NormalizePendingState(GameSupportCardInfo card)
|
||||
{
|
||||
if (!HasAffix(card, PendingInitialAffixSlot))
|
||||
card.AffixId = 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user