SupporterCard Affix can now be changed.

This commit is contained in:
Kei-Luna
2026-05-16 16:20:17 +09:00
parent e628a010be
commit f8f7311997
17 changed files with 549 additions and 30 deletions

View File

@@ -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);
}
}

View 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;
}
}