PGRData/Script/matrix/xmanager/XPokerGuessingManager.lua
2024-09-01 22:49:41 +02:00

444 lines
16 KiB
Lua

XPokerGuessingMangerCreator = function()
local XPokerGuessingManager = {}
local XPokerGuessing = require("XEntity/XPokerGuessing/XPokerGuessing")
local _CurrActivityId = XPokerGuessingConfig.GetDefaultActivityId()
---------玩法相关 begin-------
--数据结构 GuessInfo
--比赛状态 PokerGuessingStatusType ActivityStatus
--明牌的Id int DisplayCardId
--当前积分 int CurrentWinCounts
--记牌器列表 List<int> RecordCardIds
local _LastCardId = 0
local _LastGuessType = 0
local _DisplayCardId = 0
local _CurrentScore = 0
local _RecordCardIdsDic = {}
local _CurrGameStatus = 0
local _OldScore = 0
local _RequestLock = false
local _IsEnterCost = true
local _PokerGuessing
local _HintTipKey = "HintTipKey"
local _UnLockStoryKey = "UnLockStoryKey_"
--region ------------------HintTip start-------------------
local ClearHintTip = function()
local key = XPokerGuessingManager.GetCookiesKey(_HintTipKey)
XSaveTool.RemoveData(key)
end
local HintTipStatus = function()
local key = XPokerGuessingManager.GetCookiesKey(_HintTipKey)
local updateTime = XSaveTool.GetData(key)
if not updateTime then
return false
end
return XTime.GetServerNowTimestamp() < updateTime
end
local MarkHintTip = function(select)
local key = XPokerGuessingManager.GetCookiesKey(_HintTipKey)
if select then
if HintTipStatus() then
return
end
local updateTime = XTime.GetSeverTomorrowFreshTime()
XSaveTool.SaveData(key, updateTime)
else
ClearHintTip()
end
end
--endregion------------------HintTip finish------------------
local UpdateGuessingInfo = function(guessInfo)
if not guessInfo then return end
if XTool.IsNumberValid(_DisplayCardId) then
_LastCardId = _DisplayCardId
elseif not XTool.IsTableEmpty(guessInfo.RecordCardIds) then
if guessInfo.RecordCardIds then
local count = #guessInfo.RecordCardIds
_LastCardId = guessInfo.RecordCardIds[count]
end
end
_CurrentScore = guessInfo.CurrentWinCounts
_DisplayCardId = guessInfo.DisplayCardId
_CurrGameStatus = guessInfo.ActivityStatus
_IsEnterCost = guessInfo.IsEnterCost
_PokerGuessing:SetProperty("_TipsCount", guessInfo.TipsCount)
_PokerGuessing:SetProperty("_TipsProgress", guessInfo.TipsProgress)
_RecordCardIdsDic = {}
if guessInfo.RecordCardIds then
for _,id in pairs(guessInfo.RecordCardIds) do
_RecordCardIdsDic[id] = id
end
end
end
function XPokerGuessingManager.IsInRecordCardDic(id)
return _RecordCardIdsDic[id] or false
end
function XPokerGuessingManager.GetDisplayCardId()
return _DisplayCardId
end
function XPokerGuessingManager.GetCurrentScore()
return _CurrentScore
end
function XPokerGuessingManager.GetCurrGameStatus()
return _CurrGameStatus
end
function XPokerGuessingManager.GetOldScore()
return _OldScore
end
function XPokerGuessingManager.GetIsEnterCost()
return _IsEnterCost
end
function XPokerGuessingManager.GetPokerGuessingData()
return _PokerGuessing
end
function XPokerGuessingManager.GetResult()
local lastNum = XPokerGuessingConfig.GetCardNumber(_LastCardId)
local currNum = XPokerGuessingConfig.GetCardNumber(_DisplayCardId)
if lastNum == currNum then return XPokerGuessingConfig.GameStatus.Drawn end
local isWin = _LastGuessType == XPokerGuessingConfig.GuessType.Greater and (currNum > lastNum) or (currNum < lastNum)
return isWin and XPokerGuessingConfig.GameStatus.Victory or XPokerGuessingConfig.GameStatus.Failed
end
function XPokerGuessingManager.IsContinueGuessRequest(isContinue)
if _RequestLock then return end
_RequestLock = true
local req = {IsContinue = isContinue}
XNetwork.Call("IsContinueGuessRequest",req,function(rsp)
_RequestLock = false
if rsp.Code ~= XCode.Success then
XUiManager.TipCode(rsp.Code)
return
end
UpdateGuessingInfo(rsp.GuessInfo)
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_POKER_GUESSING_UPDATE_STATE)
end)
end
function XPokerGuessingManager.StartNewPokerGuessingRequest(cb)
if _RequestLock then return end
_RequestLock = true
XNetwork.Call("StartNewPokerGuessingRequest",nil,function(rsp)
_RequestLock = false
if rsp.Code ~= XCode.Success then
XUiManager.TipCode(rsp.Code)
return
end
UpdateGuessingInfo(rsp.GuessInfo)
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_POKER_GUESSING_UPDATE_STATE)
if cb then
cb()
end
end)
end
function XPokerGuessingManager.GuessCompareRequest(guessType,cb)
if _RequestLock then return end
_RequestLock = true
local req = {GuessType = guessType}
_LastGuessType = guessType
XNetwork.Call("GuessCompareRequest",req,function(rsp)
_RequestLock = false
if rsp.Code ~= XCode.Success then
XUiManager.TipCode(rsp.Code)
return
end
_OldScore = _CurrentScore
UpdateGuessingInfo(rsp.GuessInfo)
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_POKER_GUESSING_UPDATE_STATE)
if cb then
cb()
end
end)
end
function XPokerGuessingManager.UseTipsRequest(cb)
XNetwork.Call("UseTipsRequest", {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_PokerGuessing:SetProperty("_DescKey", XPokerGuessingConfig.Type2DescKey[res.Result])
if cb then cb() end
end)
end
local function RequestUnlockCharacterStory(characterId, cb)
local config
for _, cfg in ipairs(XPokerGuessingConfig.PokerStoryConfig:GetConfigs()) do
if cfg.CharacterId == characterId then
config = cfg
break
end
end
if not config then return end
local itemCount = XDataCenter.ItemManager.GetCount(config.UnlockItemId)
if itemCount < config.Cost then
XUiManager.TipText("PokerGuessingUnlockItemDeficiency")
return
end
XNetwork.Call("UnlockCharacterStoryRequest", { CharacterId = characterId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local storyInfo = res.StoryInfo
_PokerGuessing:SetProperty("_UnLockCharacters", storyInfo.UnlockCharacters)
if cb then cb() end
end)
end
function XPokerGuessingManager.UnlockCharacterStoryRequest(characterId, cb)
local status = HintTipStatus()
if status then
RequestUnlockCharacterStory(characterId, cb)
return
end
local hintInfo = {
SetHintCb = MarkHintTip,
Status = status,
}
local content = XUiHelper.GetText("PokerGuessingSendContent", XPokerGuessingConfig.GetUnlockCostCount(characterId))
XUiManager.DialogHintTip(XUiHelper.GetText("PokerGuessingSendTitle"), XUiHelper.ReplaceTextNewLine(content), nil, ClearHintTip,
function()
RequestUnlockCharacterStory(characterId, cb)
end,
hintInfo
)
end
---------玩法相关 end---------
---------配置相关 begin-------
function XPokerGuessingManager.GetBackAssetPath()
return XPokerGuessingConfig.GetBackAssetPath(_CurrActivityId)
end
function XPokerGuessingManager.GetCostItemName()
return XPokerGuessingConfig.GetCostItemName(_CurrActivityId)
end
function XPokerGuessingManager.GetCostItemCount()
return XPokerGuessingConfig.GetCostItemCount(_CurrActivityId)
end
function XPokerGuessingManager.GetCostItemIcon()
return XPokerGuessingConfig.GetCostItemIcon(_CurrActivityId)
end
function XPokerGuessingManager.GetShopSkipId()
return XPokerGuessingConfig.GetShopSkipId(_CurrActivityId)
end
function XPokerGuessingManager.GetPokerGroup()
return XPokerGuessingConfig.GetPokerGroup(_CurrActivityId)
end
function XPokerGuessingManager.GetActivityStoryId()
return XPokerGuessingConfig.GetActivityStoryId(_CurrActivityId)
end
function XPokerGuessingManager.GetMaxProgress()
return XPokerGuessingConfig.GetMaxProgress(_CurrActivityId)
end
function XPokerGuessingManager.GetMaxTipCount()
return XPokerGuessingConfig.GetMaxTipCount(_CurrActivityId)
end
---------配置相关 end---------
---------活动相关 begin-------
function XPokerGuessingManager.OnOpenMain()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.PokerGuessing) then
return
end
if not XPokerGuessingManager.IsOpen() then
XUiManager.TipText("FestivalActivityNotInActivityTime")
return
end
if not _PokerGuessing then
return
end
XSaveTool.SaveData(XPokerGuessingManager.GetPlayerPrefsKey(), true)
if _PokerGuessing:IsFirstOpen() then
CsXUiManager.Instance:SetRevertAndReleaseLock(true)
XDataCenter.MovieManager.PlayMovie(XDataCenter.PokerGuessingManager.GetActivityStoryId(), function()
_PokerGuessing:MarkFirstOpen()
XLuaUiManager.Open("UiFubenPokerGuessing")
CsXUiManager.Instance:SetRevertAndReleaseLock(false)
end
)
else
XLuaUiManager.Open("UiFubenPokerGuessing")
end
end
function XPokerGuessingManager.OnActivityEnd()
XLuaUiManager.RunMain()
XUiManager.TipText("CommonActivityEnd")
end
function XPokerGuessingManager.GetStartTime()
return XFunctionManager.GetStartTimeByTimeId(XPokerGuessingConfig.GetActivityTimeId(_CurrActivityId))
end
function XPokerGuessingManager.GetEndTime()
return XFunctionManager.GetEndTimeByTimeId(XPokerGuessingConfig.GetActivityTimeId(_CurrActivityId))
end
function XPokerGuessingManager.IsOpen()
return XFunctionManager.CheckInTimeByTimeId(XPokerGuessingConfig.GetActivityTimeId(_CurrActivityId))
end
function XPokerGuessingManager.GetChapters()
local chapters = {}
if XPokerGuessingManager.IsOpen() then
local tempChapter = {}
tempChapter.Id = _CurrActivityId
tempChapter.Name = XPokerGuessingConfig.GetActivityName(_CurrActivityId)
tempChapter.Type = XDataCenter.FubenManager.ChapterType.PokerGuessing
tempChapter.BannerBg = XPokerGuessingConfig.GetBannerBg(_CurrActivityId)
table.insert(chapters, tempChapter)
end
return chapters
end
function XPokerGuessingManager.GetPlayerPrefsKey()
local severNextRefreshTime = XTime.GetSeverNextRefreshTime()
return string.format("%s_%s_%s", XPlayer.Id, "PokerGuessingBannerRed", severNextRefreshTime)
end
function XPokerGuessingManager.GetCookiesKey(key)
return string.format("XPokerGuessingManager_GetCookiesKey_%s_%s_%s", XPlayer.Id, _CurrActivityId, key)
end
function XPokerGuessingManager.CheckBannerRedPoint()
local task = XPokerGuessingManager.CheckTaskRedPoint()
local story = XPokerGuessingManager.CheckStoryRedPoint()
if task or story then
return true
end
return false
end
function XPokerGuessingManager.CheckTaskRedPoint()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.PokerGuessing) then
return false
end
if not XPokerGuessingManager.IsOpen() then
return false
end
local taskList = XDataCenter.TaskManager.GetPokerGuessingTaskList()
for k,v in pairs(taskList) do
if XDataCenter.TaskManager.CheckTaskAchieved(v.Id) then
return true
end
end
if XSaveTool.GetData(XPokerGuessingManager.GetPlayerPrefsKey()) then
return false
end
local taskList = XDataCenter.TaskManager.GetPokerGuessingTaskList()
for _,task in pairs(taskList) do
if task.State == XDataCenter.TaskManager.TaskState.Active then
return true
end
end
return false
end
function XPokerGuessingManager.CheckStoryRedPoint()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.PokerGuessing) then
return false
end
if not XPokerGuessingManager.IsOpen() then
return false
end
local count = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.PokerGuessingItemId)
local freshKey = XPokerGuessingManager.GetCookiesKey(XTime.GetSeverNextRefreshTime())
--今日已检测
if XSaveTool.GetData(freshKey) then
return false
end
local key = XPokerGuessingManager.GetCookiesKey(_UnLockStoryKey .. count)
if XSaveTool.GetData(key) then
return false
end
local unlockList = _PokerGuessing and _PokerGuessing:GetProperty("_UnLockCharacters") or {}
local unlockDict = {}
for _, characterId in ipairs(unlockList) do
unlockDict[characterId] = true
end
local configs = XPokerGuessingConfig.PokerStoryConfig:GetConfigs()
for _, cfg in ipairs(configs) do
if not unlockDict[cfg.CharacterId] and count >= cfg.Cost then
return true
end
end
return false
end
function XPokerGuessingManager.MarkUnlockStory()
local state = XPokerGuessingManager.CheckStoryRedPoint()
if not state then
return
end
local count = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.PokerGuessingItemId)
local key = XPokerGuessingManager.GetCookiesKey(_UnLockStoryKey .. count)
XSaveTool.SaveData(key, true)
end
function XPokerGuessingManager.MarkUnlockItemChange()
local state = XPokerGuessingManager.CheckStoryRedPoint()
if not state then
return
end
local freshKey = XPokerGuessingManager.GetCookiesKey(XTime.GetSeverNextRefreshTime())
XSaveTool.SaveData(freshKey, true)
end
---------活动相关 end --------
---------推送相关 begin --------
function XPokerGuessingManager.NotifyPokerGuessingData(data)
if not data then return end
if data.ActivityId ~= 0 then
_CurrActivityId = data.ActivityId
_PokerGuessing = _PokerGuessing or XPokerGuessing.New(_CurrActivityId)
local storyInfo = data.StoryInfo
_PokerGuessing:SetProperty("_UnLockCharacters", storyInfo.UnlockCharacters)
elseif data.ActivityId == 0 then
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_POKER_GUESSING_ACTIVITY_END)
end
UpdateGuessingInfo(data.GuessInfo)
end
---------推送相关 end ----------
return XPokerGuessingManager
end
XRpc.NotifyPokerGuessingData = function(data)
XDataCenter.PokerGuessingManager.NotifyPokerGuessingData(data)
end