249 lines
6.0 KiB
C#
249 lines
6.0 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using Logic.Action;
|
||
using UnityEngine;
|
||
using Logic.Multilingual;
|
||
using RuntimeData;
|
||
|
||
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,
|
||
KaguyaHunting,KaguyaArcher,KaguyaSpiritual,KaguyaForestry,KaguyaMath,KaguyaRoad,KaguyaTrade,KaguyaConstruction
|
||
}
|
||
|
||
public enum TechAtom
|
||
{
|
||
None,
|
||
//None科技12个
|
||
CommonUnitUpgrade,
|
||
CommonUnitRecover,
|
||
CommonUnitExamine,
|
||
CommonUnitCapture,
|
||
CommonTrainWarrior,
|
||
BuildWonderPEACE,
|
||
BuildWonderKNOWLEDGE,
|
||
BuildWonderTRADE,
|
||
BuildWonderWEALTH,
|
||
BuildWonderPOWER,
|
||
BuildWonderPARK,
|
||
BuildWonderEYE,
|
||
//Climbing
|
||
UnitSkillMOUNTAINMOVE,
|
||
UnitSkillMOUNTAINDEFENSE,
|
||
//Climbing
|
||
BuildAcademy,
|
||
StartWonderPEACE,
|
||
|
||
BuildMine,
|
||
|
||
StartWonderKNOWLEDGE,
|
||
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,
|
||
TrainUnitKaguyaFrenchAnimalWarrior,
|
||
UnitSkillKaguyaFrenchWarriorSynergy,
|
||
KaguyaFrenchNapoleonicCode,
|
||
GrowForestOutside,
|
||
BuildKaguyaFrenchYard,
|
||
UnitSkillKaguyaFrenchCatapultSynergy,
|
||
KaguyaFrenchBambooMove
|
||
|
||
|
||
}
|
||
|
||
|
||
[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[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>();
|
||
while (GetNextTechs(techType, nextTechs)) { }
|
||
return nextTechs;
|
||
}
|
||
|
||
// 获取科技的后继科技 (非伟人科技)
|
||
public bool GetNextTechs(TechType techType, HashSet<TechType> set)
|
||
{
|
||
bool isFound = false;
|
||
foreach (var techInfo in TechList)
|
||
{
|
||
if (techInfo.GiantTech) continue;
|
||
if (set.Contains(techInfo.TechType)) continue;
|
||
if (techType != techInfo.FatherTechType && !set.Contains(techInfo.FatherTechType)) continue;
|
||
set.Add(techInfo.TechType);
|
||
isFound = true;
|
||
}
|
||
|
||
return isFound;
|
||
}
|
||
|
||
//获取科技的父亲科技
|
||
public TechType GetFatherTech(TechType techType)
|
||
{
|
||
if (!_techInfoDict.TryGetValue(techType, out var info))
|
||
return TechType.None;
|
||
return info.FatherTechType;
|
||
|
||
}
|
||
|
||
//-------------------------------------- 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);
|
||
}
|
||
|
||
}
|
||
|
||
[Serializable]
|
||
public class TechAtomInfo
|
||
{
|
||
public TechAtom TechAtom;
|
||
//是否是生产unit的时候AddSkill的技能
|
||
public bool IsAddSkill;
|
||
public List<UnitFullType> AddSkillCondition;
|
||
public SkillType AddSkillType;
|
||
}
|
||
|
||
[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 bool GiantTech; //是否是巨人科技
|
||
public List<TechType> GiantTechSet; //巨人科技需要的科技池子
|
||
public TechType FatherTechType; // 前置科技(用techId关联)
|
||
|
||
public List<CommonActionId> techActions; // 解锁action
|
||
public List<TechAtom> TechAtomList; // 解锁action
|
||
|
||
} |