Files
Continentis/Assets/Scripts/MainGame/Card/CardSubmodules/AttributeSubmodule.cs
SoulliesOfficial 5fe665d0ce Card爆改!
2025-11-15 12:17:34 -05:00

116 lines
4.8 KiB
C#

using System.Collections.Generic;
using System.Linq;
using SLSFramework.General;
using Unity.VisualScripting;
using UnityEngine;
namespace Continentis.MainGame.Card
{
public partial class AttributeSubmodule : SubmoduleBase<CardInstance>
{
public AttributeGroup attributeGroup;
public AttributeSubmodule(CardInstance card) : base(card)
{
Initialize(card.cardData);
}
private void Initialize(CardData cardData)
{
Dictionary<string, float> originalAttributes = new Dictionary<string, float>(cardData.originalAttributes);
Dictionary<string, string> endowingAttributes = new Dictionary<string, string>(cardData.runtimeCurrentAttributes);
if (cardData.upgradeNode is { isInfiniteUpgrade: true })
{
foreach (KeyValuePair<string, float> upgrade in cardData.upgradeNode.GetUpgradeAttributes(owner.upgradeLevel))
{
originalAttributes.ModifyOrAdd(upgrade.Key, upgrade.Value);
}
}
foreach (KeyValuePair<string, float> attribute in cardData.variableAttributes)
{
string baseName = "Base" + attribute.Key;
originalAttributes.Add(baseName, attribute.Value);
string mainName = attribute.Key;
endowingAttributes.Add(mainName, baseName);
string baseOffset = "Base" + attribute.Key + "Offset";
endowingAttributes.Add(baseOffset, "0");
string displayName = "Display" + attribute.Key;
endowingAttributes.Add(displayName, baseName);
}
attributeGroup = new AttributeGroup(originalAttributes, endowingAttributes);
attributeGroup.ApplyAllAttributes();
}
}
public partial class AttributeSubmodule
{
/// <summary>
/// 刷新单个属性
/// </summary>
/// <param name="attributeName">属性名称</param>
public void RefreshAttribute(string attributeName)
{
attributeGroup.ResetAttribute(attributeName);
owner.ApplyAttributeChangesByCard();
owner.user.combatBuffSubmodule.GetGeneralAttributeChange(attributeName, out float cha_numeric, out float cha_pAccumulation, out float cha_pMultiplication);
owner.combatBuffSubmodule.GetAttributeChange(attributeName, out float card_numeric, out float card_pAccumulation, out float card_pMultiplication);
float final_numeric = cha_numeric + card_numeric;
float final_pAccumulation = cha_pAccumulation + card_pAccumulation;
float final_pMultiplication = cha_pMultiplication * card_pMultiplication;
attributeGroup.ModifyAttribute(attributeName, final_numeric, final_pAccumulation, final_pMultiplication);
string displayAttributeName = "Display" + attributeName;
if(attributeGroup.current.ContainsKey(displayAttributeName))
{
attributeGroup.SetAttribute(displayAttributeName, attributeGroup.current[attributeName]);
}
}
/// <summary>
/// 刷新所有属性
/// </summary>
public void RefreshAllAttributes()
{
foreach (string attributeName in attributeGroup.original.Keys.ToList())
{
attributeGroup.ResetAttribute(attributeName);
}
owner.ApplyAttributeChangesByCard();
foreach (string attributeName in attributeGroup.current.Keys.ToList())
{
owner.combatBuffSubmodule.GetAttributeChange(attributeName, out float numeric, out float pAccumulation, out float pMultiplication);
attributeGroup.ModifyAttribute(attributeName, numeric, pAccumulation, pMultiplication);
string displayAttributeName = "Display" + attributeName;
if(attributeGroup.current.ContainsKey(displayAttributeName))
{
attributeGroup.SetAttribute(displayAttributeName, attributeGroup.current[attributeName]);
}
}
}
}
public partial class AttributeSubmodule
{
public float GetCurrentAttribute(string attributeName, float defaultValue = 0)
{
return attributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
}
public int GetRoundCurrentAttribute(string attributeName, int defaultValue = 0)
{
return attributeGroup.current.GetRoundValue(attributeName, defaultValue);
}
}
public partial class AttributeSubmodule
{
public int targetCount => GetRoundCurrentAttribute("TargetCount", -2);
}
}