mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 17:43:57 +00:00
Support Card Affix
This commit is contained in:
@@ -4,6 +4,7 @@ using MikuSB.Database;
|
||||
using MikuSB.Database.Inventory;
|
||||
using MikuSB.Enums.Item;
|
||||
using MikuSB.GameServer.Game.Player;
|
||||
using MikuSB.GameServer.Game.Support;
|
||||
using MikuSB.GameServer.Server.Packet.Send.Misc;
|
||||
|
||||
namespace MikuSB.GameServer.Game.Inventory;
|
||||
@@ -135,7 +136,17 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
||||
ItemType = genre,
|
||||
ItemCount = 1,
|
||||
Level = cardLevel,
|
||||
AffixId = 1,
|
||||
};
|
||||
|
||||
var initialCount = spCard.InitialAffixCount;
|
||||
for (int i = 0; i < initialCount && i < spCard.AffixPool.Count; i++)
|
||||
{
|
||||
var (affixId, tier) = SupportAffixService.GenerateRandomAffix(spCard.AffixPool[i]);
|
||||
info.Affixs.Add(affixId);
|
||||
info.Affixs.Add(tier);
|
||||
}
|
||||
|
||||
InventoryData.SupportCards[info.UniqueId] = info;
|
||||
|
||||
if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([info]));
|
||||
|
||||
40
GameServer/Game/Support/SupportAffixService.cs
Normal file
40
GameServer/Game/Support/SupportAffixService.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using MikuSB.Data;
|
||||
|
||||
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)
|
||||
{
|
||||
if (!GameData.SupportAffixPoolData.TryGetValue(poolId, out var pool))
|
||||
return (0, 0);
|
||||
|
||||
var groups = pool.Groups.ToList();
|
||||
if (groups.Count == 0)
|
||||
return (0, 0);
|
||||
|
||||
var totalWeight = groups.Sum(x => x.Weight);
|
||||
var roll = Random.Shared.Next(totalWeight);
|
||||
var cumulative = 0;
|
||||
var selectedAffixs = groups[0].Affixs;
|
||||
|
||||
foreach (var (affixIds, weight) in groups)
|
||||
{
|
||||
cumulative += weight;
|
||||
if (roll < cumulative)
|
||||
{
|
||||
selectedAffixs = affixIds;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (selectedAffixs.Count == 0)
|
||||
return (0, 0);
|
||||
|
||||
var affixId = selectedAffixs[Random.Shared.Next(selectedAffixs.Count)];
|
||||
var tierCount = GameData.SupportAffixData.GetValueOrDefault(affixId)?.TierCount ?? 5;
|
||||
var tier = (uint)(Random.Shared.Next(tierCount) + 1);
|
||||
return ((uint)affixId, tier);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using MikuSB.Data;
|
||||
using MikuSB.Database;
|
||||
using MikuSB.GameServer.Game.Support;
|
||||
using MikuSB.Proto;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
@@ -81,6 +82,23 @@ public class SupporterCard_Upgrade : ICallGSHandler
|
||||
{
|
||||
supportCard.Exp = 0;
|
||||
supportCard.Level = maxLevel;
|
||||
|
||||
// Unlock next affix slot when reaching max level for the first time
|
||||
if (supportCardExcel != null)
|
||||
{
|
||||
var currentSlots = supportCard.Affixs.Count / 2;
|
||||
var totalSlots = supportCardExcel.TotalAffixCount;
|
||||
if (currentSlots < totalSlots && currentSlots < supportCardExcel.AffixPool.Count)
|
||||
{
|
||||
var poolId = supportCardExcel.AffixPool[currentSlots];
|
||||
var (affixId, tier) = SupportAffixService.GenerateRandomAffix(poolId);
|
||||
if (affixId > 0)
|
||||
{
|
||||
supportCard.Affixs.Add(affixId);
|
||||
supportCard.Affixs.Add(tier);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
syncItems.Add(supportCard.ToProto());
|
||||
|
||||
Reference in New Issue
Block a user