246 lines
7.8 KiB
C#
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;
|
|
}
|
|
|
|
}
|