using System; using System.Collections.Generic; using Logic.Action; using UnityEngine; using RuntimeData; using Logic.Multilingual; public enum CivEnum { Common, Egyptian, French, Germany, Indian, Norway, Britain, Persian, Byzantine, Max } public enum ForceEnum { Common, Remilia, Kaguya, Kanako, Satori, Reimu, Byakuren, Miko, Zanmu, Max } public enum LandformType { Terrain, Mountain, Tree, Road, Resource, Max } [Serializable] [CreateAssetMenu(fileName = "PlayerDataAssets", menuName = "TH1 Game Data/Player Data Asset")] public class PlayerDataAssets : ScriptableObject { public List PlayerDataList = new List(); public List CivLandformList = new List(); public Color CommonColor; public Sprite CommonPlayerAvatar; private Dictionary _unitTypeDict = new Dictionary(); private Dictionary _giantTypeDict = new Dictionary(); [NonSerialized] private bool _initialized = false; public bool GetPlayerInfo(PlayerData player,out PlayerInfo info) { info = null; if (player == null) return false; foreach (var t in PlayerDataList) { if (t.CivId == player.PlayerCivId && t.ForceId == player.PlayerForceId) { info = t; return true; } } return false; } public bool GetPlayerInfoByCivId(uint cid,uint forceid,out PlayerInfo info) { info = null; foreach (var t in PlayerDataList) { if (t.CivId == cid && t.ForceId == forceid) { info = t; return true; } } return false; } public bool GetPlayerInfo(CivEnum civ,ForceEnum force,out PlayerInfo info) { uint cid = Table.Instance.TransCivEnumToCivId(civ); uint forceid = Table.Instance.TransForceEnumToForceId(force); return GetPlayerInfoByCivId(cid,forceid,out info); } //判断一个action是否在一个玩家的techPool里面 public bool CheckActionInTechPool(CommonActionId actionId,PlayerData player) { if (!GetPlayerInfo(player, out var info)) return false; foreach (var t in info.TechPool) { if(!Table.Instance.TechDataAssets.GetTechInfo(t,out var techInfo))continue; foreach(var a in techInfo.techActions) if (a == actionId) return true; } return false; } // --------------------------------------------- 处理初始资源参数的模块 ------------------------------------- public bool GetCivLandformPack(CivEnum civ, out LandformPack info) { foreach(var t in CivLandformList) if (t.civ == civ) { info = t; return true; } info = null; return false; } //terrain重载 public float GetLandformRate(TerrainType terrain, CivEnum civ) { var ret = 1f; //if (tree != Vegetation.Trees) return 0; return ret; } //tree重载(树占平地的比例) public float GetLandformRate(Vegetation tree, CivEnum civ = CivEnum.Common) { if (tree != Vegetation.Trees) return 0f; if (!GetCivLandformPack(civ,out var civInfo)) return 0f; if (!GetCivLandformPack(CivEnum.Common,out var commonInfo)) return 0f; if (!commonInfo.GetLandformRate(tree, InnerOuterCity.All,out var commonRate)) return 0f; if (!civInfo.GetLandformRate(tree, InnerOuterCity.All,out var civRate)) return commonRate; return commonRate * civRate; } //mountain重载 (山占所有陆地的比例) public float GetLandformRate(TerrainFeature mountain, CivEnum civ = CivEnum.Common) { if (mountain != TerrainFeature.Mountain) return 0f; if (!GetCivLandformPack(civ,out var civInfo)) return 0f; if (!GetCivLandformPack(CivEnum.Common,out var commonInfo)) return 0f; if (!commonInfo.GetLandformRate(mountain, InnerOuterCity.All,out var commonRate)) return 0f; if (!civInfo.GetLandformRate(mountain, InnerOuterCity.All,out var civRate)) return commonRate; return commonRate * civRate; } //animal/fruit/crop/metal重载(animal占森林的比例) public float GetLandformRate(ResourceType resource, CivEnum civ = CivEnum.Common,InnerOuterCity innerOuterCity = InnerOuterCity.All) { if (!(resource is ResourceType.Animal or ResourceType.Metal or ResourceType.Crop or ResourceType.Farm or ResourceType.Fruit or ResourceType.Treasure or ResourceType.Starfish or ResourceType.Fish)) return 0f; if (!GetCivLandformPack(civ,out var civInfo)) return 0f; if (!GetCivLandformPack(CivEnum.Common,out var commonInfo)) return 0f; if (!commonInfo.GetLandformRate(resource, innerOuterCity,out var commonRate)) return 0f; //注意civInfo要传入 InnerOuterCity.All 因为不分内外城 if (!civInfo.GetLandformRate(resource, InnerOuterCity.All,out var civRate)) return commonRate; return commonRate * civRate; } } [Serializable] public class PlayerInfo { public uint ForceId; public uint CivId; [MultilingualField] public string CivName; [MultilingualField] public string ForceName; [MultilingualField] public string LeaderName; public Sprite LeaderIllustration; public Sprite LeaderAvatar; public Sprite PopulationSprite; public List TechPool = new List(); public List TechStart = new List(); public Color Color; public Sprite FlagIcon; [MultilingualField] public List StartChatBubble; [MultilingualField] public List MeetChatBubble; [MultilingualField] public List LoseChatBubble; public string MusicName; PlayerInfo() { foreach (TechType t in System.Enum.GetValues(typeof(TechType))) TechPool.Add(t); TechStart.Add(TechType.None); } public string GetRandomMeetChat() { if (MeetChatBubble.Count > 0) return MeetChatBubble[UnityEngine.Random.Range(0, MeetChatBubble.Count)]; else return "0"; } public string GetRandomStartChat() { if (StartChatBubble.Count > 0) return StartChatBubble[UnityEngine.Random.Range(0, StartChatBubble.Count)]; else return "0"; } public string GetRandomLoseChat() { if (LoseChatBubble.Count > 0) return LoseChatBubble[UnityEngine.Random.Range(0, LoseChatBubble.Count)]; else return "0"; } } [Serializable] public class LandformPack { public CivEnum civ; public List LandformParamList; //tree重载(树占平地的比例) public bool GetLandformRate(Vegetation tree,InnerOuterCity innerOuterCity ,out float rate) { foreach(var t in LandformParamList) if (t.LandformType == LandformType.Tree && innerOuterCity == t.InnerOuterCity) { rate = t.Rate; return true; } rate = 0f; return false; } //mountain重载 (山占所有陆地的比例) public bool GetLandformRate(TerrainFeature mountain, InnerOuterCity innerOuterCity,out float rate) { foreach(var t in LandformParamList) if (t.LandformType == LandformType.Mountain && innerOuterCity == t.InnerOuterCity) { rate = t.Rate; return true; } rate = 0f; return false; } //animal/fruit/crop/metal重载(animal占森林的比例) public bool GetLandformRate(ResourceType resource, InnerOuterCity innerOuterCity,out float rate) { foreach(var t in LandformParamList) if (t.LandformType == LandformType.Resource && t.ResourceType == resource && innerOuterCity == t.InnerOuterCity) { rate = t.Rate; return true; } rate = 0f; return false; } } public enum InnerOuterCity { All,//无视内外圈 InnerCity,//1圈领土 OuterCity,//2圈领土 Edge,//3圈及以外领土 Max } //单个的地貌数据参数,例如“少山的”“多山的”“多海的”之类的 [Serializable] public class LandformParamItem { public LandformType LandformType; public string ParamPackDesc;//这个parampack的描述信息 public TerrainType TerrainType; public ResourceType ResourceType; public float Rate; public InnerOuterCity InnerOuterCity; }