using System; using System.Collections; using System.Collections.Generic; using GCGame.Table; using GCGame; public class MeridiaSoulData : Singleton { public bool MerialSoulHasUp = false; // 经脉 public bool KungfuHasUp = false; // 武魂 public bool HeartHasUp = false; // 心法 public enum MeridiaSoulType { MerialSoul, // 经脉 Kungfu, // 武魂 Heart, // 心法 } public void CheckIsHasUp(bool force = false) { if(force == false && MeridiaSoulMain.Instance!=null && MeridiaSoulMain.Instance.gameObject.activeSelf) { MeridiaSoulMain.Instance.SetDataDuty(); return; } CheckVeinHasUp(); CheckKungfuHasUp(); CheckHeartHasUp(); if (ExtraFunTipRoot.Instance() != null) { ExtraFunTipRoot.Instance().UpdateMerial(); } RedTipPoint.RedPointStateChange(RedTipPoint.PointType.MeridiaSoul, HeartHasUp || MerialSoulHasUp || KungfuHasUp || BossBookPanel.IsNeedShowTips()); return; } public void SendAskDataCmd() { ReqGetSoulList cmd = new ReqGetSoulList(); cmd.flag = 1; cmd.SendMsg(); ReqGetVeinList cmd1 = new ReqGetVeinList(); cmd1.flag = 1; cmd1.SendMsg(); ReqGetHeartList cmd2 = new ReqGetHeartList(); cmd2.flag = 1; cmd2.SendMsg(); } //检查经脉是否有可升级的 public void CheckVeinHasUp() { if(IsFuncOpen(MeridiaSoulType.MerialSoul)) { var tabs = TableManager.GetBloodVeinConfig().Values; foreach (var VeinConfig in tabs) { for (int ChildNodeCount = 0; ChildNodeCount < VeinConfig.getNodeCount(); ChildNodeCount++) { if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level < VeinConfig.GetOpenLvbyIndex(ChildNodeCount)) continue; int nodeID = VeinConfig.GetNodebyIndex(ChildNodeCount); MeridiaSoulData.VeinNodeData VeinData = GetNodeData(VeinConfig.VeinID, nodeID); nodeID *= 1000; if (VeinData != null) { nodeID += VeinData.level; } Tab_BloodVeinNode node = TableManager.GetBloodVeinNodeByID(nodeID, 0); Tab_BloodVeinNode nodeNext = TableManager.GetBloodVeinNodeByID(nodeID + 1, 0); if (node == null || nodeNext == null) continue; long hasCount0 = Utils.GetConstHas(node.GetCostTypebyIndex(0), node.GetCostSubbyIndex(0)); long hasCount1 = Utils.GetConstHas(node.GetCostTypebyIndex(1), node.GetCostSubbyIndex(1)); int needCount0 = node.GetCostValbyIndex(0); int needCount1 = node.GetCostValbyIndex(1); if (hasCount0 < needCount0 && hasCount1 < needCount1) continue; MerialSoulHasUp = true; return; } } } MerialSoulHasUp = false; } public int[] GetAllHighSoul() { Tab_SoulGeneralAttr HeavenPay = null; var soulAttrs = TableManager.GetSoulGeneralAttr().Values; foreach (var soul in soulAttrs) { if (HeavenPay == null) HeavenPay = soul; int soulID = soul.Id; MeridiaSoulData.KungfuSoulData data = MeridiaSoulData.Instance.GetKungfuData(soulID, soul.HeavenID); soulID *= 1000; if (data != null) { soulID += data.star; } Tab_SoulGeneralStar soulStar = TableManager.GetSoulGeneralStarByID(soulID, 0); Tab_SoulGeneralStar soulStarNext = TableManager.GetSoulGeneralStarByID(soulID + 1, 0); if (soulStar == null || soulStarNext == null) continue; if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level < soulStar.OpenLevel) continue; long hasCount0 = Utils.GetConstHas(soulStar.ConsumeType, soulStar.ConsumeSubType); if (hasCount0 < soulStar.ConsumeValue) { continue; } HeavenPay = soul; return HeavenPay == null ? new int[] { -1, -1 } : new int[] { HeavenPay.HeavenID, HeavenPay.Id }; } return HeavenPay == null ? new int[] { -1, -1 } : new int[] { HeavenPay.HeavenID, HeavenPay.Id }; } public Tab_SoulGeneralStar GetSoulStarData(int SoulID,int HeavenID) { MeridiaSoulData.KungfuSoulData data = MeridiaSoulData.Instance.GetKungfuData(SoulID, HeavenID); SoulID *= 1000; if (data != null) { SoulID += data.star; } return TableManager.GetSoulGeneralStarByID(SoulID, 0); } public bool ConstEnough(int SoulID,int HeavenID) { MeridiaSoulData.KungfuSoulData data = MeridiaSoulData.Instance.GetKungfuData(SoulID, HeavenID); SoulID *= 1000; if (data != null) { SoulID += data.star; } var soul = TableManager.GetSoulGeneralStarByID(SoulID, 0); if (soul == null) return true; var hasCount0 = Utils.GetConstHas(soul.ConsumeType, soul.ConsumeSubType); return hasCount0 >= soul.ConsumeValue; } public bool Compare(SoulItem.SoulItemData data1, SoulItem.SoulItemData data2) { if (data1.CaUp && data2.CaUp == false) return true; if (data1.CaUp == false && data2.CaUp == true) return false; if(data1.CaUp == false && data2.CaUp == false) { Tab_SoulGeneralStar dataStar1 = GetSoulStarData(data1.SoulID, data1.HeavenID); Tab_SoulGeneralStar dataStar2 = GetSoulStarData(data2.SoulID, data2.HeavenID); if (dataStar1 == null && dataStar2 != null) return false; if (dataStar1 != null && dataStar2 == null) return true; if(dataStar1 != null && dataStar2 != null) { int mainLevel = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level; if (dataStar1.OpenLevel <= mainLevel) return true; if (dataStar1.OpenLevel > mainLevel && dataStar2.OpenLevel <= mainLevel) return false; bool data1Const = ConstEnough(data1.SoulID, data1.HeavenID); bool data2Const = ConstEnough(data2.SoulID, data2.HeavenID); if (dataStar1.OpenLevel <= mainLevel && dataStar2.OpenLevel <= mainLevel) { if (data1Const == false && data2Const) return false; } } } return true; } public bool IsSoulMaxLevel(int HeavenID, int soulID) { MeridiaSoulData.KungfuSoulData data = GetKungfuData(soulID, HeavenID); if (data == null) return false; Tab_SoulGeneralStar soulStar = TableManager.GetSoulGeneralStarByID(data.star + soulID * 1000 + 1, 0); if (soulStar == null) return true; return false; } public bool SoulCanUp(int HeavenID,int soulID,bool UseCoin) { MeridiaSoulData.KungfuSoulData data = MeridiaSoulData.Instance.GetKungfuData(soulID, HeavenID); soulID *= 1000; if (data != null) { soulID += data.star; } Tab_SoulGeneralStar soulStar = TableManager.GetSoulGeneralStarByID(soulID, 0); Tab_SoulGeneralStar soulStarNext = TableManager.GetSoulGeneralStarByID(soulID + 1, 0); if (soulStar == null || soulStarNext == null) return false; if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level < soulStar.OpenLevel) return false; long hasCount0 = Utils.GetConstHas(soulStar.ConsumeType, soulStar.ConsumeSubType); if (hasCount0 < soulStar.ConsumeValue) { if (UseCoin && soulStar.ConsumeType == 4 && soulStar.ConsumeSubType == (int)MONEYTYPE.MONEYTYPE_COIN_BIND) { hasCount0 = Utils.GetConstHas(4, (int)MONEYTYPE.MONEYTYPE_COIN); if (hasCount0 > soulStar.ConsumeValue) return true; } return false; } return true; } //检查武魂是否有可升级的 public void CheckKungfuHasUp() { if(IsFuncOpen(MeridiaSoulType.Kungfu)) { var soulAttrs = TableManager.GetSoulGeneralAttr().Values; foreach (var soul in soulAttrs) { int soulID = soul.Id; MeridiaSoulData.KungfuSoulData data = MeridiaSoulData.Instance.GetKungfuData(soulID, soul.HeavenID); soulID *= 1000; if (data != null) { soulID += data.star; } Tab_SoulGeneralStar soulStar = TableManager.GetSoulGeneralStarByID(soulID, 0); Tab_SoulGeneralStar soulStarNext = TableManager.GetSoulGeneralStarByID(soulID + 1, 0); if (soulStar == null || soulStarNext == null) continue; if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level < soulStar.OpenLevel) continue; long hasCount0 = Utils.GetConstHas(soulStar.ConsumeType, soulStar.ConsumeSubType); if (hasCount0 < soulStar.ConsumeValue) { continue; } KungfuHasUp = true; return; } } KungfuHasUp = false; } #region //经脉数据 public class VeinNodeData { public int veinID; public int nodeID; public int level; } public List m_VeinNodeDatas = new List(); public void UpgradeVein(RespUpgradeVein packet) { if (packet == null || packet.veinId==-1 || packet.nodeId==-1) return; for (int i=0;i< m_VeinNodeDatas.Count;i++) { VeinNodeData vein = m_VeinNodeDatas[i]; if(vein.veinID == packet.veinId && vein.nodeID == packet.nodeId) { vein.level = packet.level; m_VeinNodeDatas[i] = vein; return; } } VeinNodeData veinNew = new VeinNodeData(); veinNew.level = packet.level; veinNew.nodeID = packet.nodeId; veinNew.veinID = packet.veinId; m_VeinNodeDatas.Add(veinNew); } public void SetNewVeinList(RespGetVeinList packet) { if (packet == null) return; m_VeinNodeDatas.Clear(); for(int i=0;i VeinNodeDatas = GetAllVeinData(VeinID); int level = 0; for (int i = 0; i < VeinNodeDatas.Count; i++) { level += VeinNodeDatas[i].level; } return level; } public int GetAllNodeLevelCount() { int level = 0; for (int i = 0; i < m_VeinNodeDatas.Count; i++) { level += m_VeinNodeDatas[i].level; } return level; } public int GetAllNodeInVein(int veinID) { int count = 0; for(int i=0;i GetAllVeinData(int VeinID = -1) { if (VeinID == -1) return m_VeinNodeDatas; List datas = new List(); for (int i = 0; i < m_VeinNodeDatas.Count; i++) { if (m_VeinNodeDatas[i].veinID == VeinID) datas.Add(m_VeinNodeDatas[i]); } return datas; } #endregion #region //武魂的数据 public int wishNum; public class KungfuSoulData { public int generalId; public int heavenId; public int star; public int CanUp; } public List m_KungfuSoulDatas = new List(); public int GetWishNum() { return wishNum; } public void FreshWish(RespGetMoney packet) { if (packet == null) return; wishNum = packet.wishNum; } public void UpKungfuVein(RespUpgradeSoul packet) { if (packet == null) return; wishNum = packet.wishNum; if (packet.ret == 0) return; for (int i = 0; i < m_KungfuSoulDatas.Count; i++) { KungfuSoulData vein = m_KungfuSoulDatas[i]; if (vein.heavenId == packet.heavenId && vein.generalId == packet.generalId) { vein.star = packet.star; m_KungfuSoulDatas[i] = vein; return; } } KungfuSoulData veinAdd = new KungfuSoulData(); veinAdd.generalId = packet.generalId; veinAdd.heavenId = packet.heavenId; veinAdd.star = packet.star; m_KungfuSoulDatas.Add(veinAdd); } public void SetNewKungfuList(RespGetSoulList packet) { if (packet == null) return; wishNum = packet.wishNum; m_KungfuSoulDatas.Clear(); for (int i = 0; i < packet.heavenList.Count; i++) { for (int j = 0; j < packet.heavenList[i].generalList.Count; j++) { KungfuSoulData soul = new KungfuSoulData(); soul.generalId = packet.heavenList[i].generalList[j].generalId; soul.heavenId = packet.heavenList[i].heavenId; soul.star = packet.heavenList[i].generalList[j].star; //soul.CanUp = CheckNodeUp(vein.veinID, vein.nodeID, vein.level); m_KungfuSoulDatas.Add(soul); } } } public KungfuSoulData GetKungfuData(int generalId,int heavenId) { for(int i=0;i< m_KungfuSoulDatas.Count;i++) { if (m_KungfuSoulDatas[i].generalId == generalId && m_KungfuSoulDatas[i].heavenId == heavenId) return m_KungfuSoulDatas[i]; } return null; } public List GetKungfus(int heaven) { if (heaven == -1) return m_KungfuSoulDatas; List datas = new List(); for (int i = 0; i < m_KungfuSoulDatas.Count; i++) { if ( m_KungfuSoulDatas[i].heavenId == heaven) datas.Add( m_KungfuSoulDatas[i]); } return datas; } #endregion #region//心脉数据 public int HeartCount = 0; //元神值 public int PulseLevel = 0;//灵脉等级 public int HeartTotlePower = 0;//总战力 public int HeartClass = 1;//层级 private List m_HeartDatas = new List();//心法列表 private List m_HeartAttrs = new List(); //心法属性列表 private List m_PulseAttrs = new List(); //灵脉属性列表 public List GetAllHeartAddAttr() { List showlists = new List(); showlists.AddRange(m_HeartAttrs); showlists.AddRange(m_PulseAttrs); return showlists; } public AttrData GetOneHeartAddAttr(int attrID) { for(int i=0;i= tab.OpenLevel) { Tab_HeartBase heartBase = TableManager.GetHeartBaseByID(1, 0); if (heartBase == null) return false; var MainPlayerLevel = mainPlayerAttr.Level; switch(t) { case MeridiaSoulType.MerialSoul: if (MainPlayerLevel >= heartBase.BloodOpenLevel) return true; else return false; case MeridiaSoulType.Kungfu: if (MainPlayerLevel >= heartBase.SoulOpenLevel) return true; else return false; case MeridiaSoulType.Heart: if (MainPlayerLevel >= heartBase.OpenLevel) return true; else return false; } } return false; } #region 心法红点更新 /// /// 检查页内红点信息,并设置页外菜单红点状态 /// /// true: 有红点, false: 无红点 public void CheckHeartHasUp() { if (!MeridiaSoulData.Instance.IsFuncOpen(MeridiaSoulData.MeridiaSoulType.Heart)) { HeartHasUp = false; return; } // 拥有元神值 int tempGodHas = MeridiaSoulData.Instance.HeartCount; // 进度 int maxAllLevelCount = 0; int heartLevelCount = 0; bool isEnougth = false; var hearts = TableManager.GetHeartAttr().Values; foreach (var heart in hearts) { int HeartLevelID = heart.Id * 1000000 + MeridiaSoulData.Instance.HeartClass * 1000 + MeridiaSoulData.Instance.GetHeartLevel(heart.Id); Tab_HeartLevel HeartLevelTab = TableManager.GetHeartLevelByID(HeartLevelID, 0); // 所需元神值 int tempGodNeed = HeartLevelTab.LevelSoulCount; Tab_HeartLevel nextHeartLevel = TableManager.GetHeartLevelByID(HeartLevelID + 1, 0); if (isEnougth == false && tempGodHas >= tempGodNeed && nextHeartLevel != null) { // 存在任意一个可满足升级即可 isEnougth = true; } if (HeartLevelTab == null) continue; Tab_HeartLevel HeartLevelTabNext = TableManager.GetHeartLevelByID(HeartLevelID + 1, 0); int count = GetLearnMaxLevel(heart.Id); maxAllLevelCount += count; heartLevelCount += MeridiaSoulData.Instance.GetHeartLevel(heart.Id); } // 当该层心法修满,是否可以进阶? if (heartLevelCount >= maxAllLevelCount) { Tab_HeartClass heartClass = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass, 0); Tab_HeartClass heartClassNext = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass + 1, 0); if(heartClassNext == null) { HeartHasUp = false; return; } int has = GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(heartClass.ConsumeSubType); if (heartClass.ConsumeValue > has) { HeartHasUp = false; return; } else { HeartHasUp = true; return; } } // 不满时,可以是否有一个够钱升级 else if (isEnougth) { HeartHasUp = true; return; } HeartHasUp = false; return; } public int GetLearnMaxLevel(int heartID) { var count = 0; var heartLevels = TableManager.GetHeartLevel().Values; foreach (var heart in heartLevels) { if (heart.Level != 0 && heart.HeartID == heartID && heart.ClassID == MeridiaSoulData.Instance.HeartClass) count++; } return count; } #endregion }