using System; using System.Collections.Generic; using UnityEngine; using Logic.Action; using Logic.Multilingual; using NodeCanvas.Tasks.Actions; using RuntimeData; using UnityEngine.UIElements; [Serializable] [CreateAssetMenu(fileName = "TechDataAssets", menuName = "TH1 Game Data/Action Data Asset")] public class ActionDataAssets : ScriptableObject { public List ActionList = new List(); private Dictionary _actionDict; [NonSerialized] private bool _dictInit = false; private void CheckDict() { if (_dictInit) return; _dictInit = true; _actionDict = new Dictionary(); foreach (var t in ActionList) _actionDict[t.ActionId] = t; } public bool GetActionInfo(CommonActionId actionId, out ActionInfo actionInfo) { actionInfo = null; CheckDict(); if (_actionDict.TryGetValue(actionId, out actionInfo)) return true; if (TryCreateFallbackHakureiLongshipUpgradeActionInfo(actionId, out actionInfo)) { _actionDict[actionId] = actionInfo; return true; } if (!TryCreateFallbackTrainUnitActionInfo(actionId, out actionInfo)) return false; _actionDict[actionId] = actionInfo; return true; } public bool GetActionDesc(CommonActionId actionId, bool locked ,out string ret) { ret = ""; if (GetActionInfo(actionId, out var actionInfo)) { ret = locked && actionInfo.NeedLockDesc ? actionInfo.LockDesc : actionInfo.Desc; return true; } return false; } private bool TryCreateFallbackTrainUnitActionInfo(CommonActionId actionId, out ActionInfo actionInfo) { actionInfo = null; if (actionId.ActionType != CommonActionType.TrainUnit) return false; if (Table.Instance?.UnitTypeDataAssets == null) return false; if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionId.UnitType, actionId.GiantType, actionId.UnitLevel, out var unitInfo)) return false; actionInfo = new ActionInfo { ActionId = actionId, ActionName = unitInfo.Name, Desc = unitInfo.Desc, NeedTechDesc = false, TechDesc = "", NeedLockDesc = false, LockDesc = "", Icon = unitInfo.Sprite, IconViewSizeType = IconViewSizeType.Unit, VarientIcon = unitInfo.IsSpriteVarient, IconList = unitInfo.SpriteList ?? new List(), Cost = unitInfo.Cost, CityExp = 0, NoNeedTech = false, SpriteSize = new Vector2(120, 120), SpritePos = new Vector2(0, 15), }; return true; } private bool TryCreateFallbackHakureiLongshipUpgradeActionInfo(CommonActionId actionId, out ActionInfo actionInfo) { actionInfo = null; if (actionId.ActionType != CommonActionType.UnitAction) return false; if (actionId.UnitType != UnitType.HakureiLongship) return false; if (actionId.UnitActionType != UnitActionType.None) return false; if (actionId.GiantType != GiantType.None || actionId.UnitLevel != 0) return false; if (Table.Instance?.UnitTypeDataAssets == null) return false; if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType.HakureiLongship, GiantType.None, 0, out var longshipInfo)) return false; actionInfo = new ActionInfo { ActionId = actionId, ActionName = longshipInfo.Name, Desc = longshipInfo.Desc, NeedTechDesc = false, TechDesc = "", NeedLockDesc = false, LockDesc = "", Icon = longshipInfo.Sprite, IconViewSizeType = IconViewSizeType.Unit, VarientIcon = longshipInfo.IsSpriteVarient, IconList = longshipInfo.SpriteList ?? new List(), Cost = 0, CityExp = 0, NoNeedTech = true, SpriteSize = new Vector2(120, 120), SpritePos = new Vector2(0, 35), }; return true; } } [Serializable] public class EmpireGridSpInfoPack { public bool IgnoreCivId; public bool IgnoreForceId; public bool IsGridSpType; public GridSpType GridSpType; public uint CivId; public uint ForceId; public bool OnlyCarryGiant; public GiantType CarryGiantType; public Sprite Sprite; [MultilingualField] public string Name; [MultilingualField] public string Desc; public bool HasLevel; public List LevelSprite; public bool CheckCivAndForce(CivEnum civ,ForceEnum force) { if (!IgnoreCivId && civ != Table.Instance.TransCivIdToCivEnum(CivId)) return false; if (!IgnoreForceId && force != Table.Instance.TransForceIdToForceEnum(ForceId)) return false; return true; } public bool CheckEmpire(Empire empire,GridSpType gridSpType) { if (!CheckCivAndForce(empire.Civ, empire.Force)) return false; return gridSpType == GridSpType; } } //public enum UIActionCircleBGType [Serializable] public class ActionInfo { public CommonActionId ActionId; [MultilingualField] public string ActionName; [MultilingualField] public string Desc; //科技树专用描述 public bool NeedTechDesc; [MultilingualField] public string TechDesc; //锁行动时专用描述 public bool NeedLockDesc; [MultilingualField] public string LockDesc; public Sprite Icon; public IconViewSizeType IconViewSizeType; public bool VarientIcon; public List IconList; public int Cost; public int CityExp; public bool NoNeedTech; public Vector2 SpriteSize; public Vector2 SpritePos; public Sprite GetIcon(CivEnum civEnum, ForceEnum forceEnum, GridSpType gridSpType) { return GetIcon(Table.Instance.TransCivEnumToCivId(civEnum),Table.Instance.TransForceEnumToForceId(forceEnum),gridSpType); } public Sprite GetIcon(uint civId,uint forceId, GridSpType gridSpType) { if (!VarientIcon) return Icon; if (gridSpType != GridSpType.None) { foreach (var t in IconList) { if (gridSpType == t.GridSpType) return t.Sprite; } } return GetBestEmpireIconInfo(civId, forceId)?.Sprite; } public string GetActionName(CivEnum civEnum, ForceEnum forceEnum, GridSpType gridSpType) { return GetActionName(Table.Instance.TransCivEnumToCivId(civEnum),Table.Instance.TransForceEnumToForceId(forceEnum),gridSpType); } public string GetActionName(uint civId,uint forceId, GridSpType gridSpType) { if (!VarientIcon) return ActionName; if (gridSpType != GridSpType.None) { foreach (var t in IconList) { if (gridSpType == t.GridSpType) return t.Name == "" ? ActionName : t.Name; } } var iconInfo = GetBestEmpireIconInfo(civId, forceId); if (iconInfo != null) return iconInfo.Name == "" ? ActionName : iconInfo.Name; return ActionName; } private EmpireGridSpInfoPack GetBestEmpireIconInfo(uint civId, uint forceId) { EmpireGridSpInfoPack best = null; var bestScore = -1; foreach (var t in IconList) { if (!t.IgnoreCivId && t.CivId != civId) continue; if (!t.IgnoreForceId && t.ForceId != forceId) continue; var score = (t.IgnoreCivId ? 0 : 1) + (t.IgnoreForceId ? 0 : 1); if (score > bestScore) { best = t; bestScore = score; } } return best; } }