350 lines
9.3 KiB
C#
350 lines
9.3 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using Logic.Action;
|
||
using UnityEngine;
|
||
using Logic.Multilingual;
|
||
using RuntimeData;
|
||
using UnityEngine.Serialization;
|
||
|
||
|
||
//Data Asset用到,绝对不能修改顺序!
|
||
public enum TechType
|
||
{
|
||
None,
|
||
Climbing,Meditation,Mining,Philosophy,Smithery,
|
||
Organization,Strategy,Farming,Diplomacy,Construction,
|
||
Riding,FreeSpirit,Chivalry,Roads,Trade,
|
||
Hunting,Forestry,Archery,Mathematics,Spiritualism,
|
||
Fishing,Ramming,Sailing,Aquatism,Navigation,
|
||
EgyptFlandre,EgyptRemilia,EgyptMeiling,EgyptPatchouli,EgyptSakuya,
|
||
//Kaguya新增
|
||
KaguyaHunting,KaguyaArcher,KaguyaSpiritual,KaguyaForestry,KaguyaMath,KaguyaRoad,KaguyaTrade,KaguyaConstruction,
|
||
//Remilia新增
|
||
NoUseRemiliaConstruction,RemiliaFarming,NoUseRemiliaAuatism,RemiliaRamming,NoUseRemiliaChivalry,RemiliaFreeSpirit,
|
||
//Kanako
|
||
KanakoClimbing,KanakoMeditation,KanakoMining,KanakoPhilosophy,KanakoSmithery,
|
||
KanakoRiding,KanakoFreeSpirit,KanakoChivalry,KanakoRoads,KanakoTrade,
|
||
KanakoNavigation
|
||
}
|
||
|
||
//Data Asset用到,绝对不能修改顺序!
|
||
public enum TechAtom
|
||
{
|
||
None = 0,
|
||
//None科技12个
|
||
UnitActionUpgrade = 1,
|
||
UnitActionRecover = 2,
|
||
UnitActionExamine = 3,
|
||
UnitActionCapture = 4,
|
||
TrainUnitWarrior = 5,
|
||
BuildWonderPEACE = 6,
|
||
BuildWonderKNOWLEDGE = 7,
|
||
BuildWonderTRADE = 8,
|
||
BuildWonderWEALTH = 9,
|
||
BuildWonderPOWER = 10,
|
||
BuildWonderPARK = 11,
|
||
BuildWonderEYE = 12 ,
|
||
//Climbing
|
||
UnitSkillMOUNTAINMOVE = 13,
|
||
UnitSkillMOUNTAINDEFENSE = 14,
|
||
//Climbing
|
||
BuildAcademy =15,
|
||
StartWonderPEACE =16,
|
||
|
||
BuildMine = 17,
|
||
|
||
StartWonderKNOWLEDGE = 18,
|
||
TechIndustry,
|
||
TrainUnitMinder,
|
||
|
||
TrainUnitSwordsman,
|
||
BuildForge,
|
||
|
||
GainFruit,
|
||
|
||
TrainUnitDefender,
|
||
TechAlly,
|
||
|
||
BuildFarm,
|
||
|
||
TechEmbassy,
|
||
TechDiplomacySight,
|
||
TrainUnitCloak,
|
||
|
||
BuildWindmill,
|
||
BurnForest,
|
||
|
||
TrainUnitRider,
|
||
BuildMilitary,
|
||
Disband,
|
||
|
||
BuildRoad,
|
||
BuildBridge,
|
||
StartWonderTRADE,
|
||
|
||
TrainUnitKnights,
|
||
Destroy,
|
||
|
||
BuildMarket,
|
||
StartWonderWEALTH,
|
||
|
||
GainAnimal,
|
||
BuildLumberHut,
|
||
ClearForest,
|
||
|
||
TrainUnitArcher,
|
||
UnitSkillFORESTDEFENSE,
|
||
|
||
BuildSawmill,
|
||
TrainUnitCatapult,
|
||
|
||
BuildPreserve,
|
||
GrowForest,
|
||
|
||
GainFish,
|
||
BuildPort,
|
||
UnitSkillWATERMOVE,
|
||
|
||
BuildNavalBase,
|
||
TrainUnitRammerShip,
|
||
|
||
TrainUnitShip,
|
||
UnitSkillOCEANMOVE,
|
||
|
||
UnitSkillWATERDEFENSE,
|
||
UnitSkillOCEANDEFENSE,
|
||
|
||
TrainUnitBomberShip,
|
||
UnitActionGather,
|
||
|
||
KaguyaFrenchNapoleanic_DECAY,//这个废弃了
|
||
TrainUnitKaguyaFrenchAnimalWarrior,
|
||
UnitSkillKaguyaFrenchWarriorSynergy,
|
||
KaguyaFrenchNapoleonicCode,
|
||
GrowForestOutside,
|
||
BuildKaguyaFrenchYard,
|
||
UnitSkillKaguyaFrenchCatapultSynergy,
|
||
KaguyaFrenchBambooMove,
|
||
|
||
//RemiliaForces
|
||
BuildEgyptianIrrigation,
|
||
BuildRemiliaMilitary,
|
||
UnitSkillRemiliaForcesKill,
|
||
BuildEgyptianWaterIrrigation,
|
||
RedMistDefense,
|
||
|
||
//KanakoForces 新增
|
||
CreateMountain,
|
||
AcademyCreateMountain,
|
||
CreateMountainPro,
|
||
GainMetal,
|
||
BuildMetalStation,
|
||
TrainUnitMoriyaRider,
|
||
BuildMoriyaMilitary,
|
||
TrainUnitMoriyaKnight,
|
||
MoriyaRoad,
|
||
CreateMountainWater,
|
||
|
||
//奇观补漏
|
||
StartWonderPOWER,
|
||
StartWonderPARK,
|
||
StartWonderEYE,
|
||
|
||
//阵营巨人补漏
|
||
TrainUnitKoakuma,
|
||
TrainUnitFrenchWolf,
|
||
TrainUnitHebi,
|
||
|
||
}
|
||
|
||
|
||
[Serializable]
|
||
[CreateAssetMenu(fileName = "TechDataAssets", menuName = "TH1 Game Data/Tech Data Asset")]
|
||
public class TechDataAssets : ScriptableObject
|
||
{
|
||
public List<TechInfo> TechList = new List<TechInfo>();
|
||
public List<TechAtomInfo> TechAtomList = new List<TechAtomInfo>();
|
||
|
||
[NonSerialized]
|
||
private bool _initialized;
|
||
private Dictionary<TechType, TechInfo> _techInfoDict = new Dictionary<TechType, TechInfo>();
|
||
|
||
[NonSerialized] private bool _atomInit;
|
||
private Dictionary<TechAtom, TechAtomInfo> _techAtomInfoDict = new Dictionary<TechAtom, TechAtomInfo>();
|
||
|
||
private void Init()
|
||
{
|
||
if (_initialized)
|
||
return;
|
||
foreach (var tech in TechList)
|
||
_techInfoDict.Add(tech.TechType,tech);
|
||
|
||
_initialized = true;
|
||
}
|
||
//-------------------------------------- TechInfo相关 --------------------------------
|
||
public TechInfo GetTechInfo(TechType techType)
|
||
{
|
||
Init();
|
||
return _techInfoDict.GetValueOrDefault(techType);
|
||
}
|
||
|
||
public bool GetTechInfo(TechType techType,out TechInfo info)
|
||
{
|
||
Init();
|
||
return _techInfoDict.TryGetValue(techType, out info);
|
||
}
|
||
|
||
public bool GetTechDesc(TechType techType, out string ret)
|
||
{
|
||
Init();
|
||
ret = "";
|
||
if (_techInfoDict.TryGetValue(techType, out var info))
|
||
{
|
||
ret = info.Description;
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// 获取科技的所有后继科技 (非伟人科技)
|
||
public HashSet<TechType> GetNextTechs(TechType techType)
|
||
{
|
||
var nextTechs = new HashSet<TechType>(){techType};
|
||
while (GetNextTechs(techType, nextTechs)) { }
|
||
|
||
nextTechs.Remove(techType);
|
||
return nextTechs;
|
||
}
|
||
|
||
// 获取科技的后继科技
|
||
public bool GetNextTechs(TechType techType, HashSet<TechType> set)
|
||
{
|
||
bool isFound = false;
|
||
//遍历所有科技
|
||
foreach (var techInfo in TechList)
|
||
{
|
||
//如果已经在set 跳过
|
||
if (set.Contains(techInfo.TechType)) continue;
|
||
//如果他的父亲不在set里,跳过
|
||
if (!techInfo.FatherInSet(set)) continue;
|
||
//剩下的一定是父亲在set里,或者父亲就是后继树根节点(techType)的节点,加入set
|
||
set.Add(techInfo.TechType);
|
||
isFound = true;
|
||
}
|
||
|
||
return isFound;
|
||
}
|
||
|
||
//-------------------------------------- TechAtomInfo相关 --------------------------------
|
||
private void AtomInit()
|
||
{
|
||
if (_atomInit)
|
||
return;
|
||
foreach (var techAtomInfo in TechAtomList)
|
||
_techAtomInfoDict.Add(techAtomInfo.TechAtom,techAtomInfo);
|
||
_atomInit = true;
|
||
}
|
||
|
||
public bool GetTechAtomInfo(TechAtom techAtom, out TechAtomInfo info )
|
||
{
|
||
AtomInit();
|
||
return _techAtomInfoDict.TryGetValue(techAtom,out info);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//判断当前的TechAtomIcon在处理View时的类型(根据类型会分开处理尺寸之类的)
|
||
public enum IconViewSizeType { Building,Unit,_256x256,Defense,Resource,Ground,MountainBuilding }
|
||
[Serializable]
|
||
public class TechAtomInfo
|
||
{
|
||
public TechAtom TechAtom;
|
||
[MultilingualField]
|
||
public string TechAtomName;
|
||
[MultilingualField]
|
||
public string Desc;
|
||
|
||
//是否是生产unit的时候AddSkill的技能
|
||
public bool IsAddSkill;
|
||
public List<UnitFullType> AddSkillCondition;
|
||
public SkillType AddSkillType;
|
||
public bool EnableAction;
|
||
public List<CommonActionId> TechActions;
|
||
public bool UseActionSprite;
|
||
public SpriteContainer IconContainer;
|
||
[FormerlySerializedAs("TechAtomIconViewType")] public IconViewSizeType iconViewSizeType;
|
||
|
||
public Sprite GetIcon(CivEnum civEnum,ForceEnum forceEnum,GridSpType gridSpType = GridSpType.None,int level = 0)
|
||
{
|
||
//如果使用Action的Icon
|
||
if (EnableAction && UseActionSprite && TechActions.Count > 0)
|
||
{
|
||
if (!Table.Instance.ActionDataAssets.GetActionInfo(TechActions[0], out var info)) return null;
|
||
return info.GetIcon(Table.Instance.TransCivEnumToCivId(civEnum),Table.Instance.TransForceEnumToForceId(forceEnum),gridSpType);
|
||
}
|
||
|
||
//如果使用自身的Icon
|
||
return IconContainer.GetIcon(civEnum, forceEnum, gridSpType, level);
|
||
}
|
||
|
||
public bool CheckCondition(UnitFullType unitFullType)
|
||
{
|
||
if(AddSkillCondition.Count == 0) return true;
|
||
foreach (var t in AddSkillCondition)
|
||
if (unitFullType.Equals(t)) return true;
|
||
return false;
|
||
}
|
||
}
|
||
|
||
[Serializable]
|
||
public class TechInfo
|
||
{
|
||
public TechType TechType; // 唯一ID
|
||
[MultilingualField]
|
||
public string TechName; // 显示名称
|
||
[MultilingualField]
|
||
public string Description; // 描述
|
||
public Sprite icon; // 图标
|
||
public int CostLevel; // 消耗等级(1,2,3)
|
||
public List<TechType> FatherTechList;
|
||
//public List<CommonActionId> techActions; // 解锁action
|
||
public List<TechAtom> TechAtomList; // 解锁actionAtom
|
||
public TechTreeCircleViewType TechTreeCircleViewType;
|
||
|
||
public bool FatherInSet(HashSet<TechType> set)
|
||
{
|
||
foreach (var tech in FatherTechList)
|
||
if (set.Contains(tech))
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
public bool IsFather(TechType techType)
|
||
{
|
||
foreach(var tech in FatherTechList)
|
||
if (tech == techType)
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
public List<CommonActionId> GetActionList()
|
||
{
|
||
var actionList = new List<CommonActionId>();
|
||
foreach (var t in this.TechAtomList)
|
||
{
|
||
if (!Table.Instance.TechDataAssets.GetTechAtomInfo(t, out var info)) continue;
|
||
if (info.EnableAction)
|
||
foreach(var p in info.TechActions)
|
||
actionList.Add(p);
|
||
|
||
}
|
||
return actionList;
|
||
}
|
||
|
||
public int GetTechAtomCount()
|
||
{
|
||
return TechAtomList.Count;
|
||
}
|
||
} |