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() { //计算主力英雄的最低等级 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); } public HeroUpResultType PromoteHeroLogic(HeroInfo heroInfo) { HeroUpResultType resultType = CanPromote(heroInfo); if (resultType == HeroUpResultType.Success) { //扣除碎片 bool isOk = BagController.Instance.DeductItem(heroInfo.modelConfig.itemID, heroInfo.promoteConfig.costCount); if (isOk) { if (resultType == HeroUpResultType.Success) { heroInfo.Promote(); PlayerManager.Instance.SaveHeroData(heroInfo); // SendEvent(HeroUpType.Promote, heroInfo, resultType); } } } return resultType; } /// /// 英雄升级逻辑,主要是改数据,不在这里做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() { 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); } } }