using System.Collections.Generic; using Common.Utility.CombatEvent; using Core.Utility; using Excel2Json; using Fort23.Core; using Fort23.UTool; using GameLogic.Bag; namespace GameLogic.Hero { public class HeroController { /// /// 所有英雄 /// public Dictionary allHeroDic = new Dictionary(); /// /// 也可以叫主力(afk的共鸣英雄),替补英雄等级=主力英雄的最低等级(和afk一样的) /// 主力英雄不一定等于上阵英雄,主力英雄只是决定了共鸣等级 /// public Dictionary heroDicInLead = new Dictionary(4); /// /// 后备英雄(共享等级) /// public Dictionary heroDicInBack = new Dictionary(); public int mainLevel => m_MainLevel; private int m_MainLevel; private void CalMainLevel() { //主力英雄不足4个时,就没有主力等级的说法 // if (heroDicInLead.Count < GlobalParam.Max_Deploy_HERO) // { // m_MainLevel = -1; // return; // } //计算主力英雄的最低等级 int tmpLv = 9999; foreach (var keyValuePair in heroDicInLead) { if (keyValuePair.Value.level.Value < tmpLv) { tmpLv = keyValuePair.Value.level.Value; } } m_MainLevel = tmpLv; EventManager.Instance.Dispatch(CustomEventType.MainLvUp, new SimpleEventData(){intData = m_MainLevel}); } public HeroUpResultType CanPromote(HeroInfo heroInfo) { long curHeroCount = BagController.Instance.GetItemInfo(heroInfo.modelConfig.itemID).count.Value; int costHeroCount = heroInfo.promoteConfig.costCount; if (curHeroCount < costHeroCount) { return HeroUpResultType.ResNotEnough; } return HeroUpResultType.Success; } public HeroUpResultType CanUpgrade(HeroInfo heroInfo, bool isOpenPre = false) { if (PlayerManager.Instance.gameConstantConfig.maxLv <= heroInfo.level.Value) { LogTool.Log("已到达最高等级:" + PlayerManager.Instance.gameConstantConfig.maxLv); return HeroUpResultType.MaxLv; } //计算主力英雄等级差, 如果再升一级,就大于最大等级差了,就不允许升了. if (heroInfo.level.Value - m_MainLevel >= GlobalParam.Max_Main_Level_Difference) { LogTool.Log(heroInfo.modelID + "主力英雄等级差不能超过:" + GlobalParam.Max_Main_Level_Difference); return HeroUpResultType.MainLevelNotEnough; } //每10级,要打开预览界面后,再升级(如果已经打开,就不判断了) if (!isOpenPre && (heroInfo.level.Value + 1) % 10 == 1) { return HeroUpResultType.NeedOpenPreUI; } if (BagController.Instance.IsEnough(GlobalParam.Item_HeroExp_ID, heroInfo.powerUpConfig.levelUpExp)) { if (isOpenPre) { return HeroUpResultType.PlayUpgradeEftFirst; } return HeroUpResultType.Success; } else { return HeroUpResultType.ExpNotEnough; } } private void DoUpgrade(HeroInfo heroInfo) { heroInfo.Upgrade(); PlayerManager.Instance.SaveHeroData(heroInfo); //如果当前英雄等级等于主力等级,则升级时需要重新计算主力等级 if (heroInfo.level.Value - 1 == m_MainLevel) { CalMainLevel(); } SendEvent(HeroUpType.Level, heroInfo, HeroUpResultType.Success); } /// /// 英雄升级逻辑,主要是改数据,不在这里做UI表现 /// /// public HeroUpResultType UpgradeHeroLogic(HeroInfo heroInfo, bool isOpenPre = false) { HeroUpResultType resultType = CanUpgrade(heroInfo, isOpenPre); if (resultType == HeroUpResultType.Success || resultType == HeroUpResultType.PlayUpgradeEftFirst) { //扣除经验 bool isOk = BagController.Instance.DuctHeroExp(heroInfo.powerUpConfig.levelUpExp); if (isOk) { if (resultType == HeroUpResultType.Success) { DoUpgrade(heroInfo); } else if (resultType == HeroUpResultType.PlayUpgradeEftFirst) { //执行逻辑,返回播放特效的类型 DoUpgrade(heroInfo); return resultType; } return HeroUpResultType.Success; } } return resultType; } /// /// 发送英雄提升的事件 /// /// 提升类型:升级、升星等. public void SendEvent(HeroUpType upType, HeroInfo heroInfo, HeroUpResultType resultType = HeroUpResultType.None) { HeroPowerUpEventData data = new HeroPowerUpEventData(); data.heroModelID = heroInfo.modelID; data.upType = upType; data.ResultType = resultType; PlayerManager.Instance.lastHeroInfo = heroInfo; if (upType == HeroUpType.Level) { SkillUpConfig upConfig = PlayerManager.Instance.heroController .GetSkillUpConfig4Lv(heroInfo.level.Value); if (upConfig.ID > 0) { heroInfo.SkillData.UpdateSkills(); data.isSkillUp = true; } EventManager.Instance.Dispatch(CustomEventType.HeroLvUp, data); } else if (upType == HeroUpType.Promote) { // SkillUpConfig upConfig = PlayerManager.Instance.heroController // .IsStarUpGetNewSkill(heroInfo.star.Value); // data.isSkillUp = upConfig.ID > 0; SkillUpConfig upConfig = PlayerManager.Instance.heroController.GetSkillUpConfig4Star(heroInfo.star.Value); if (upConfig.ID > 0) { heroInfo.SkillData.UpdateSkills(); data.isSkillUp = true; } EventManager.Instance.Dispatch(CustomEventType.HeroPromote, data); } EventManager.Instance.Dispatch(CustomEventType.HeroPowerUp, data); } public void InitHeroes() { for (int i = 0; i < AccountFileInfo.Instance.playerData.HeroListData.Count; i++) { AccountFileInfo.HeroData heroData = AccountFileInfo.Instance.playerData.HeroListData[i]; HeroInfo heroInfo = new HeroInfo(); heroInfo.InitHero(heroData); AddHero(heroInfo); } CalMainLevel(); } /// /// 获取英雄 /// /// 英雄ID modelID /// public CombatHeroInfo GetHeroInfo(int modelID) { if (allHeroDic.ContainsKey(modelID)) { return allHeroDic[modelID]; } LogTool.Error("没有这个英雄" + modelID); return null; } /// /// 添加英雄 /// /// public void AddHero(HeroInfo heroInfo) { if (heroInfo.isLead) { DeployHeroToLead(heroInfo); } else { DeployHeroToBack(heroInfo); } } /// /// 进入主力队伍 /// /// public void DeployHeroToLead(HeroInfo heroInfo) { if (heroDicInLead.Count >= GlobalParam.Max_Deploy_HERO) { return; } if (heroDicInLead.ContainsKey(heroInfo.modelID)) { LogTool.Error("heroDicInLead不应该出现相同的英雄ID=" + heroInfo.modelID); return; } heroDicInLead.Add(heroInfo.modelID, heroInfo); heroInfo.isLead = true; allHeroDic.Add(heroInfo.modelID, heroInfo); CalMainLevel(); } /// /// 更换主力 /// /// public void ChangeLeadHero(HeroInfo backHero, HeroInfo leadHero) { if (!heroDicInLead.ContainsKey(leadHero.modelID)) { LogTool.Error("不是主力" + leadHero.modelID); return; } if (!heroDicInBack.ContainsKey(backHero.modelID)) { LogTool.Error("不是替补" + backHero.modelID); return; } //从主力中移除,并加入后补 heroDicInLead.Remove(leadHero.modelID); DeployHeroToBack(leadHero); //从后补中移除,并加入主力 heroDicInBack.Remove(backHero.modelID); DeployHeroToLead(backHero); } /// /// 进入后备队伍(英雄背包) /// /// public void DeployHeroToBack(HeroInfo heroInfo) { if (heroDicInBack.ContainsKey(heroInfo.modelID)) { LogTool.Error("heroDicInBack不应该出现相同的英雄ID=" + heroInfo.modelID); return; } heroDicInBack.Add(heroInfo.modelID, heroInfo); heroInfo.isLead = false; allHeroDic.Add(heroInfo.modelID, heroInfo); } /// /// onlyUnLock=true, 获取已解锁的最高等级的技能 /// onlyUnLock=false,获取已解锁的最高等级的技能,若都没有解锁,则获取未解锁的1级技能 /// /// 技能组 /// 英雄等级 /// 英雄星级 /// ture=只返回解锁的 /// public SkillConfig GetHighestLevelOr1(int groupID, int level, int star, bool onlyUnLock = false,bool isMonster=false) { SkillConfig skillConfig = new SkillConfig(); int lv = 0; for(int i = 0; i < PlayerManager.Instance.groupSkillDic[groupID].Count; i++) { SkillConfig config = PlayerManager.Instance.groupSkillDic[groupID][i]; if (i == 0 && !onlyUnLock) { skillConfig = config; } // if (config.isUnLock && config.skillConfig.level > lv) if(IsUnLockSkill(level, star, config.ID,isMonster) && config.level > lv) { lv = config.level; skillConfig = config; } } return skillConfig; } /// /// 技能是否解锁 /// /// 英雄等级 /// 英雄星级 /// 技能id /// public bool IsUnLockSkill(int level, int star, int skillID,bool isMonster=false) { bool isUnLock = false; if (skillID == GlobalParam.Normal_Attack_Skill_Group_ID) { isUnLock = true; } else { //整体可能有点绕,后面再看优化不 //取技能ID的后两位,后两位是技能解锁表SkillUpConfig的ID, 取这个ID来判断,这个技能技能的解锁情况 int skillUpID = skillID % 100; SkillUpConfig upConfig = ConfigComponent.Instance.Get(skillUpID); //取个位 int gw = skillUpID % 10; int skillUpIDLevel1 = -1; //当个位>1时(表示技能等级>1),需要额外判断一下,技能的1级是否已经解锁(可能1级是星级解锁) //避免出现,技能是5星解锁解锁1级,200级解锁2级,但玩家现在4星,201级,就不该解锁2级,因为星级不够 if (gw > 1) { //技能1级的解锁ID,例如: 33 - 3 + 1 = 31, 31就是技能1级的解锁条件id skillUpIDLevel1 = skillUpID - gw + 1; } //等级解锁 if (upConfig.upType == 1) { SkillUpConfig skillUpConfigLevel1 = new SkillUpConfig(); //准备判断,该技能1级时,是否为星级解锁 if (skillUpIDLevel1 > 0) { skillUpConfigLevel1 = ConfigComponent.Instance.Get(skillUpIDLevel1); } //如果技能的第一级需要星级解锁,需额外判断一下星级是否达到 bool isStarEnough = skillUpConfigLevel1.upType != 2 || star > skillUpConfigLevel1.upValue; if (level >= upConfig.upValue && isStarEnough) { isUnLock = true; } } //星级解锁 else if (upConfig.upType == 2) { if (star >= upConfig.upValue||isMonster) { isUnLock = true; } } } return isUnLock; } public SkillUpConfig GetSkillUpConfig(int skillID) { //取技能ID的后两位,后两位是技能解锁表SkillUpConfig的ID, 取这个ID来判断,这个技能技能的解锁情况 int skillUpID = skillID % 100; SkillUpConfig upConfig = ConfigComponent.Instance.Get(skillUpID); return upConfig; } /// /// 根据【等级】查找是否有技能 /// /// 英雄等级 /// public SkillUpConfig GetSkillUpConfig4Lv(int level) { SkillUpConfig upConfig = new SkillUpConfig(); foreach (SkillUpConfig skillUpConfig in PlayerManager.Instance.skillUpConfigs) { if (skillUpConfig.upType == 1 && level == skillUpConfig.upValue) { return skillUpConfig; } } return upConfig; } /// /// 根据【星级】查找是否有技能 /// /// 英雄等级 /// public SkillUpConfig GetSkillUpConfig4Star(int star) { SkillUpConfig upConfig = new SkillUpConfig(); foreach (SkillUpConfig skillUpConfig in PlayerManager.Instance.skillUpConfigs) { if (skillUpConfig.upType == 2 && star == skillUpConfig.upValue) { return skillUpConfig; } } return upConfig; } // /// // /// 判断【星级】是否可以解锁新技能 // /// // /// // /// // public SkillUpConfig IsStarUpGetNewSkill(int star) // { // SkillUpConfig upConfig = new SkillUpConfig(); // foreach (SkillUpConfig skillUpConfig in PlayerManager.Instance.skillUpConfigs) // { // if (skillUpConfig.upType == 2 && star == skillUpConfig.upValue) // { // return upConfig; // } // } // return upConfig; // } } }