miduo_client/Assets/ManagedResources/~Lua/Modules/Fight/FightPointPassManager.lua

713 lines
25 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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