using System.Collections.Generic; using Continentis.MainGame.Card; using Continentis.MainGame.UI; using SLSFramework.General; using Sirenix.OdinInspector; using SLSFramework.UModAssistance; using SLSUtilities.General; using UnityEngine; using UnityEngine.Serialization; namespace Continentis.MainGame.Character { // ───────────────────────────────────────────────────────────────────────── // CharacterData — ScriptableObject 数据定义 // ───────────────────────────────────────────────────────────────────────── [CreateAssetMenu(menuName = "Continentis/MainGame/Character/CharacterData", fileName = "CharacterData")] public partial class CharacterData : ScriptableObject { // ── Fundamental ─────────────────────────────────────────────────────── [BoxGroup("Fundamental"), PropertyOrder(0)] [LabelText("使用自定义逻辑类")] [Tooltip("勾选后可通过下拉菜单选择一个 CharacterLogicBase 子类,并自动填充 modName / className。")] public bool haveCustomClass; // haveCustomClass = true 时:逻辑类选择器(替代旧 DrawSearchableTypeSelector) [BoxGroup("Fundamental"), PropertyOrder(1)] [ShowIf("haveCustomClass")] [InfoBox("请通过下拉菜单选择角色逻辑类,Mod 名 / 类名将自动填充。", InfoMessageType.None)] [ValueDropdown("@CharacterData.GetCharacterLogicDropdownItems()", AppendNextDrawer = true, DisableGUIInAppendedDrawer = true)] [LabelText("逻辑类全名"), OnValueChanged("OnCharacterLogicClassSelected")] public string classFullName; // haveCustomClass = false 时:手动填写 modName / className [BoxGroup("Fundamental"), PropertyOrder(2)] [HideIf("haveCustomClass")] [LabelText("Mod 名称")] public string modName; [BoxGroup("Fundamental"), PropertyOrder(3)] [HideIf("haveCustomClass")] [LabelText("类名称")] public string className; [BoxGroup("Fundamental"), PropertyOrder(4)] [LabelText("显示名称 Key")] public string displayName; [BoxGroup("Fundamental"), PropertyOrder(5)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = true)] [LabelText("标签")] public List tags; // ── 立绘与描述 ──────────────────────────────────────────────────────── [BoxGroup("Visuals"), PropertyOrder(6)] [PreviewField(80, ObjectFieldAlignment.Left), LabelText("头像 (Avatar)")] public Sprite avatar; [BoxGroup("Visuals"), PropertyOrder(7)] [PreviewField(120, ObjectFieldAlignment.Left), LabelText("立绘 (Portrait)")] public Sprite portrait; [BoxGroup("Visuals"), PropertyOrder(8)] [LabelText("角色描述 Key")] public string characterDescription; [BoxGroup("Visuals"), PropertyOrder(9)] [LabelText("角色故事 Key")] public string characterStory; // ── Attributes ──────────────────────────────────────────────────────── [TabGroup("Data", "属性"), PropertyOrder(20)] [Tooltip("角色的核心属性:支持智能下拉菜单")] public SerializedDictionary coreAttributes = new SerializedDictionary(); [TabGroup("Data", "属性"), PropertyOrder(21)] [Tooltip("角色的通常属性:支持智能下拉菜单")] public SerializedDictionary generalAttributes = new SerializedDictionary(); [TabGroup("Data", "属性"), PropertyOrder(22)] [DictionaryDrawerSettings(KeyLabel = "运行时状态槽 (如 Health)", ValueLabel = "绑定的最大值标记 (如 MaximumHealth)")] [Tooltip("初始化时赋予给 CurrentGeneralAttributes 的属性;Value 填写对应 GeneralAttributes 的 Key 名,或直接填浮点数,留空默认为 0。")] public SerializedDictionary runtimeGeneralAttributes = new SerializedDictionary(); // ── View ────────────────────────────────────────────────────────────── [TabGroup("Data", "视图"), PropertyOrder(30)] [LabelText("战斗位置顺序")] [MinValue(0)] public int combatPositionOrder; [TabGroup("Data", "视图"), PropertyOrder(31)] [LabelText("战斗角色视图 Prefab")] public GameObject combatCharacterView; [TabGroup("Data", "视图"), PropertyOrder(32)] [DictionaryDrawerSettings(KeyLabel = "动画名称", ValueLabel = "AnimationClip")] [LabelText("动画映射")] public SerializableDictionary animations; // ── References ──────────────────────────────────────────────────────── [TabGroup("Data", "引用"), PropertyOrder(40)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = false)] [ValueDropdown("GetAvailablePrefabs", AppendNextDrawer = true)] [LabelText("Prefab 引用")] public List prefabRefs = new List(); [TabGroup("Data", "引用"), PropertyOrder(41)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = false)] [ValueDropdown("GetAvailableCardData", AppendNextDrawer = true)] [LabelText("衍生卡牌数据引用")] public List derivativeCardDataRefs = new List(); [TabGroup("Data", "引用"), PropertyOrder(42)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = false)] [ValueDropdown("GetAvailableCharacterData", AppendNextDrawer = true)] [LabelText("衍生角色数据引用")] public List derivativeCharacterDataRefs = new List(); [TabGroup("Data", "引用"), PropertyOrder(43)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = false)] [ValueDropdown("GetAvailableCardData", AppendNextDrawer = true)] [Tooltip("初始卡组引用列表")] [LabelText("初始卡组引用")] public List initialDeckRef; [TabGroup("Data", "引用"), PropertyOrder(44)] [ListDrawerSettings(ShowIndexLabels = false, DraggableItems = false)] [ValueDropdown("GetAvailableHUDData", AppendNextDrawer = true)] [Tooltip("HUD 信息引用列表")] [LabelText("HUD 数据引用")] public List hudDataRefs; } // ───────────────────────────────────────────────────────────────────────── // Runtime: 数据库查询 // ───────────────────────────────────────────────────────────────────────── public partial class CharacterData { /// /// 通过 DataID 从 ModManager 数据库查找 CharacterData。 /// public static CharacterData Get(string dataID) { return ModManager.GetData(dataID); } } }