using System.Collections.Generic;
using UnityEngine;
using Animancer;
using BaseGames.Combat;
using BaseGames.Skills; // FeedbackPresetSO
using BaseGames.Localization;
namespace BaseGames.Spells
{
///
/// 法术消耗的资源类型。
///
public enum SpellResourceType { SoulPower, SpiritPower }
///
/// 法术效果分类(决定施放时的逻辑分支)。
///
public enum SpellEffectType
{
Projectile, // 投射物法术
AreaOfEffect, // 范围爆炸
SelfBuff, // 自身增益(护盾/加速/再生)
SummonShade, // 召唤投影
TeleportBlink, // 瞬移
}
///
/// 法术数据 SO(架构 BaseGames.Spells)。
/// 创建路径:Assets/Data/Spells/SPL_{spellId}.asset
///
[CreateAssetMenu(menuName = "BaseGames/Spells/Spell")]
public class SpellSO : ScriptableObject, ILocalizableAsset
{
[Header("Identity")]
[Tooltip("全局唯一 ID,建议使用 GameIds 域中的常量")]
public string spellId;
[Tooltip("本地化 Key(从 LocalizationManager.Get(displayNameKey, \"Spells\") 获取)")]
public string displayNameKey;
[Tooltip("本地化 Key,格式如 \"SPL_Fireball_Desc\"。通过 LocalizationManager.Get(descriptionKey, LocalizationTable.Spells) 获取。")]
[TextArea(1, 3)]
public string descriptionKey;
public Sprite icon;
[Header("Resource")]
public SpellResourceType resourceType;
[Min(1)]
public int baseCost;
[Min(0f)]
public float cooldown;
[Header("Effect")]
public SpellEffectType effectType;
public DamageSourceSO damageSource;
[Header("Projectile")]
public ProjectileConfigSO projectileConfig;
[Tooltip("是否追踪最近敌人")]
public bool isHoming;
[Header("AoE")]
[Min(0f)] public float explosionRadius;
[Min(0f)] public float explosionDelay;
[Header("Buff")]
[Min(0f)] public float buffDuration;
[Min(0f)] public float buffValue; // 含义由 effectType 决定(如护盾量、速度倍率)
[Header("Animation")]
public ClipTransition castAnimation;
[Min(0f)]
public float castLockDuration; // 施放锁定时长(秒)
[Header("HitBox Prefab")]
[Tooltip("近战/爆炸类法术的命中盒 Prefab(投射物法术留空)")]
public GameObject spellHitBoxPrefab;
[Header("Feedback")]
public FeedbackPresetSO castFeedback;
public IEnumerable GetLocalizationKeys()
{
if (!string.IsNullOrEmpty(displayNameKey))
yield return new LocalizationKeyRef(displayNameKey, "Spells", nameof(displayNameKey));
if (!string.IsNullOrEmpty(descriptionKey))
yield return new LocalizationKeyRef(descriptionKey, "Spells", nameof(descriptionKey));
}
}
}