using System.Collections.Generic; using Cielonos.MainGame.Characters; using Sirenix.OdinInspector; using SLSUtilities.General; using SLSUtilities.FunctionalAnimation; using UnityEngine; namespace Cielonos.MainGame { [CreateAssetMenu(fileName = "Attack", menuName = "Cielonos/Items/AttackData")] public class AttackData : SerializedScriptableObject { public GameObject defaultHitVFX; [Title("Default Weapon Parameters")] [LabelText("攻击力")] public float startDamage; [LabelText("攻击力标准差")] public float damageDeviation; [LabelText("暴击率")] public float criticalChance; [LabelText("暴击倍率")] public float criticalMultiplier; [LabelText("基础削韧值")] public float startStanceDepletion; public AttackUnit DefaultAttackUnit => attackUnits.Count == 1 ? attackUnits.Values.GetEnumerator().Current : null; [DictionaryDrawerSettings(KeyLabel = "Attack Unit", DisplayMode = DictionaryDisplayOptions.ExpandedFoldout)] [Searchable] public Dictionary attackUnits = new Dictionary(); public AttackUnit this[string unitName] => attackUnits[unitName]; private void OnEnable() { UpdateUnits(); } private void OnValidate() { UpdateUnits(); } [OnInspectorGUI("UpdateUnits")] public void UpdateUnits() { foreach (KeyValuePair pair in attackUnits) { string unitName = pair.Key; AttackUnit unit = pair.Value; unit.parentData = this; unit.unitName = unitName; if (!unit.overrideParameters) { unit.startDamage = startDamage * unit.damageCorrectionMultiplier; unit.damageDeviation = damageDeviation; unit.criticalChance = criticalChance; unit.criticalMultiplier = criticalMultiplier; unit.stanceDepletion = startStanceDepletion * unit.stanceDepletionCorrectionMultiplier; } if (unit.submodules != null) { foreach (AttackUnit.Submodule module in unit.submodules) { module.SetOwner(unit); } } } } } }