miduo_client/Assets/ManagedResources/~Lua/Modules/Mission/MissionManager.lua

544 lines
18 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.

--任务系统,包括事件系统的通用处理
require("Modules/Map/TrialMiniGame/TrialMiniGameManager")
MissionManager = {}
local this = MissionManager
local EventPointConfig = ConfigManager.GetConfig(ConfigName.EventPointConfig)
local carBonMissionData = ConfigManager.GetConfig(ConfigName.ChallengeMissionConfig)
local MapPointConfig = ConfigManager.GetConfig(ConfigName.MapPointConfig)
-- 精英怪panel
local monsterPanel = require("Modules/EliteMonster/MonsterShowPanel")
this.MissionState = {} -- 已经开启的任务
this.MainMission = {} --正在进行的主线任务
this.CanGoNext = false
-- 副本任务
this.carBonMission = {}
-- 副本任务已经计时的时间
this.missionTime = 0
--
this.curStepInfo = {}
function this.Initialize()
TrialMiniGameManager.Init()
end
function this.InitMissionInfo(msg)
this.ParseMissionState(msg.missions, true)
end
-- 任务处理系统 --
--解析并更新任务数据state字段以字符串格式传入以id为类型分别判定解析以便适应不同的state格式
function this.ParseMissionState(missions, isInit)
if not missions then Log(Language[11364]) return end
this.missionShow = {}
if missions.itemId == 0 then
Log(Language[11365])
end
local missionItem = missions
Log(Language[11366].. missionItem.itemId)
--Log("进图初始化副本任务IDState "..missionItem.state)
Log(Language[11367]..missionItem.missionStep)
--Log("进图初始化副本任务ID完成时间" .. missionItem.time)
--Log("missionItem.isOpen ".. string.format("%s", missionItem.isOpen))
local id = missionItem.itemId -- 任务索引值
local curMission = {}
curMission.step = missionItem.missionStep
curMission.id = id
curMission.state = missionItem.state
curMission.doneTime = missionItem.time > 0 and missionItem.time or 0
if missionItem.deadTimes then
CarbonManager.RoleDeadTimes = missionItem.deadTimes
end
-- 副本任务
this.carBonMission = curMission
local refreshType = 0 -- 0 不抛刷新事件 1抛新增任务事件 2抛任务状态刷新事件
if not isInit then
if not this.MissionState[id] then
refreshType = 1
else
refreshType = 2
end
end
if id == 1 then
elseif id == 2 then --格式 pos#pointId|pos#pointId|...
local state = {}
local ss = string.split(missionItem.state, "|")
for i=1, #ss do
local ss2 = string.split(ss[i], "#")
table.insert(state, {
pos = tonumber(ss2[1]),
pointId = tonumber(ss2[2]),
})
end
curMission.state = state
if refreshType == 1 then
for i=1, #state do
Game.GlobalEvent:DispatchEvent(GameEvent.Map.PointAdd, state[i].pos, state[i].pointId)
end
end
end
if refreshType == 1 then
Log(Language[11368])
Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnMissionAdd, curMission)
elseif refreshType == 2 then
Log(Language[11369])
Game.GlobalEvent:DispatchEvent(GameEvent.Mission.OnMissionChange, curMission)
end
if this.MissionState[id] then
this.MissionState[id].step = curMission.step
else
this.MissionState[id] = curMission
end
end
--手动往下推一步任务
function this.SetMissionGoNext()
local mission = {}
mission.itemId = this.carBonMission.id
mission.state = this.carBonMission.state
mission.missionStep = this.carBonMission.step + 1
mission.time = -1
this.ParseMissionState(mission, false)
end
-- 判断副本任务是否完成
function this.MainMissionIsDone(missionId)
if CarbonManager.difficulty == CARBON_TYPE.ENDLESS or CarbonManager.difficulty ==CARBON_TYPE.TRIAL then
return false
end
if missionId then
local isDone = false
local contents = string.split(carBonMissionData[missionId].Content, "#")
local str = contents[this.carBonMission.step + 1]
if str ~= "" and str ~= nil then
isDone = false
else
isDone = true
end
return isDone
end
end
-- 副本任务所有步骤状态,显示使用
function this.GetMissionState()
local missionInfo = {}
local curStep = this.carBonMission.step + 1
local missionId = this.carBonMission.id
local childStart = 0
local childEnd = 0
local childStep = carBonMissionData[missionId].ChildMission
local MissionConText = string.split(carBonMissionData[missionId].Content, "#")
for i = 1, #MissionConText do
local context = MissionConText[i]
if childStep[i] then
childStart = childStep[i][1]
childEnd = childStep[i][2]
end
local diff = childEnd - childStart + 1
if i > childStart and i <= childEnd then
else
-- 需要替换的文字内容
local step = curStep - childStart <= 0 and 0 or curStep - childStart
step = step >= diff and diff or step
local missionStr = string.format(context, step)
--当前的任务步骤不在子任务范围内
local b = false
if i < childStart or i > childEnd then
b = i < curStep
else -- 重新定义任务完成判断
b = curStep > childEnd
end
local t = {}
t.missionStr = missionStr
t.isDone = b
missionInfo[#missionInfo + 1] = t
end
end
-- 已经完成步骤
local doneStep = {}
-- 未完成步骤
local doingStep = {}
for i = 1, #missionInfo do
if missionInfo[i].isDone then
doneStep[#doneStep + 1] = missionInfo[i]
else
doingStep[#doingStep + 1] = missionInfo[i]
end
end
local info = {}
if #doingStep > 0 then
for i = 1, #doingStep do
table.insert(info, doingStep[i])
end
end
if #doneStep > 0 then
for i = 1, #doneStep do
table.insert(info, doneStep[i])
end
end
return info
end
function this.CurStepInfo()
local curMission = {}
local mission = this.carBonMission
local contents = string.split(carBonMissionData[mission.id].Content, "#")
local str = contents[mission.step + 1]
local childStart = 0
local childEnd = 0
local curStep = mission.step + 1
local childStep = carBonMissionData[mission.id].ChildMission
if childStep[curStep] then
childStart = childStep[curStep][1]
childEnd = childStep[curStep][2]
end
local diff = childEnd - childStart + 1
local step = curStep - childStart <= 0 and 0 or curStep - childStart
step = step >= diff and diff or step
if str ~= "" and str then -- 任务尚未完成
local missionStr = string.format(str, step)
curMission.missionStr = missionStr
curMission.isDone = false
else -- 任务已经完成
curMission.missionStr = Language[11315]
curMission.isDone = true
end
return curMission
end
-- 任务提示文字
function this.ShowDoneMissionStep()
local str = ""
local contents = string.split(carBonMissionData[this.carBonMission.id].Content, "#")
local missionStr = contents[this.carBonMission.step]
if not missionStr or missionStr == "" then return end
local lastStep = this.carBonMission.step
local childStart = 0
local childEnd = 0
local childStep = carBonMissionData[this.carBonMission.id].ChildMission
if childStep[lastStep] then
childStart = childStep[lastStep][1]
childEnd = childStep[lastStep][2]
end
-- 在子任务之外直接弹
if lastStep > childEnd or lastStep < childStart then
str = missionStr
UIManager.OpenPanel(UIName.CurlingTipPanel, str)
else
if lastStep == childEnd then
str = string.format(missionStr, childEnd - childStart + 1)
UIManager.OpenPanel(UIName.CurlingTipPanel, str)
end
end
end
--触发EventPointConfig表事件
-- 事件处理系统--
-- 通过事件id触发类型 showType选择显示面板面板的具体内容由 options决定
local showString = {
[1] = Language[11370],
[2] = Language[11371],
[3] = Language[11372],
[4] = Language[11373],
[6] = Language[11374],
}
-- 不做处理
local noHandle = function(showType, eventId, showValues, options)
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
end
-- 地图对话界面
local mapDialoguePanel = function(showType, eventId, showValues, options)
-- if not UIManager.IsOpen(UIName.MapOptionPanel) then
-- UIManager.OpenPanel(UIName.MapOptionPanel, showType, eventId, showValues, options)
-- LogPink("MissionManager showType"..showType.." eventId"..eventId)
-- end
if eventId == 2000001 or eventId == 2000002 then
-- 打开general界面
UIManager.OpenPanel(UIName.GeneralPopup,GENERAL_POPUP_TYPE.TrialToNextFloor,eventId)
elseif eventId == 2000005 then
-- 直接加buff走人
NetManager.EventUpdateRequest(2000005, 2000011, function ()
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
Game.GlobalEvent:DispatchEvent(GameEvent.Map.ProgressChange, 1, 2000011)
end)
end
end
-- 进度条界面
local processPanel = function(showType, eventId, showValues, options)
if not UIManager.IsOpen(UIName.ProgressPanel) then
UIManager.OpenPanel(UIName.ProgressPanel, showValues)
end
end
-- 直接战斗
local directFight = function(showType, eventId, showValues, options)
local monsterGroupId = options[1]
--获取自动战斗
local t=(PlayerPrefs.HasKey(PlayerManager.uid.."GeneralPopup_TrialSettingBtn"..1)
and PlayerPrefs.GetInt(PlayerManager.uid.."GeneralPopup_TrialSettingBtn"..1)==1) and 1 or 0
if t==0 then --CarbonManager.isPassFight
Game.GlobalEvent:DispatchEvent(GameEvent.Map.ShowEnemyInfo,monsterGroupId,eventId,showValues)
else
for i, v in ipairs(MapManager.trialHeroInfo) do
if MapTrialManager.selectHeroDid==v.heroId then
if v.heroHp<=0 then
PopupTipPanel.ShowTip(Language[11247])
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
return
end
end
end
--先保存编队
local curFormation = FormationManager.GetFormationByID(FormationTypeDef.FORMATION_DREAMLAND)
local choosedList={}
table.insert(choosedList, {heroId = MapTrialManager.selectHeroDid, position=2})
FormationManager.RefreshFormation(FormationTypeDef.FORMATION_DREAMLAND,choosedList,
FormationManager.formationList[FormationTypeDef.FORMATION_DREAMLAND].teamPokemonInfos)
NetManager.QuickFightRequest(function(msg)
CarbonManager.InitQuickFightData(monsterGroupId, eventId, msg)
--更新精气值
MapTrialManager.UpdatePowerValue(msg.essenceValue)
--更新英雄HP
MapTrialManager.SetHeroHp(msg.remainHpList,MapTrialManager.selectHeroDid)
--召唤Boss
if CarbonManager.difficulty == CARBON_TYPE.TRIAL and MapTrialManager.powerValue >= 100 then
MapTrialManager.isHaveBoss = true
MapTrialManager.UpdatePowerValue(0)
end
end)
end
end
-- 起名字界面
local createNamePanel = function(showType, eventId, showValues, options)
UIManager.OpenPanel(UIName.CreateNamePopup, showType, eventId, showValues, options)
end
-- 云游商店
local walkingShop = function(showType, eventId, showValues, options)
-- 重新获取商店数据
ShopManager.RequestAllShopData(function()
Log("***************")
local curTimeStamp = GetTimeStamp()
local shopData = ShopManager.GetShopDataByType(SHOP_TYPE.ROAM_SHOP)
Log(Language[10686]..curTimeStamp..Language[10687]..(shopData.startTime/1000))
Log("***************")
UIManager.OpenPanel(UIName.MapShopPanel, SHOP_TYPE.ROAM_SHOP)
end)
end
-- 精英怪
local elitePanel = function(showType, eventId, showValues, options)
-- 如果未拥有精英怪则触发
local isShowWarning = false
if not EliteMonsterManager.HasEliteMonster() then
-- 触发精英怪
local monsterGroupId = options[1]
local GameSetting = ConfigManager.GetConfig(ConfigName.GameSetting)
local endTime = GetTimeStamp() + GameSetting[1].IncidentalBossSave
-- 保存精英怪数据
EliteMonsterManager.SetEliteData(monsterGroupId, endTime)
isShowWarning = true
end
-- 打开精英怪界面
UIManager.OpenPanel(UIName.EliteMonsterPanel, 2, isShowWarning)
end
-- 试炼商店
local trailMapShop = function(showType, eventId, showValues, options)
-- 重新获取商店数据
ShopManager.RequestAllShopData(function()
UIManager.OpenPanel(UIName.MapShopPanel, SHOP_TYPE.TRIAL_SHOP, eventId, options)
end)
end
-- 试炼Boss界面
local trialBossPanel = function(showType, eventId, showValues, options)
LogRed(Language[11375])
-- 显示类型16的ShowValue字段都是怪物组Id
local fightFunc = function()
OptionBehaviourManager.JumpEventPoint(eventId, options[1], monsterPanel)
end
local closeFunc = function()
OptionBehaviourManager.JumpEventPoint(eventId, options[2], monsterPanel)
end
UIManager.OpenPanel(UIName.MonsterShowPanel, tonumber(showValues[1]), fightFunc, closeFunc, true, 2)
end
-- 试炼Buff界面
local trailBuffPanel = function(showType, eventId, showValues, options)
if not UIManager.IsOpen(UIName.BuffOptionPanel) then
UIManager.OpenPanel(UIName.BuffOptionPanel, eventId)
end
end
-- 无尽商店
local EndLessMapShop = function(showType, eventId, showValues, options)
-- 重新获取商店数据
ShopManager.RequestAllShopData(function()
UIManager.OpenPanel(UIName.MapShopPanel, SHOP_TYPE.ENDLESS_SHOP, eventId, options)
end)
end
-- 注册方法
local funcList = {
[1] = noHandle,
[2] = noHandle,
[3] = mapDialoguePanel,
[4] = mapDialoguePanel,
[5] = processPanel,
[6] = directFight,
[7] = noHandle,
[8] = noHandle,
[9] = noHandle,
[10] = createNamePanel,
[13] = walkingShop,
[14] = elitePanel,
[15] = trailMapShop,
[16] = trialBossPanel,
[17] = trailBuffPanel,
[18] = EndLessMapShop,
}
--事件点触发
function this.EventPointTrigger(eventId)
MyPCall(function ()
--Log("EventPointTrigger中得到的事件ID " .. eventId)
if eventId == 0 or eventId < 0 then
return
end
if not EventPointConfig[eventId].Id then
Log(Language[11376])
return
end
local showType = EventPointConfig[eventId].ShowType
local options = EventPointConfig[eventId].Option
local showValues = string.split(EventPointConfig[eventId].ShowValues, "|")
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTrigger, showType, eventId, showValues, options)
-- 根据不同的显示类型执行方法
if funcList[showType] then funcList[showType](showType, eventId, showValues, options)
Game.GlobalEvent:DispatchEvent(GameEvent.Guide.EventTriggered, eventId)
end
end)
end
function this.GameDoneFunc()
if TrialMiniGameManager.IsGameDone() then
Game.GlobalEvent:DispatchEvent(GameEvent.Map.PointRemove, MapManager.curTriggerPos)--删除宝箱点
end
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
end
--注册事件
local funcList2={
[7]=function() --踩宝箱只发0
NetManager.GetTrialBoxRewardRequest(0,function(msg)
Game.GlobalEvent:DispatchEvent(GameEvent.Map.PointRemove, MapManager.curTriggerPos)--删除宝箱点
-- UIManager.OpenPanel(UIName.RewardItemPopup,msg.boxDrop,1,function()
-- Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
-- end)
local data = TrialMiniGameManager.IdToNameIconNum(msg.boxDrop.itemlist[1].itemId,msg.boxDrop.itemlist[1].itemNum)
PopupTipPanel.ShowColorTip(data[1],data[2],data[3])
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
end)
end,
[13] = function() -- 试炼副本答题游戏1
TrialMiniGameManager.StartGame(13, this.GameDoneFunc)
end,
[14] = function() -- 试炼副本答题游戏2
TrialMiniGameManager.StartGame(14, this.GameDoneFunc)
end,
[15] = function() -- 试炼副本答题游戏3
TrialMiniGameManager.StartGame(15, this.GameDoneFunc)
end,
[16] = function() -- 试炼副本roll游戏1
TrialMiniGameManager.StartGame(16, this.GameDoneFunc)
end,
[17] = function() -- 试炼副本roll游戏2
TrialMiniGameManager.StartGame(17, this.GameDoneFunc)
end,
[18] = function() -- 试炼副本roll游戏3
TrialMiniGameManager.StartGame(18, this.GameDoneFunc)
end,
}
--地图点触发
function this.MapPointTrigger(style)
local i=0
for k, v in pairs(MapManager.mapPointList) do
if MapPointConfig[v] and MapPointConfig[v].Style==style then
i =style
end
end
LogPink(i)
if funcList2[i] then
funcList2[i]()
-- Game.GlobalEvent:DispatchEvent(GameEvent.Guide.EventTriggered, eventId)
end
end
--设置自动拾取道具 获取全部奖励
function this.GetAllRewardTrigger()
--若存在该设置参数并为已勾选状态 =1 否则=0
local var=PlayerManager.uid.."GeneralPopup_TrialSettingBtn"..3
local t=(PlayerPrefs.HasKey(var)
and PlayerPrefs.GetInt(var)==1) and 1 or 0
if t==0 then return end
NetManager.GetTrialBoxRewardRequest(t,function(msg)
-- UIManager.OpenPanel(UIName.RewardItemPopup,msg.boxDrop,1,function()
-- Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
-- end)
Timer.New(function ()
for key, value in pairs(MapManager.mapPointList) do
-- LogPink("["..key.."] "..value)
if value==2000000 then
Game.GlobalEvent:DispatchEvent(GameEvent.Map.PointRemove,key)--删除全部宝箱点
end
end
UIManager.OpenPanel(UIName.RewardItemPopup,msg.boxDrop,1,function()
Game.GlobalEvent:DispatchEvent(GameEvent.Event.PointTriggerEnd)
end)
end , 3):Start()
end)
end
return this