using System.Collections.Generic; using System.Linq; using SLSFramework.General; using Unity.VisualScripting; using UnityEngine; namespace Continentis.MainGame.Card { public partial class AttributeSubmodule : SubmoduleBase { public AttributeGroup attributeGroup; public AttributeSubmodule(CardInstance card) : base(card) { Initialize(card.cardData); } private void Initialize(CardData cardData) { Dictionary originalAttributes = new Dictionary(cardData.originalAttributes); Dictionary endowingAttributes = new Dictionary(cardData.runtimeCurrentAttributes); if (cardData.upgradeNode is { isInfiniteUpgrade: true }) { foreach (KeyValuePair upgrade in cardData.upgradeNode.GetUpgradeAttributes(owner.upgradeLevel)) { originalAttributes.ModifyOrAdd(upgrade.Key, upgrade.Value); } } foreach (KeyValuePair 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 { /// /// 刷新单个属性 /// /// 属性名称 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]); } } /// /// 刷新所有属性 /// 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(CardAttributes.TargetCount, -2); } }