2023-07-14 19:35:33 +00:00
|
|
|
|
local tableInsert = table.insert
|
|
|
|
|
local tableSort = table.sort
|
|
|
|
|
local XInvertCardStageEntity = require("XEntity/XInvertCardGame/XInvertCardStage")
|
|
|
|
|
XInvertCardGameManagerCreator = function()
|
|
|
|
|
local XInvertCardGameManager = {}
|
|
|
|
|
local ActId = 0
|
|
|
|
|
local CurStageId = 0
|
|
|
|
|
local StageEntityList = {}
|
|
|
|
|
|
|
|
|
|
local INVERT_CARD_PROTO = {
|
|
|
|
|
InvertCardRequest = "InvertCardRequest", -- 翻牌请求
|
|
|
|
|
InvertCardsRewardRequest = "InvertCardsRewardRequest", -- 领取关卡奖励请求
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.HandleInvertGameData(data)
|
|
|
|
|
ActId = data.ActivityId
|
|
|
|
|
CurStageId = data.CurActivityStageId
|
|
|
|
|
local stageInfoList = data.ActivityStageInfoList
|
|
|
|
|
-- 遍历数据
|
|
|
|
|
if stageInfoList and next(stageInfoList) then
|
|
|
|
|
for _, stageData in ipairs(stageInfoList) do
|
|
|
|
|
if stageData.ActivityStageId then
|
|
|
|
|
local tmp = XInvertCardGameConfig.GetInvertCardStageTemplateById(stageData.ActivityStageId)
|
|
|
|
|
local stageEntity = XInvertCardStageEntity.New(tmp, stageData)
|
|
|
|
|
tableInsert(StageEntityList, stageEntity)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.Init()
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
for _, stageData in ipairs(StageEntityList) do
|
|
|
|
|
local id = stageData:GetId()
|
|
|
|
|
if id == stageId then
|
|
|
|
|
return stageData
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.InvertCardRequest(stageId, cardIdx)
|
|
|
|
|
if not ActId or ActId == 0 then
|
|
|
|
|
XLog.Error("Invert Card Game ActivityId Can't Be nil or 0")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local cardState = XInvertCardGameManager.CheckCardState(stageId, cardIdx)
|
|
|
|
|
if cardState == XInvertCardGameConfig.InvertCardGameCardState.Back then
|
|
|
|
|
local stageData = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
local isMaxCost = stageData:GetTotalCounts() >= stageData:GetMaxCostNum() -- 超过最大翻牌次数不消耗代币
|
|
|
|
|
if not XInvertCardGameManager.CheckHasEnoughItem(stageData) and not isMaxCost then
|
|
|
|
|
XUiManager.TipText("InvertCardGameHaveNotEnoughItem")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XNetwork.Call(INVERT_CARD_PROTO.InvertCardRequest, {ActivityId = ActId, ActivityStageId = stageId, CardIdx = cardIdx}, function (res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if stageData then
|
|
|
|
|
XInvertCardGameManager.InvertCard(stageData, stageId, cardIdx)
|
|
|
|
|
XInvertCardGameManager.ClearCardData(stageData, stageId, res.FinCardsIdxList)
|
|
|
|
|
XInvertCardGameManager.PunishCard(stageData, stageId, res.PunishCardsIdxList)
|
|
|
|
|
stageData:SetProgress(res.Progress)
|
|
|
|
|
stageData:AddTotalCounts()
|
|
|
|
|
stageData:SetStatus(res.ActivityStageStatus)
|
|
|
|
|
if res.ActivityStageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
|
|
|
|
|
XInvertCardGameManager.CheckNextStageOpen()
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--XEventManager.DispatchEvent(XEventId.EVENT_INVERT_CARD_GAME_CARD_CHANGED)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_INVERT_CARD_GAME_CARD_CHANGED, stageData, cardIdx, res.PunishCardsIdxList, res.FinCardsIdxList)
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.InvertCard(stageData, stageId, cardIdx)
|
|
|
|
|
if not stageData then
|
|
|
|
|
stageData = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
end
|
|
|
|
|
if stageData then
|
|
|
|
|
stageData:SetCardInvert(cardIdx)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.ClearCardData(stageData, stageId, finishCardIdxs)
|
|
|
|
|
if not stageData then
|
|
|
|
|
stageData = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
end
|
|
|
|
|
if stageData then
|
|
|
|
|
for _, finishIdx in ipairs(finishCardIdxs) do
|
|
|
|
|
stageData:SetCardFinish(finishIdx)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.PunishCard(stageData, stageId, punishCardIdxs)
|
|
|
|
|
if not stageData then
|
|
|
|
|
stageData = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
end
|
|
|
|
|
if stageData then
|
|
|
|
|
for _, punishIdx in ipairs(punishCardIdxs) do
|
|
|
|
|
stageData:SetCardPunish(punishIdx)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.InvertCardsRewardRequest(stageId)
|
|
|
|
|
if not ActId or ActId == 0 then
|
|
|
|
|
XLog.Error("Invert Card Game ActivityId Can't Be nil or 0")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XNetwork.Call(INVERT_CARD_PROTO.InvertCardsRewardRequest, {ActivityId = ActId, ActivityStageId = stageId}, function (res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local stageData = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
if stageData then
|
|
|
|
|
stageData:SetRewardListIdx(res.RewardListIdx)
|
|
|
|
|
if res.RewardGoodsList and next(res.RewardGoodsList) then
|
|
|
|
|
XUiManager.OpenUiObtain(res.RewardGoodsList, CS.XTextManager.GetText("Award"))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_INVERT_CARD_GAME_GET_REWARD)
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_INVERT_CARD_GAME_GET_REWARD, stageData)
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckNextStageOpen()
|
|
|
|
|
local curOpenStageId = 0
|
|
|
|
|
for index, stageData in ipairs(StageEntityList) do
|
|
|
|
|
if stageData:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Lock then
|
|
|
|
|
if StageEntityList[index-1] and StageEntityList[index-1]:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
|
|
|
|
|
stageData:SetStatus(XInvertCardGameConfig.InvertCardGameStageStatusType.Process)
|
|
|
|
|
CurStageId = stageData:GetId()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetHelpId()
|
|
|
|
|
if ActId and ActId ~= 0 then
|
|
|
|
|
return XInvertCardGameConfig.GetHelpId(ActId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetConsumeItemId()
|
|
|
|
|
if ActId and ActId ~= 0 then
|
|
|
|
|
return XInvertCardGameConfig.GetConsumeItemId(ActId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckHasServerData()
|
|
|
|
|
if StageEntityList and next(StageEntityList) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetStorySkipId()
|
|
|
|
|
if ActId and ActId ~= 0 then
|
|
|
|
|
return XInvertCardGameConfig.GetStorySkipId(ActId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetActivityTimeId()
|
|
|
|
|
if ActId and ActId ~= 0 then
|
|
|
|
|
return XInvertCardGameConfig.GetActivityTimeId(ActId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetStageEntityList()
|
|
|
|
|
return StageEntityList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckStageIsOpen(index)
|
|
|
|
|
if StageEntityList and StageEntityList[index] then
|
|
|
|
|
return StageEntityList[index]:GetStatus() ~= XInvertCardGameConfig.InvertCardGameStageStatusType.Lock
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.FindDefaultSelectTabIndex()
|
|
|
|
|
if CurStageId then
|
|
|
|
|
for index, stageEntity in ipairs(StageEntityList) do
|
|
|
|
|
if stageEntity:GetId() == CurStageId then
|
|
|
|
|
return index
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return 1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetCurStageEntity()
|
|
|
|
|
if CurStageId then
|
|
|
|
|
for index, stageEntity in ipairs(StageEntityList) do
|
|
|
|
|
if stageEntity:GetId() == CurStageId then
|
|
|
|
|
return stageEntity
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 根据关卡Id,奖励Id检查奖励状态
|
|
|
|
|
function XInvertCardGameManager.CheckRewardState(stageId, rewardIdx)
|
|
|
|
|
if not stageId or not rewardIdx or stageId == 0 or rewardIdx == 0 then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameRewardTookState.NotFinish
|
|
|
|
|
end
|
|
|
|
|
local stageEntity = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
if stageEntity:GetRewardListIdx()[rewardIdx] == true then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameRewardTookState.Took
|
|
|
|
|
else
|
|
|
|
|
local finishProgress = stageEntity:GetProgress()
|
|
|
|
|
local targetProgress = stageEntity:GetFinishProgress()[rewardIdx]
|
|
|
|
|
if finishProgress and targetProgress then
|
|
|
|
|
if finishProgress < targetProgress then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameRewardTookState.NotFinish
|
|
|
|
|
else
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameRewardTookState.NotTook
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameRewardTookState.NotFinish
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 根据关卡Id,卡牌Id检查卡牌状态
|
|
|
|
|
function XInvertCardGameManager.CheckCardState(stageId, cardIdx)
|
|
|
|
|
if not stageId or not cardIdx or stageId == 0 or cardIdx == 0 then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Finish
|
|
|
|
|
end
|
|
|
|
|
local stageEntity = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
if stageEntity:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Front
|
|
|
|
|
end
|
|
|
|
|
local cardList = stageEntity:GetRandomCardList()
|
|
|
|
|
if cardList[cardIdx] then
|
|
|
|
|
if cardList[cardIdx].IsFinish then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Finish
|
|
|
|
|
else
|
|
|
|
|
local invertList = stageEntity:GetInvertList()
|
|
|
|
|
for _, invertCardIdx in ipairs(invertList) do
|
|
|
|
|
if cardIdx == invertCardIdx then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Front
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Back
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameCardState.Finish
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.GetStartStage(stageEntity)
|
|
|
|
|
if not stageEntity then
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameStartStage.Started
|
|
|
|
|
end
|
|
|
|
|
local stageId = stageEntity:GetId()
|
|
|
|
|
local status = stageEntity:GetStatus()
|
|
|
|
|
local startStateData = XSaveTool.GetData(string.format( "%s%s%s%s", XInvertCardGameConfig.INVERT_CARD_GAME_START_STATE_KEY, XPlayer.Id, XDataCenter.InvertCardGameManager.ActId, stageId))
|
|
|
|
|
--本地没有缓存,或者缓存为未开始 且 当前关卡未完成(避免清除缓存出现问题)
|
|
|
|
|
if (not startStateData or startStateData == XInvertCardGameConfig.InvertCardGameStartStage.NotStart)
|
|
|
|
|
and status ~= XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
|
|
|
|
|
if status == XInvertCardGameConfig.InvertCardGameStageStatusType.Process then
|
|
|
|
|
--已经翻牌的列表
|
|
|
|
|
local list = stageEntity:GetInvertList()
|
|
|
|
|
return XTool.IsTableEmpty(list) and XInvertCardGameConfig.InvertCardGameStartStage.NotStart or XInvertCardGameConfig.InvertCardGameStartStage.Started
|
|
|
|
|
end
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameStartStage.NotStart
|
|
|
|
|
else
|
|
|
|
|
return XInvertCardGameConfig.InvertCardGameStartStage.Started
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.SetStartStage(stageEntity)
|
|
|
|
|
if not stageEntity then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local stageId = stageEntity:GetId()
|
|
|
|
|
XSaveTool.SaveData(string.format( "%s%s%s%s", XInvertCardGameConfig.INVERT_CARD_GAME_START_STATE_KEY, XPlayer.Id, XDataCenter.InvertCardGameManager.ActId, stageId), XInvertCardGameConfig.InvertCardGameStartStage.Started)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckTogRedPoint(index)
|
|
|
|
|
if StageEntityList[index] then
|
|
|
|
|
if StageEntityList[index]:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Process then
|
|
|
|
|
if StageEntityList[index]:GetTotalCounts() >= StageEntityList[index]:GetMaxCostNum() then -- 超过最大翻牌次数不消耗代币
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
if XInvertCardGameManager.CheckHasEnoughItem(StageEntityList[index]) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local rewardList = StageEntityList[index]:GetRewards()
|
|
|
|
|
local stageId = StageEntityList[index]:GetId()
|
|
|
|
|
for index, _ in ipairs(rewardList) do
|
|
|
|
|
if XInvertCardGameManager.CheckRewardState(stageId, index) == XInvertCardGameConfig.InvertCardGameRewardTookState.NotTook then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckHasEnoughItem(stageEntity)
|
|
|
|
|
local consumeItemId = XInvertCardGameManager.GetConsumeItemId()
|
|
|
|
|
if not consumeItemId then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local consumeCount = stageEntity:GetCostCoinNum()
|
|
|
|
|
if not consumeCount then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if stageEntity:GetTotalCounts() >= stageEntity:GetMaxCostNum() then -- 超过最大翻牌次数不消耗代币
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return XDataCenter.ItemManager.CheckItemCountById(consumeItemId, consumeCount)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckAllGameRedPoint()
|
|
|
|
|
if StageEntityList and next(StageEntityList) then
|
|
|
|
|
for index, _ in ipairs(StageEntityList) do
|
|
|
|
|
if XInvertCardGameManager.CheckTogRedPoint(index) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XInvertCardGameManager.CheckActivityStageFinished(activityId, stageId)
|
|
|
|
|
if not ActId or ActId == 0 or ActId ~= activityId then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local stageEntity = XInvertCardGameManager.GetStageEntityById(stageId)
|
|
|
|
|
if not stageEntity then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return stageEntity:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XInvertCardGameManager.Init()
|
|
|
|
|
return XInvertCardGameManager
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyInvertCardGameData = function (data)
|
|
|
|
|
XDataCenter.InvertCardGameManager.HandleInvertGameData(data)
|
|
|
|
|
end
|