FightPointPassManager = {}; local this = FightPointPassManager local mainLevelConfig = ConfigManager.GetConfig(ConfigName.MainLevelConfig) -- 火洞吊裸 local Huo_Dong_Diao_Luo = ConfigManager.GetConfig(ConfigName.ActivityDropReward) local rewardGroupConfig = ConfigManager.GetConfig(ConfigName.RewardGroup) local LevelTipsConfig = ConfigManager.GetConfig(ConfigName.LevelTips) this.talkingTime = 0 --对话时间 -- 挂机物品栏位对应vip数值加成特权 -- 战斗胜利后是否已经更新过ID local hadUpdate = false local CHATER_OPEN = 1 local CHATER_CLOSE = 0 local CHATER_STATE = "CHATER_STATE" local OLD_ID = "OLD_ID" local isOpenRewardUpTip = false this.randomNum = 1 function this.Initialize() this.curOpenFight = 1011 -- 当前开启的关卡 this.lastPassFightId = 1011 -- 上一关的ID this.isBattleBack = false this.HangOnTime = 0 -- 关卡挂机时长 this.curFightState = 0 this.oldLevel = 0 -- 玩家关卡战斗之前的等级 this.curFightMapId = 1011 -- 当前关卡对应的地图背景ID this.isOutFight = false this.isOpenNewChapter = false -- 是否开启新章节 this.isMaxChapter=false --是否最大章节 this.maxChapterNum=15 --最大章节数 this.isBeginFight = false this.enterFightBattle = false -- 进入关卡战斗 this.ShowBtnJumpTime = ConfigManager.GetConfig(ConfigName.GameSetting)[1].JumpLevelTime this.boxState = 0 -- 当前需要显示的宝箱 Game.GlobalEvent:AddEvent(GameEvent.Player.OnLevelChange, this.CheckFightRP) -- Game.GlobalEvent:AddEvent(GameEvent.Mission.OnOpenEnableFight, this.CheckFightRP) Game.GlobalEvent:AddEvent(GameEvent.Mission.OnOpenFight, this.CheckFightRP) end function this.CheckFightRP() CheckRedPointStatus(RedPointType.SecretTer_IsCanFight) end -- 初始化关卡状态, state , 1 已开启未通过 2 :已通过 -1 已开启等级未解锁 function this.InitAllFightPointState(msg) Log("当前关卡ID " .. tostring(msg.fightId).." 当前关卡的状态:" ..tostring(msg.state).." 当前已经挂机的时长:" .. tostring(msg.duration).." 挂机奖励:"..tostring(msg.reward)) if msg.duration < 0 then Log("服务器返回的挂机时长是负数,是不是调时间??") end this.HangOnTime = msg.duration this.curOpenFight = msg.fightId if mainLevelConfig[this.curOpenFight].SortId-1 > 0 then this.lastPassFightId = ConfigManager.GetConfigDataByKey(ConfigName.MainLevelConfig,"SortId", mainLevelConfig[this.curOpenFight].SortId-1).Id LogError("this.lastPassFightId=="..this.lastPassFightId) PlayerPrefs.SetInt(PlayerManager.uid .. OLD_ID,this.lastPassFightId) end this.curFightState = msg.state this.adventrueEnemyList=msg.adventureBossInfo this.HangOnReward=msg.reward Log() this.maxChapterNum = LengthOfTable(GameDataBase.SheetBase.GetKeys(ConfigManager.GetConfig(ConfigName.MainLevelSettingConfig))) end -- 获取某一关卡的状态, 小于当前关卡必定已通关,大于必定未解锁 function this.GetFightStateById(fightId) local curDiff = mainLevelConfig[this.curOpenFight].Difficulty local judgeDiff = mainLevelConfig[fightId].Difficulty if curDiff == judgeDiff then if fightId < this.curOpenFight then return FIGHT_POINT_STATE.PASS elseif fightId == this.curOpenFight then if this.curFightState == 1 then return FIGHT_POINT_STATE.OPEN_NOT_PASS elseif this.curFightState == -1 then return FIGHT_POINT_STATE.OPEN_LOW_LEVEL elseif this.curFightState == 2 then return FIGHT_POINT_STATE.PASS end elseif fightId > this.curOpenFight then return FIGHT_POINT_STATE.LOCK end elseif curDiff > judgeDiff then return FIGHT_POINT_STATE.PASS elseif curDiff < judgeDiff then return FIGHT_POINT_STATE.LOCK end end -- 获取某一关卡是否开启 function this.GetFightIsOpenById(fightId) local curDiff = mainLevelConfig[this.curOpenFight].Difficulty local judgeDiff = mainLevelConfig[fightId].Difficulty if curDiff == judgeDiff then return fightId <= this.curOpenFight elseif judgeDiff < curDiff then return true else return false end end -- 获取某一关卡是否通关 function this.IsFightPointPass(fightId) local isPass = false local curDiff = mainLevelConfig[this.curOpenFight].Difficulty if mainLevelConfig[fightId] then local judgeDiff = mainLevelConfig[fightId].Difficulty if curDiff == judgeDiff then if fightId < this.curOpenFight then isPass = true elseif fightId == this.curOpenFight then if this.curFightState == 2 then -- 最后一章的最后一关 isPass = true else isPass = false end else isPass = false end elseif curDiff > judgeDiff then isPass = true else isPass = false end end return isPass end -- 获取某一关卡是否通关 function this.IsFightPointPass2(fightId) local isPass = false LogError("fightid=="..fightId.." this.curOpenFight=="..this.curOpenFight) local curDiff = mainLevelConfig[this.curOpenFight].Difficulty local judgeDiff = mainLevelConfig[fightId].Difficulty if curDiff == judgeDiff then if fightId < this.curOpenFight then isPass = true elseif fightId == this.curOpenFight then if this.curFightState == 2 then -- 最后一章的最后一关 isPass = true else isPass = true end else isPass = false end elseif curDiff > judgeDiff then isPass = true else isPass = false end return isPass end -- 战斗胜利后,刷新当前关卡的ID function this.RefreshFightId(msg) --local data = mainLevelConfig[this.curOpenFight] --if data then local oldFight = this.curOpenFight this.lastPassFightId = oldFight PlayerPrefs.SetInt(PlayerManager.uid .. OLD_ID, oldFight) -- 最后一关更新 --if data.NextLevel ~= -1 then Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnPassFight, oldFight) -- 服务器更新关卡状态 this.curOpenFight = msg.fightId this.curFightState = msg.state if this.curFightState == 1 then -- 解锁一个可以打的新关卡, 发送新关卡ID Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnOpenEnableFight, msg.fightId) end -- 章节开启 local isOpen = mainLevelConfig[this.curOpenFight].PicShow == 1 --开启新章节的表现处理 if isOpen then this.SetChapterOpenState(true) end Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnOpenFight, oldFight) --判断是否需要弹估计奖励提升界面 local oldLevelConFig = ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.lastPassFightId) local cirLevelConFig = ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.curOpenFight) for i = 1, #cirLevelConFig.RewardShowMin do local oldsinglePro = oldLevelConFig.RewardShowMin[i] local cursinglePro = cirLevelConFig.RewardShowMin[i] if not isOpenRewardUpTip and cursinglePro[2] > oldsinglePro[2] then this.SetIsOpenRewardUpTip(true) end end Log(" 更新关卡ID " .. this.curOpenFight) Log(" 关卡状态 " .. this.curFightState) -- 判断新解锁关卡的状态 --if PlayerManager.level >= data.LevelLimit then -- this.curFightState = 1 --if this.curFightState == 1 then -- -- 解锁一个可以打的新关卡, 发送新关卡ID -- Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnOpenEnableFight, data.NextLevel) --end --else -- this.curFightState = -1 --end ---- 章节开启 --local isOpen = mainLevelConfig[this.curOpenFight].PicShow == 1 ----开启新章节的表现处理 --if isOpen then -- this.SetChapterOpenState(true) --end --Log("~关卡已通关,id = "..oldFight) -- 发送关卡通关事件 --[[ Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnOpenFight, oldFight)]] --else -- this.curFightState = 2 --end --end end function this.GetIsOpenRewardUpTip() return isOpenRewardUpTip end function this.SetIsOpenRewardUpTip(_isOpenRewardUpTip) isOpenRewardUpTip = _isOpenRewardUpTip end function this.SetChapterOpenState(state) this.isOpenNewChapter = state local value = state and CHATER_OPEN or CHATER_CLOSE PlayerPrefs.SetInt(PlayerManager.uid .. CHATER_STATE, value) end function this.IsChapterClossState() if this.curOpenFight == 1011 then return true end this.isOpenNewChapter = PlayerPrefs.GetInt(PlayerManager.uid .. CHATER_STATE) < 1 return this.isOpenNewChapter end -- 获取当前关卡的ID function this.GetCurFightId() return this.curOpenFight end --当前关卡是否是首领关卡 function this.GetCurOpenFightIdIsBoss() local offset = 1 offset = mainLevelConfig[this.curOpenFight].Difficulty local newFightId = (tonumber(this.curOpenFight) - offset) / 10 return (newFightId % 5) == 0 end function this.GetLastFightID() if PlayerPrefs.GetInt(PlayerManager.uid .. OLD_ID) > 0 then this.lastPassFightId = PlayerPrefs.GetInt(PlayerManager.uid .. OLD_ID) end end -- 获取挂机奖励vip加成 function this.GetItemVipValue(itemId) local privilege = _ItemIdToVipPrivilege[itemId] if not privilege then return 0 end local value = PrivilegeManager.GetPrivilegeNumber(privilege) return value end -- 点击按钮是判断是否可以挑战 function this.IsCanFight(fightId) -- 是否有数据 if not mainLevelConfig[this.curOpenFight] then Log("没有这个关卡") return false, Language[10616] end --章节解锁优先 if this.IsChapterClossState() then -- 以防后端不校验,再来一次 local isOk, tip = this.CheckFightOpenRule(this.curOpenFight) if not isOk then Log("等级不足,无法挑战关卡") return false, tip else -- 等级不足未通关时设置一下 if this.curFightState == -1 then this.curFightState = 1 end end local state = this.GetFightStateById(fightId) if state == FIGHT_POINT_STATE.OPEN_NOT_PASS then Log("关卡开启,未通关") return true, Language[10617] elseif state == FIGHT_POINT_STATE.OPEN_LOW_LEVEL then Log("等级不足,无法挑战关卡") return false, "关卡未满足解锁条件"--tostring(mainLevelConfig[this.curOpenFight].LevelLimit .. Language[10056]) elseif state == FIGHT_POINT_STATE.PASS then -- 最后一关 Log("已经通关") return false, Language[10618] end else return true, Language[10619] end end -- 检测其他关卡条件 function this.CheckFightOpenRule(fightId) if not fightId or not mainLevelConfig[fightId] then return false, "没有这个关卡" end if PlayerManager.level < mainLevelConfig[this.curOpenFight].LevelLimit then local tip = tostring(mainLevelConfig[this.curOpenFight].LevelLimit .. Language[10056]) --LogRed(tip .. " 当前:"..PlayerManager.level) return false, tip, tip end local openRule = mainLevelConfig[fightId].OpenRule if openRule then local states = {} local tips = {} local btnTxts = {} for index, rule in ipairs(openRule) do states[index] = true if not rule[1] or rule[1] == 0 then --LogRed("当前:没有限制条件1") states[index] = true elseif rule[1] == 1 then local star = FightLevelManager.GetAllChapterStars() if star < rule[2] then states[index] = false tips[index] = string.format("山河社稷图星数达%s", rule[2])-- 山河社稷图%s星 btnTxts[index] = string.format("山河社稷图%s星", rule[2]) --LogRed(tips[index]..", 当前:"..star) end elseif rule[1] == 2 then local wave = MonsterCampManager.GetMonsterCampCurWave() if wave <= rule[2] then states[index] = false tips[index] = string.format("心魔试炼通关%s层", rule[2])-- 心魔试炼通关999层 btnTxts[index] = string.format("心魔试炼通关%s层", rule[2]) --LogRed(tips[index]..", 当前:"..wave) end elseif rule[1] == 3 then local lv = HarmonyManager.GetSingleAdditions(HarmonyAddType.AddLv) if lv < rule[2] then states[index] = false tips[index] = string.format("鸿蒙阵共鸣等级达%s", rule[2])-- 鸿蒙阵共鸣%s级 btnTxts[index] = string.format("鸿蒙阵共鸣%s级", rule[2]) --LogRed(tips[index]..", 当前:"..lv) end elseif rule[1] == 4 then -- 指定星级(运算星级)装备数量(初始可用) local num = EquipManager.GetLimitStarEquipNum(rule[2]) if num < rule[3] then local equipStarConfig = ConfigManager.GetConfigData(ConfigName.EquipStarsConfig, rule[2]) states[index] = false tips[index] = string.format("拥有%s个%s%s星装备", rule[3], QualityNameDef[equipStarConfig.Quality], equipStarConfig.Stars) btnTxts[index] = string.format("%s个%s%s星装备", rule[3], QualityNameDef[equipStarConfig.Quality], equipStarConfig.Stars) --LogRed(tips[index]..", 当前:"..num) end elseif rule[1] == 5 then local _, tlv, _ = LikabilityManager.GetTotalHeroLikeLv(-1) if tlv < rule[2] then states[index] = false tips[index] = string.format("英雄总好感度等级达%s", rule[2]) -- 总好感度%s级 btnTxts[index] = string.format("总好感度%s级", rule[2]) --LogRed(tips[index]..", 当前:"..tlv) end elseif rule[1] == 6 then -- 逍遥游通关次数 local xyPassTimes = XiaoYaoManager.GetCurPassTimes() if xyPassTimes < rule[2] then states[index] = false tips[index] = string.format("逍遥游通关%s次", rule[2]) btnTxts[index] = string.format("逍遥游通关%s次", rule[2]) --LogRed(tips[index]..", 当前:"..xyPassTimes) end elseif rule[1] == 7 then local c_lv = rule[2] local c_num = rule[3] local num = #HeroManager.GetAllHeroDatas(c_lv) if num < c_num then states[index] = false tips[index] = string.format("拥有%s个等级%s以上的英雄", c_num, c_lv)-- %s个%s级神将 btnTxts[index] = string.format("%s个%s级英雄", c_num, c_lv) --LogRed(tips[index]..", 当前:"..num) end end end local tip = "" local btnTxt = "" local isOk = true for index, state in ipairs(states) do if not state then isOk = false -- 提示文字 if tip ~= "" then tip = tip..string.format(",且%s", tips[index]) else tip = tips[index] end -- 按钮显示文字 if btnTxt ~= "" then btnTxt = tip..string.format(",且%s", btnTxts[index]) else btnTxt = btnTxts[index] end end end return isOk, tip.."解锁", btnTxt, states end --LogRed("当前:没有限制条件2") return true end -- 判断是否显示关卡按钮红点 function this.IsShowFightRP() return this.IsCanFight(this.curOpenFight) end -- 挑战按钮的文字显示 function this.GetBtnText() -- 解锁新章节优先 if this.IsChapterClossState() then -- 先判断等级 local limitLevel = mainLevelConfig[this.curOpenFight].LevelLimit if PlayerManager.level < limitLevel then return limitLevel .. Language[10056] end -- local isOk, tip, btnTxt= this.CheckFightOpenRule(this.curOpenFight) if not isOk then return btnTxt end local offset = 1 offset = mainLevelConfig[this.curOpenFight].Difficulty local newFightId = (tonumber(this.curOpenFight) - offset) / 10 local isBoss = (newFightId % 5) == 0 local str = isBoss and Language[10531] or Language[10620] -- 最后一关 local state = this.GetFightStateById(this.curOpenFight) if state == FIGHT_POINT_STATE.PASS then -- 最后一关 str = Language[10621] end return str else return Language[10619] end end -- 是不是首领关卡 function this.IsFightBoss() local offset = 1 offset = mainLevelConfig[this.curOpenFight].Difficulty local newFightId = (tonumber(this.curOpenFight) - offset) / 10 local isBoss = (newFightId % 5) == 0 return isBoss end -- 某一章节是否通关 function this.IsChapterPass(areaId) -- 当前关卡难度 local curFightDiff = mainLevelConfig[this.curOpenFight].Difficulty -- 当前章节难度 local curChapterId = math.floor(this.curOpenFight / 1000) if curFightDiff > 1 then return true elseif curFightDiff == 1 then return areaId < curChapterId end end --- ===================== 战力相关的 ============================= ---- 请求战斗 function this.ExecuteFightBattle(monsterGroupId, fightId, callBack) Log("---------执行关卡战斗---------"..fightId) NetManager.LevelStarFightDataRequest(monsterGroupId, fightId, function (msg) hadUpdate = false local fightData = BattleManager.GetBattleServerData(msg) UIManager.OpenPanel(UIName.BattlePanel, fightData, BATTLE_TYPE.STORY_FIGHT, callBack, fightId) end) end -- 剧情关卡 function this.ExecuteFightStory(fightId, func) NetManager.LevelStarFightDataRequest("", fightId, function (msg) NetManager.MapFightResultRequest(10000, "", fightId, BATTLE_TYPE.STORY_FIGHT, function (msg) -- this.lastBattleResult.drop = msg.enventDrop if func then func(msg.enventDrop) end end) end) end -- 获取当前章节数 function this.GetCurChapterIndex() local curChapterId = math.floor(this.curOpenFight / 1000) if not FightPointPassManager.isOpenNewChapter then curChapterId = curChapterId-1 if curChapterId == 0 then curChapterId = 1 end end return curChapterId end -- 战斗胜利 function this.OnBattleEnd(battleEnd) if not hadUpdate then hadUpdate = true if battleEnd.result == 0 then Log("关卡战斗失败!") else this.isBattleBack = true --this.RefreshFightId() end end end -- 关卡战斗结束 function this.FightBattleEnd() this.enterFightBattle = false end function this.GetBattleMonsterGroup() return mainLevelConfig[this.curOpenFight].MonsterGroup end --通过难度和章节获取该章节是否通过 function this.GetDifficultAndChapter(Difficult,Chapter) -- 当前关卡难度 local curFightDiff = mainLevelConfig[this.curOpenFight].Difficulty -- 当前章节难度 local curChapterId = math.floor(this.curOpenFight / 1000) local state = 0--1 未开启 2 已开启 3 未通关 4 已通关 if Difficult > curFightDiff then state = 1 elseif Difficult == curFightDiff then if Chapter > curChapterId then state = 1 elseif Chapter == curChapterId then state = 3 elseif Chapter < curChapterId then state = 4 end elseif Difficult < curFightDiff then state = 4 end return state end --获取立绘角色奔跑方向 function this.GetRoleDirection() local data={} if not FightPointPassManager.IsChapterClossState() then data=ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.lastPassFightId) else data=ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.curOpenFight) end return data.RoleDirection end --获取当前关卡位置坐标 function this.GetLevelPointPosition() local data={} if not FightPointPassManager.IsChapterClossState() then data=ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.lastPassFightId) else data=ConfigManager.GetConfigData(ConfigName.MainLevelConfig,this.curOpenFight) end return data.LevelPointPosition end --计算小地图节点坐标 function this.CalculateMapPointPos(parentPoint,sonPoint) local scaleValueX=parentPoint.localScale.x local scaleValueY=parentPoint.localScale.y --Log(tostring(sonPoint[1]*(-1)*scaleValueX).." "..tostring(sonPoint[2]*(-1)*scaleValueY)) local x= math.floor(sonPoint[1]*(-1)*scaleValueX) local y= math.floor(sonPoint[2]*(-1)*scaleValueY) return x,y end -- 活动期间关卡的总奖励预览 function this.GetExtralReward() local fightRewardId = 0 local openNum = 0 local rewardShow = {} local rewardGroupId = {} if mainLevelConfig[this.curOpenFight] then fightRewardId = mainLevelConfig[this.curOpenFight].RandomReward[1] end local ids = ActivityGiftManager.GetExpertActiveisAllOpenIds() --local ids = {30, 31} if #ids > 0 then for i = 1, #ids do for k, v in ConfigPairs(Huo_Dong_Diao_Luo) do if v.RewardGroup[1] == fightRewardId and v.ActivityId == ids[i] then rewardGroupId[#rewardGroupId + 1] = v.ActivityReward[1] end end end for i = 1, #rewardGroupId do Log("活动组ID ----- " .. rewardGroupId[i]) end for i = 1, #rewardGroupId do --Log("rewardGroupId ==== " .. rewardGroupId[i]) local shows = rewardGroupConfig[rewardGroupId[i]].ShowItem if shows then for j = 1, #shows do rewardShow[#rewardShow + 1] = shows[j] end else Log(string.format("奖励组Id%s对应的前端显示字段ShowItem为空", rewardGroupId[i])) end end --Log("活动奖励数量 === " .. #rewardShow) return 1, rewardShow else return openNum, nil end end function this.SetBoxState(state) this.boxState = state end function this.GetBoxState() return this.boxState end -- 是否在关卡里屏蔽暂停按钮 function this.GetStopBtnState() local isShow = true if not this.enterFightBattle then return true else if this.curOpenFight == 1011 or this.curOpenFight == 1021 or this.curOpenFight == 1031 or this.curOpenFight == 1041 or this.curOpenFight == 1051 then isShow = false else isShow = true end end return isShow end -- 用于比较副本id的大小 -- > 0 cId1 比 cId2 大 -- = 0 相同关卡 -- < 0 cId1 比 cId2 小 function this.CarbonIdCompare(cId1, cId2) local len1 = string.len(cId1) local diff1 = tonumber(string.sub(cId1, len1, len1)) local id1 = tonumber(string.sub(cId1, 1, len1-1)) local len2 = string.len(cId2) local diff2 = tonumber(string.sub(cId2, len2, len2)) local id2 = tonumber(string.sub(cId2, 1, len2-1)) if diff1 == diff2 then return id1 - id2 end return diff1 - diff2 end -- 获取当前需要显示的描述文字 function this.GetCurLevelTips() --LogError("GetCurLevelTips") for id, config in ConfigPairs(LevelTipsConfig) do --LogError(id) if config.Type == 1 then if this.CarbonIdCompare(this.GetCurFightId(), config.Parameter) <= 0 then return config.Desc -- string.format("通关%s,%s", mainLevelConfig[config.Parameter].Name, config.Desc) end elseif config.Type == 2 then if PlayerManager.level < config.Parameter then return config.Desc -- string.format("等级达%s,%s", config.Parameter, config.Desc) end end end end return this