forked from endernon/PGRData
510 lines
No EOL
19 KiB
Lua
510 lines
No EOL
19 KiB
Lua
local XClickClearGameRewardData = require("XEntity/XClickClearGame/XClickClearGameRewardData")
|
|
|
|
XClickClearGameManagerCreator = function()
|
|
local tableInsert = table.insert
|
|
|
|
local XClickClearGameManager = {}
|
|
|
|
XClickClearGameManager.GeneralPanelStates = {
|
|
Default = 1,
|
|
Clearance = 2,
|
|
Failure = 3,
|
|
}
|
|
|
|
XClickClearGameManager.GameState = {
|
|
Default = 1, -- 默认
|
|
InitComplete = 2, -- 初始化完成
|
|
Playing = 3, -- 游戏中
|
|
Pause = 4, -- 暂停
|
|
Account = 5 -- 结算
|
|
}
|
|
|
|
XClickClearGameManager.GameDifficultys = {
|
|
Simple = 1,
|
|
Complex = 2,
|
|
Difficult = 3,
|
|
Hell = 4,
|
|
}
|
|
|
|
local GameInfo = {
|
|
CurGameState = XClickClearGameManager.GameState.Default, -- 游戏当前状态
|
|
HeadNormalType = 0, -- 普通头像类型
|
|
HeadNormalTargetCount = 0, -- 普通头像目标数量
|
|
HeadNormalCurCount = 0, -- 普通头像当前找到数量
|
|
HeadNormalDesc = "", -- 普通头像条件文字
|
|
HeadSpecialType = 0, -- 特殊头像类型
|
|
HeadSpecialTargetCount = 0, -- 特殊头像目标数量
|
|
HeadSpecialCurCount = 0, -- 特殊头像当前找到数量
|
|
HeadSpecialDesc = "", -- 特殊头像条件文字
|
|
LimitTime = 0, -- 本关时间限制
|
|
RemainTime = 0, -- 游戏剩余时间
|
|
WrongCostTime = 0, -- 点错扣除的时间
|
|
HeadInfoPageList = {}, -- 头像页信息列表
|
|
HeadInfoPageCount = 0, -- 头像页页数
|
|
CurrentHeadPageIndex = 0, -- 当前头像页序号
|
|
CurrentHeadRealPageIndex = 1, -- 当前头像页真实列表序号(数组下标)
|
|
UseTime = 0, -- 结算用时
|
|
IsNewRecord = false -- 是否是新记录
|
|
}
|
|
|
|
local PassTimeRecords = {} -- 保存的通关时间记录
|
|
local ActivityData = {}
|
|
local ActivityId = 0
|
|
local StartTime = 0
|
|
local TakedRewardIds = {}
|
|
local RewardDataList = {} -- 奖励数据列表
|
|
local IsTakeDifficultyBtnRedPointTable = {} -- 难度按钮红点是否被点击表
|
|
|
|
local CurrentGameDifficulty = XClickClearGameManager.GameDifficultys.Simple -- 当前难度
|
|
|
|
local CLICKCLEARGAME_PROTO = {
|
|
ClickClearGameStageRecordRequest = "ClickClearGameStageRecordRequest",
|
|
ClickClearGameStageGetRewardRequest = "ClickClearGameStageGetRewardRequest",
|
|
}
|
|
|
|
function XClickClearGameManager.Init()
|
|
XClickClearGameManager.InitRewardDataList()
|
|
end
|
|
|
|
function XClickClearGameManager.HandlerClickClearData(data)
|
|
local ActivityDatas = data.Activities
|
|
ActivityData = ActivityDatas[1]
|
|
if not ActivityData then
|
|
return
|
|
end
|
|
|
|
ActivityId = ActivityData.Id
|
|
StartTime = ActivityData.StartTime
|
|
PassTimeRecords = ActivityData.BestRecords
|
|
TakedRewardIds = ActivityData.RewardIds
|
|
for _,v in pairs(RewardDataList) do
|
|
local gameStageId = v:GetGameStageId()
|
|
if TakedRewardIds[gameStageId] then
|
|
v:SetIsTaked(true)
|
|
else
|
|
v:SetIsTaked(false)
|
|
end
|
|
|
|
if PassTimeRecords[gameStageId] and PassTimeRecords[gameStageId] > 0 then
|
|
v:SetCanTake(true)
|
|
else
|
|
v:SetCanTake(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
function XClickClearGameManager.GetRemainDaysStr()
|
|
local gameTemplates = XClickClearGameConfigs.GetGameTemplates()
|
|
if not gameTemplates or #gameTemplates <= 0 then
|
|
return false
|
|
end
|
|
|
|
local gameTemplate = gameTemplates[1]
|
|
local nowTimeStamp = XTime.GetServerNowTimestamp()
|
|
local startTimeStamp = XTime.ParseToTimestamp(gameTemplate.StartTimeStr)
|
|
local endTimeStamp = XTime.ParseToTimestamp(gameTemplate.EndTimeStr)
|
|
if nowTimeStamp < startTimeStamp or nowTimeStamp > endTimeStamp then
|
|
return false
|
|
end
|
|
|
|
local differenceTimeStamp = endTimeStamp - nowTimeStamp
|
|
local remainDaysStr = XUiHelper.GetTime(differenceTimeStamp, XUiHelper.TimeFormatType.ACTIVITY)
|
|
return true, remainDaysStr
|
|
end
|
|
|
|
function XClickClearGameManager.CheckTabBtnByIndex(index)
|
|
local gameStageTemplate = XClickClearGameConfigs.GetGameStageTemplateById(index)
|
|
if not gameStageTemplate.UnlockCondition or gameStageTemplate.UnlockCondition == 0 then
|
|
return true
|
|
end
|
|
|
|
return XConditionManager.CheckCondition(gameStageTemplate.UnlockCondition)
|
|
end
|
|
|
|
function XClickClearGameManager.CheckTabBtnByLastDifficult(index)
|
|
if index == 1 then
|
|
return true
|
|
end
|
|
|
|
local lastIndex = index - 1
|
|
if PassTimeRecords[lastIndex] and PassTimeRecords[lastIndex] > 0 then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function XClickClearGameManager.GetCondetionDeseByIndex(index)
|
|
local gameStageTemplate = XClickClearGameConfigs.GetGameStageTemplateById(index)
|
|
if not gameStageTemplate.UnlockCondition or gameStageTemplate.UnlockCondition == 0 then
|
|
return ""
|
|
end
|
|
|
|
return XConditionManager.GetConditionDescById(gameStageTemplate.UnlockCondition)
|
|
end
|
|
|
|
function XClickClearGameManager.CheckPass(difficulty)
|
|
if PassTimeRecords[difficulty] and PassTimeRecords[difficulty] ~= 0 then
|
|
return true, PassTimeRecords[difficulty]/1000
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function XClickClearGameManager.GetStageTagNameAndNameEnById(id)
|
|
local gameStageTemplate = XClickClearGameConfigs.GetGameStageTemplateById(id)
|
|
if not gameStageTemplate then
|
|
return nil
|
|
end
|
|
|
|
return gameStageTemplate.Name, gameStageTemplate.NameEn
|
|
end
|
|
|
|
function XClickClearGameManager.GetGameInfo() -- 获取游戏信息
|
|
return GameInfo
|
|
end
|
|
|
|
function XClickClearGameManager.GetHelpId()
|
|
local gameTemplates = XClickClearGameConfigs.GetGameTemplates()
|
|
if not gameTemplates or #gameTemplates <= 0 then
|
|
return 0
|
|
end
|
|
|
|
local gameTemplate = gameTemplates[1]
|
|
return gameTemplate.HelpId
|
|
end
|
|
|
|
function XClickClearGameManager.GetCurGameDifficulty()
|
|
return CurrentGameDifficulty
|
|
end
|
|
|
|
function XClickClearGameManager.SetCurGameDifficulty(difficulty)
|
|
CurrentGameDifficulty = difficulty
|
|
end
|
|
|
|
function XClickClearGameManager.ResetGame()
|
|
XClickClearGameManager.ResetData()
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_RESET)
|
|
end
|
|
|
|
function XClickClearGameManager.ResetData()
|
|
GameInfo = {
|
|
CurGameState = XClickClearGameManager.GameState.Default,
|
|
HeadNormalType = 0,
|
|
HeadNormalTargetCount = 0,
|
|
HeadNormalCurCount = 0,
|
|
HeadNormalDesc = "",
|
|
HeadSpecialType = 0,
|
|
HeadSpecialTargetCount = 0,
|
|
HeadSpecialCurCount = 0,
|
|
HeadSpecialDesc = "",
|
|
LimitTime = 0,
|
|
RemainTime = 0,
|
|
WrongCostTime = 0,
|
|
HeadInfoPageList = {},
|
|
HeadInfoPageCount = 0,
|
|
CurrentHeadPageIndex = 0,
|
|
CurrentHeadRealPageIndex = 1,
|
|
IsNewRecord = false,
|
|
}
|
|
end
|
|
|
|
function XClickClearGameManager.StartGame()
|
|
if not XClickClearGameManager.GetRemainDaysStr() then -- 活动结束 不可再开始游戏
|
|
XUiManager.TipError(CS.XTextManager.GetText("ClickClearGameOver"))
|
|
return
|
|
end
|
|
|
|
if not XClickClearGameManager.InitGame() then
|
|
return
|
|
end
|
|
|
|
GameInfo.CurGameState = XClickClearGameManager.GameState.InitComplete
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_INIT_COMPLETE)
|
|
end
|
|
|
|
function XClickClearGameManager.InitGame()
|
|
if not CurrentGameDifficulty then
|
|
return false
|
|
end
|
|
|
|
local gameStage = XClickClearGameConfigs.GetGameStageTemplateById(CurrentGameDifficulty)
|
|
GameInfo.IsNewRecord = false
|
|
GameInfo.HeadNormalType = gameStage.HeadNormalType
|
|
GameInfo.HeadNormalTargetCount = gameStage.HeadNormalCount
|
|
GameInfo.HeadNormalDesc = gameStage.NormalTypeDesc
|
|
GameInfo.HeadNormalCurCount = 0
|
|
GameInfo.HeadSpecialType = gameStage.HeadSpecialType
|
|
GameInfo.HeadSpecialTargetCount = gameStage.HeadSpecialCount
|
|
GameInfo.HeadSpecialDesc = gameStage.SpecialTypeDesc
|
|
GameInfo.HeadSpecialCurCount = 0
|
|
GameInfo.LimitTime = gameStage.TimeLimit
|
|
GameInfo.RemainTime = gameStage.TimeLimit
|
|
GameInfo.WrongCostTime = gameStage.WrongCostTime
|
|
GameInfo.HeadInfoPageList = {}
|
|
|
|
local pageListIdStr = gameStage.PageList
|
|
for _,v in pairs(pageListIdStr) do
|
|
local pageIdList = string.ToIntArray(v)
|
|
local randomPageIndex = math.random(1, #pageIdList)
|
|
local pageId = pageIdList[randomPageIndex]
|
|
local headInfoList = {}
|
|
|
|
local pageTemplate = XClickClearGameConfigs.GetPageTemplateById(pageId)
|
|
local rowNumberList = pageTemplate.RowNumber
|
|
for _,v in pairs(rowNumberList) do
|
|
local rowNumberIdList = string.ToIntArray(v)
|
|
local randomRowIndex = math.random(1, #rowNumberIdList)
|
|
local rowId = rowNumberIdList[randomRowIndex]
|
|
|
|
local rowTemplate = XClickClearGameConfigs.GetRowTemplateById(rowId)
|
|
local headIdList = rowTemplate.HeadId
|
|
for _,v in pairs(headIdList) do
|
|
local headTypeList = XClickClearGameConfigs.GetHeadTypeListByType(v)
|
|
local headIndex = math.random(1, #headTypeList)
|
|
local headTemplate = XClickClearGameConfigs.GetHeadTemplateById(headTypeList[headIndex])
|
|
local headInfo = {}
|
|
headInfo.Type = headTemplate.Type
|
|
headInfo.Url = headTemplate.Url
|
|
headInfo.IsBeCatched = false
|
|
|
|
tableInsert(headInfoList, headInfo)
|
|
end
|
|
end
|
|
|
|
tableInsert(GameInfo.HeadInfoPageList, headInfoList)
|
|
end
|
|
|
|
GameInfo.HeadInfoPageCount = #GameInfo.HeadInfoPageList
|
|
|
|
return true
|
|
end
|
|
|
|
function XClickClearGameManager.CalcRealIndex(index)
|
|
if index > 0 then
|
|
return math.fmod(index, GameInfo.HeadInfoPageCount) + 1
|
|
elseif index == 0 then
|
|
return 1
|
|
elseif index < 0 then
|
|
local abs = math.abs(index)
|
|
local fmodVal = math.fmod(abs, GameInfo.HeadInfoPageCount)
|
|
if fmodVal == 0 then
|
|
return 1
|
|
else
|
|
return GameInfo.HeadInfoPageCount - fmodVal + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
function XClickClearGameManager.GetNextPageIndex()
|
|
GameInfo.CurrentHeadPageIndex = GameInfo.CurrentHeadPageIndex + 1
|
|
GameInfo.CurrentHeadRealPageIndex = XClickClearGameManager.CalcRealIndex(GameInfo.CurrentHeadPageIndex)
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PAGE_CHANGED)
|
|
return GameInfo.CurrentHeadPageIndex
|
|
end
|
|
|
|
function XClickClearGameManager.GetLastPageIndex()
|
|
GameInfo.CurrentHeadPageIndex = GameInfo.CurrentHeadPageIndex - 1
|
|
GameInfo.CurrentHeadRealPageIndex = XClickClearGameManager.CalcRealIndex(GameInfo.CurrentHeadPageIndex)
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PAGE_CHANGED)
|
|
return GameInfo.CurrentHeadPageIndex
|
|
end
|
|
|
|
function XClickClearGameManager.OnTouchedHead(index, grid)
|
|
if GameInfo.CurGameState ~= XClickClearGameManager.GameState.Playing then
|
|
return
|
|
end
|
|
|
|
local headInfo = GameInfo.HeadInfoPageList[GameInfo.CurrentHeadRealPageIndex][index]
|
|
if headInfo.IsBeCatched then
|
|
return
|
|
end
|
|
|
|
if headInfo.Type ~= GameInfo.HeadNormalType and headInfo.Type ~= GameInfo.HeadSpecialType then
|
|
GameInfo.RemainTime = GameInfo.RemainTime - GameInfo.WrongCostTime
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PAUSE, true)
|
|
return
|
|
end
|
|
|
|
if headInfo.Type == GameInfo.HeadNormalType then
|
|
GameInfo.HeadNormalCurCount = GameInfo.HeadNormalCurCount + 1
|
|
elseif headInfo.Type == GameInfo.HeadSpecialType then
|
|
GameInfo.HeadSpecialCurCount = GameInfo.HeadSpecialCurCount + 1
|
|
end
|
|
|
|
headInfo.IsBeCatched = true
|
|
grid.DisableAnimation.gameObject:PlayTimelineAnimation(function(state)
|
|
grid.HeadIcon.gameObject:SetActiveEx(false)
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_HEAD_COUNT_CHANGED)
|
|
XClickClearGameManager.CheckWin()
|
|
end, nil)
|
|
|
|
end
|
|
|
|
function XClickClearGameManager.SetGameStatePlaying()
|
|
GameInfo.CurGameState = XClickClearGameManager.GameState.Playing
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PLAYING)
|
|
end
|
|
|
|
function XClickClearGameManager.SetGameStatePause()
|
|
GameInfo.CurGameState = XClickClearGameManager.GameState.Pause
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PAUSE)
|
|
end
|
|
|
|
function XClickClearGameManager.SetGameStateAccount(isWin)
|
|
GameInfo.CurGameState = XClickClearGameManager.GameState.Account
|
|
if isWin then
|
|
GameInfo.UseTime = GameInfo.LimitTime - GameInfo.RemainTime
|
|
if not PassTimeRecords[CurrentGameDifficulty] or GameInfo.UseTime < PassTimeRecords[CurrentGameDifficulty]/1000 then
|
|
PassTimeRecords[CurrentGameDifficulty] = GameInfo.UseTime * 1000
|
|
local gameStageId = CurrentGameDifficulty
|
|
local bestRecord = math.ceil(PassTimeRecords[CurrentGameDifficulty])
|
|
XNetwork.Call( CLICKCLEARGAME_PROTO.ClickClearGameStageRecordRequest, { GameStageId = gameStageId, BestRecord = bestRecord }, function(res)
|
|
if res.Code ~= XCode.Success then
|
|
XUiManager.TipCode(res.Code)
|
|
return
|
|
end
|
|
end)
|
|
GameInfo.IsNewRecord = true
|
|
end
|
|
RewardDataList[CurrentGameDifficulty]:SetCanTake(true)
|
|
XEventManager.DispatchEvent(XEventId.EVENT_CLICKCLEARGAME_FINISHED_GAME)
|
|
end
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_PAUSE)
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_GAME_ACCOUNT, isWin)
|
|
end
|
|
|
|
function XClickClearGameManager.SetRemainTime(remainTime)
|
|
if remainTime < 0 then
|
|
remainTime = 0
|
|
end
|
|
|
|
GameInfo.RemainTime = remainTime
|
|
end
|
|
|
|
function XClickClearGameManager.CheckHeadIsCatch(pageIndex, headIndex)
|
|
return GameInfo.HeadInfoPageList[pageIndex][headIndex].IsBeCatched
|
|
end
|
|
|
|
function XClickClearGameManager.CheckWin()
|
|
if GameInfo.HeadNormalCurCount >= GameInfo.HeadNormalTargetCount and GameInfo.HeadSpecialCurCount >= GameInfo.HeadSpecialTargetCount then
|
|
XClickClearGameManager.SetGameStateAccount(true)
|
|
end
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardList()
|
|
return RewardDataList
|
|
end
|
|
|
|
function XClickClearGameManager.GetSortRewardList()
|
|
local isTakedRewardList = {}
|
|
local notTakedRewardList = {}
|
|
for _,v in pairs(RewardDataList) do
|
|
if v:CheckIsTaked() then
|
|
tableInsert(isTakedRewardList, v)
|
|
else
|
|
tableInsert(notTakedRewardList, v)
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(isTakedRewardList) do
|
|
tableInsert(notTakedRewardList, v)
|
|
end
|
|
|
|
return notTakedRewardList
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardData(gameStageId)
|
|
return RewardDataList[gameStageId]
|
|
end
|
|
|
|
function XClickClearGameManager.InitRewardDataList()
|
|
RewardDataList = {}
|
|
local gameStageTemplates = XClickClearGameConfigs.GetGameStageTemplates()
|
|
for gameStageId,template in pairs(gameStageTemplates) do
|
|
local rewardId = template.RewardId
|
|
local rewardConditionDesc = template.RewardConditionDesc
|
|
local rewardData = XClickClearGameRewardData.New(gameStageId, rewardId, rewardConditionDesc)
|
|
if rewardData then
|
|
tableInsert(RewardDataList, rewardData)
|
|
end
|
|
end
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardRequest(gameStageId, cb)
|
|
XNetwork.Call(CLICKCLEARGAME_PROTO.ClickClearGameStageGetRewardRequest, { GameStageId = gameStageId }, function(res)
|
|
if res.Code ~= XCode.Success then
|
|
XUiManager.TipCode(res.Code)
|
|
return
|
|
end
|
|
|
|
RewardDataList[gameStageId]:SetIsTaked(true)
|
|
XEventManager.DispatchEvent(XEventId.EVENT_CLICKCLEARGAME_TAKED_REWARD)
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CLICKCLEARGAME_TAKED_REWARD)
|
|
if cb then
|
|
cb(res.RewardGoodsList)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardCount()
|
|
return #RewardDataList
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardTakedCount()
|
|
local count = 0
|
|
for _,v in pairs(RewardDataList) do
|
|
if v:CheckIsTaked() then
|
|
count = count + 1
|
|
end
|
|
end
|
|
return count
|
|
end
|
|
|
|
function XClickClearGameManager.GetRewardCanTakeCount()
|
|
local count = 0
|
|
for _,v in pairs(RewardDataList) do
|
|
if v:CheckCanTake() then
|
|
count = count + 1
|
|
end
|
|
end
|
|
return count
|
|
end
|
|
|
|
function XClickClearGameManager.CheckDifficultyRedPoint(difficulty)
|
|
local isUnLock = XClickClearGameManager.CheckTabBtnByLastDifficult(difficulty)
|
|
local passTime = PassTimeRecords[difficulty]
|
|
if isUnLock and not IsTakeDifficultyBtnRedPointTable[difficulty] then
|
|
if not passTime or passTime == 0 then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function XClickClearGameManager.CheckRewardRedPoint()
|
|
for _,v in pairs(RewardDataList) do
|
|
if v:CheckCanTake() and not v:CheckIsTaked() then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function XClickClearGameManager.SetTakeDifficultyBtnRedPoint(index, bool)
|
|
IsTakeDifficultyBtnRedPointTable[index] = bool
|
|
end
|
|
|
|
function XClickClearGameManager.GetTakeDifficultyBtnRedPoint(index)
|
|
return IsTakeDifficultyBtnRedPointTable[index]
|
|
end
|
|
|
|
XClickClearGameManager:Init()
|
|
|
|
return XClickClearGameManager
|
|
end
|
|
|
|
XRpc.NotifyClickClearData = function (data)
|
|
XDataCenter.XClickClearGameManager.HandlerClickClearData(data)
|
|
end |