268 lines
7.4 KiB
Lua
268 lines
7.4 KiB
Lua
local TutorialConst = require "app/module/tutorial/tutorial_const"
|
|
|
|
local TutorialManager = class("TutorialManager", BaseModule)
|
|
|
|
function TutorialManager:checkAndPlayForceTutorial()
|
|
if DataManager.TutorialData:getIsInTutorial() then
|
|
return
|
|
end
|
|
local haveTutorial = DataManager.TutorialData:getIsHaveTutorial()
|
|
if haveTutorial then
|
|
self:showTutorial()
|
|
return true
|
|
else
|
|
self:stopTutorial()
|
|
end
|
|
end
|
|
|
|
-- 每一步引导都和服务器进行一次通信
|
|
function TutorialManager:sendTutorialId(id, callback)
|
|
local args = {
|
|
id = id
|
|
}
|
|
|
|
self.sendTutorialIdCallback = callback
|
|
|
|
self:sendMessage(ProtoMsgType.FromMsgEnum.GuideFundMarkReq, args, {}, self.sendTutorialIdFinish)
|
|
end
|
|
|
|
function TutorialManager:sendTutorialIdFinish(result)
|
|
if result.err_code == GConst.ERROR_STR.SUCCESS then
|
|
if result.reqData.id then
|
|
BIReport:postTutorialStep(result.reqData.id)
|
|
end
|
|
|
|
if self.sendTutorialIdCallback then
|
|
self.sendTutorialIdCallback(true)
|
|
end
|
|
else
|
|
if self.sendTutorialIdCallback then
|
|
self.sendTutorialIdCallback(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 显示引导
|
|
function TutorialManager:showTutorial()
|
|
if self.tutorialFinishListener == nil then
|
|
self.tutorialFinishListener = require "app/module/tutorial/tutorial_finish_listener"
|
|
end
|
|
self.tutorialFinishListener:init()
|
|
|
|
if self.tutorialAction == nil then
|
|
self.tutorialAction = require "app/module/tutorial/tutorial_action"
|
|
end
|
|
self.tutorialAction:init()
|
|
|
|
self:removeAllEventListeners()
|
|
DataManager.TutorialData:setInTutorial(true)
|
|
UIManager:showTutorial()
|
|
if self.tutorialUIComp then
|
|
self.tutorialUIComp:setVisible(true)
|
|
self:startTutorial()
|
|
else
|
|
UIManager:getTutorial(function(tutorialObj)
|
|
self.tutorialUIComp = tutorialObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.TUTORIAL_UI)
|
|
self:startTutorial()
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- 开始引导
|
|
function TutorialManager:startTutorial()
|
|
local tutorialId = DataManager.TutorialData:getTutorialId()
|
|
-- 上报引导每一步
|
|
-- BIReport:postTutorialStep(tutorialId)
|
|
Logger.log("开始引导:%s", tutorialId)
|
|
|
|
DataManager.TutorialData:markFuncTutorialFinish(tutorialId)
|
|
|
|
-- 如果这一步引导已经完成了就进入下一步,没有完成则如果有监听就添加监听
|
|
local over = self.tutorialFinishListener:checkAndAddListener(tutorialId)
|
|
if over then
|
|
self:finishAndNextTutorial(tutorialId)
|
|
else
|
|
-- 开始当前步骤的引导
|
|
self.tutorialUIComp:onTutorialStart()
|
|
self.tutorialAction:doTutorial(tutorialId)
|
|
end
|
|
end
|
|
|
|
-- 结束引导
|
|
function TutorialManager:stopTutorial()
|
|
if DataManager.TutorialData then
|
|
Logger.log("停止引导:%s", DataManager.TutorialData:getTutorialId())
|
|
end
|
|
if self.tutorialFinishListener then
|
|
self.tutorialFinishListener:clear()
|
|
end
|
|
|
|
if self.tutorialAction then
|
|
self.tutorialAction:clear()
|
|
end
|
|
|
|
self:removeAllEventListeners()
|
|
self:unscheduleAll()
|
|
if DataManager.TutorialData then
|
|
DataManager.TutorialData:stopTutorial()
|
|
end
|
|
if self.tutorialUIComp then
|
|
self.tutorialUIComp:onTutorialStop()
|
|
end
|
|
UIManager:hideTutorial()
|
|
|
|
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.TUTORIAL_TASK_STOP)
|
|
end
|
|
|
|
-- 完成当前步并进入下一步
|
|
function TutorialManager:finishAndNextTutorial(tutorialId)
|
|
-- 屏蔽点击
|
|
self.tutorialUIComp:setBlockTouchEnabled(true)
|
|
self.tutorialUIComp:unregisterClickBtn()
|
|
-- 移除所有计时器
|
|
self.tutorialUIComp:clearScheduler()
|
|
-- 移除所有的监听
|
|
self.tutorialFinishListener:clear()
|
|
-- 此步引导完成时需要处理的东西
|
|
self.tutorialAction:doStepOver(tutorialId)
|
|
|
|
local haveNext = DataManager.TutorialData:nextTutorial()
|
|
if haveNext then
|
|
local delay = DataManager.TutorialData:getDelayStartTime()
|
|
self:performWithDelayGlobal(function()
|
|
self:startTutorial()
|
|
end, delay)
|
|
else
|
|
self:performWithDelayGlobal(function()
|
|
self:stopTutorial()
|
|
end, 0)
|
|
end
|
|
end
|
|
|
|
-- 检查完成条件并进入下一步
|
|
function TutorialManager:checkAndNextTutorial(tutorialId)
|
|
local currTutorialId = DataManager.TutorialData:getTutorialId()
|
|
if currTutorialId ~= tutorialId then
|
|
return
|
|
end
|
|
|
|
-- 没有完成条件就直接完成,有完成条件就等待完成条件通过再完成
|
|
if not self.tutorialFinishListener:getIsHaveListener(tutorialId) then
|
|
self:finishAndNextTutorial(currTutorialId)
|
|
end
|
|
end
|
|
|
|
-- 添加点击屏幕的监听
|
|
function TutorialManager:registerClickScreenListener(callback)
|
|
self.tutorialUIComp:registerClickScreenListener(callback)
|
|
end
|
|
|
|
-- 添加点击指定组件的监听
|
|
function TutorialManager:registerClickBtnListener(callback, targetName, clickType)
|
|
self.tutorialUIComp:registerClickBtnListener(callback, targetName, clickType)
|
|
end
|
|
|
|
-- 显示对话
|
|
function TutorialManager:showTalk(callback)
|
|
self.tutorialUIComp:showTalk(callback)
|
|
end
|
|
|
|
-- 设置引导时的触摸是否屏蔽
|
|
function TutorialManager:setBlockTouchEnabled(enabled)
|
|
self.tutorialUIComp:setBlockTouchEnabled(enabled)
|
|
end
|
|
|
|
function TutorialManager:getBlockTouchEnabled()
|
|
if self.tutorialUIComp == nil then
|
|
return false
|
|
end
|
|
return self.tutorialUIComp:getBlockTouchEnabled()
|
|
end
|
|
|
|
-- 检查功能引导
|
|
function TutorialManager:checkFuncTutorial(id, onlyCheck)
|
|
if DataManager.TutorialData:getIsInTutorial() or GFunc.isShenhe() then
|
|
return false
|
|
end
|
|
if CS.BF.BFMain.IsShenhe and not DataManager.TutorialData:getTutorialIdMap(id) then
|
|
return false
|
|
end
|
|
|
|
local tutorialFuncStartInfo = ConfigManager:getConfig("tutorial_start")[id]
|
|
if tutorialFuncStartInfo == nil then
|
|
return false
|
|
end
|
|
local tutorialInfo = ConfigManager:getConfig("tutorial")[tutorialFuncStartInfo.start_id]
|
|
if tutorialInfo == nil then
|
|
return false
|
|
end
|
|
if tutorialFuncStartInfo.uires_path == nil or tutorialFuncStartInfo.uires_path == "" then -- 没有绑定界面的就需要额外检查一下开启条件
|
|
return false
|
|
end
|
|
|
|
local haveTutorial = DataManager.TutorialData:getIsHaveFuncTutorial(tutorialFuncStartInfo.start_id, tutorialInfo, tutorialFuncStartInfo)
|
|
if onlyCheck then
|
|
return haveTutorial
|
|
end
|
|
|
|
if haveTutorial then
|
|
self:showFuncTutorial(DataManager.TutorialData:getTutorialId())
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function TutorialManager:showFuncTutorial(id)
|
|
self:sendTutorialId(id, function(success)
|
|
if success then
|
|
if not DataManager.TutorialData:getIsFuncTutorialFinished(id) then
|
|
DataManager.TutorialData:markFuncTutorialFinish(id)
|
|
local uires = DataManager.TutorialData:getTutorialId2UIPath(id)
|
|
Logger.logHighlight(uires)
|
|
if uires == nil or uires == "" then
|
|
self:showTutorial()
|
|
else
|
|
local uiList = UIManager:getUIList()
|
|
for k, v in ipairs(uiList) do
|
|
if v:getPrefabPath() == uires then
|
|
return self:showTutorial()
|
|
end
|
|
end
|
|
self:addEventListener(EventManager.CUSTOM_EVENT.UI_SHOW_COMPLETE, function(uiIndex)
|
|
local uiObj = UIManager:getUIByIndex(uiIndex)
|
|
if uiObj:getPrefabPath() == uires then
|
|
self:removeEventListener(EventManager.CUSTOM_EVENT.UI_SHOW_COMPLETE)
|
|
self:showTutorial()
|
|
end
|
|
end)
|
|
end
|
|
else
|
|
self:stopTutorial()
|
|
end
|
|
else
|
|
DataManager.TutorialData:markFuncTutorialFinish(id)
|
|
self:stopTutorial()
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- gm用,跳过当前正在进行的引导
|
|
function TutorialManager:gmSkipTutorial()
|
|
if Platform:getIsPublishChannel() then
|
|
return
|
|
end
|
|
|
|
if not DataManager.TutorialData:getIsInTutorial() then
|
|
return
|
|
end
|
|
|
|
-- 功能引导则直接退出即可
|
|
if DataManager.TutorialData:getIsFuncTutorial() then
|
|
return self:stopTutorial()
|
|
end
|
|
|
|
-- 强制引导则先跟服务器发送消息再退出
|
|
self:stopTutorial()
|
|
end
|
|
|
|
return TutorialManager |