246 lines
7.8 KiB
C#

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<ActionInfo> ActionList = new List<ActionInfo>();
private Dictionary<CommonActionId, ActionInfo> _actionDict;
[NonSerialized]
private bool _dictInit = false;
private void CheckDict()
{
if (_dictInit) return;
_dictInit = true;
_actionDict = new Dictionary<CommonActionId, ActionInfo>();
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<EmpireGridSpInfoPack>(),
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<EmpireGridSpInfoPack>(),
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<Sprite> 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<EmpireGridSpInfoPack> 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;
}
}