Files
Continentis/Assets/Scripts/MainGame/Card/CardSubmodules/AttributeSubmodule.cs
2025-11-01 06:13:58 -04:00

112 lines
4.4 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<CardLogicBase>
{
public AttributeGroup attributeGroup;
public AttributeSubmodule(CardLogicBase 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.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]);
}
}
/// <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);
}
}