249 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}