PGRData/Script/matrix/xmanager/XFubenHackManager.lua

687 lines
23 KiB
Lua

local tableInsert = table.insert
local ipairs = ipairs
local pairs = pairs
local CsPlayerPrefs = CS.UnityEngine.PlayerPrefs
local KEY_LAST_LEVEL = "LastLevel"
local KEY_LAST_EXP = "LastExp"
local KEY_AFFIX_UNLOCK = "AffixUnlock"
local KEY_STAGE_DETAIL = "StageDetail"
local KEY_TEAM = "Team"
XFubenHackManagerCreator = function()
local MAX_STAGE_STAR_COUNT = 3
local XFubenHackManager = {}
local ActivityInfo = nil
local DefaultActivityInfo = nil
local LevelInfo = {
Level = 0,
TotalExp = 0,
Exp = 0,
LastLevel = nil,
LastExp = nil,
}
local CurChapterId = 1
local IsTicketGet = false
local BuffBarList = {}
local StageStarRecordDic = {}
local AffixUnlockMap = {} -- 已解锁buff表
local RewardDic = {} --已经领取的星级奖励
local LevelExpDic = {} -- 每一级所需要的总经验
local BuffLevelDic = {} -- BuffId对应的等级
local StageDetailReadDic = {} -- 关卡详情已读标记
local BuffPosLevelDic = {} -- Buff栏开放表
local IsRegisterEditBattleProxy = false
-------- local function begin ----------
local function Init()
local activityTemplates = XFubenHackConfig.GetActTemplates()
for _, template in pairs(activityTemplates) do
DefaultActivityInfo = ActivityInfo or XFubenHackConfig.GetActivityTemplateById(template.Id)
end
XFubenHackManager.RegisterEditBattleProxy()
end
local function GetKey(key)
return string.format("%s_FubenHack_%d_%d_%s", tostring(XPlayer.Id), ActivityInfo.Id, CurChapterId, key)
end
--最后一次保存的等级
local function GetLastLevel()
return LevelInfo.LastLevel or CsPlayerPrefs.GetInt(GetKey(KEY_LAST_LEVEL), -1)
end
local function GetLastExp()
return LevelInfo.LastExp or CsPlayerPrefs.GetInt(GetKey(KEY_LAST_EXP), -1)
end
-- 保存当前等级
local function SaveLevel(level)
local curLevel = level or XFubenHackManager.GetLevel()
CsPlayerPrefs.SetInt(KEY_LAST_LEVEL, curLevel)
CsPlayerPrefs.Save()
LevelInfo.LastLevel = curLevel
end
local function SaveExp(exp)
local curExp = exp or XFubenHackManager.GetTotalExp()
CsPlayerPrefs.SetInt(KEY_LAST_EXP, curExp)
LevelInfo.LastExp = curExp
end
local function GetLevelByExp(exp)
for i = XFubenHackManager.GetMaxLevel(), 1, -1 do
if exp >= LevelExpDic[i] then
return i
end
end
end
local GetStarsCount = function(starsMark)
local count = (starsMark & 1) + (starsMark & 2 > 0 and 1 or 0) + (starsMark & 4 > 0 and 1 or 0)
local starMap = {(starsMark & 1) > 0, (starsMark & 2) > 0, (starsMark & 4) > 0 }
return count, starMap
end
-------- local function end ----------
local FUBEN_HACK_PROTO = {
GetHackRewardRequest = "GetHackRewardRequest",
SetHackBuffRequest = "SetHackBuffRequest",
GetHackDailyTicketRequest = "GetHackDailyTicketRequest",
}
function XFubenHackManager.GetCurrentActTemplate()
return ActivityInfo
end
function XFubenHackManager.OnActivityEnd()
XLuaUiManager.RunMain()
if XFubenHackManager.GetIsActivityEnd() then
XUiManager.TipText("ActivityMainLineEnd", XUiManager.UiTipType.Wrong)
else
XUiManager.TipText("ArenaOnlineTimeOut", XUiManager.UiTipType.Wrong, true)
end
end
-- 判断等级是否提升
function XFubenHackManager.CheckLevelUp()
local curLevel = XFubenHackManager.GetLevel()
local lastLevel = GetLastLevel()
-- -1 表示未保存过
if lastLevel == -1 then
SaveLevel()
return false
end
if lastLevel < curLevel then
XLuaUiManager.Open("UiHackLevelUpTips",lastLevel, curLevel)
SaveLevel(curLevel)
return true
end
return false
end
-- 判断经验是否提升
function XFubenHackManager.CheckExpAdd()
local curExp = XFubenHackManager.GetTotalExp()
local lastExp = GetLastExp()
-- -1 表示未保存过
if lastExp == -1 then
SaveExp()
CsPlayerPrefs.Save()
return false
end
if lastExp < curExp then
local AnimTempLevel = GetLevelByExp(lastExp)
local lastLevelExp = lastExp - LevelExpDic[AnimTempLevel]
local lvCfg = XFubenHackManager.GetLevelCfg(AnimTempLevel)
if LevelInfo.Level > AnimTempLevel then
AnimTempLevel = AnimTempLevel + 1
LevelInfo.LastExp = LevelExpDic[AnimTempLevel]
return true, true, AnimTempLevel - 1, lastLevelExp, lvCfg.UpExp, lvCfg.UpExp
else
SaveExp(LevelInfo.TotalExp)
return true, false, AnimTempLevel, lastLevelExp, XFubenHackManager.GetCurExp(), lvCfg.UpExp
end
end
return false, false
end
-- 等级
function XFubenHackManager.GetLevel()
return LevelInfo.Level
end
function XFubenHackManager.GetTotalExp()
return LevelInfo.TotalExp
end
function XFubenHackManager.GetCurExp()
return LevelInfo.CurExp
end
function XFubenHackManager.GetNextUpExp()
local lvCfg = XFubenHackManager.GetLevelCfg(LevelInfo.Level)
if not lvCfg then
return 0
end
return lvCfg.UpExp
end
function XFubenHackManager.GetReadDetailMark(stageId)
return StageDetailReadDic[stageId]
end
function XFubenHackManager.SetReadDetailMark(stageId)
StageDetailReadDic[stageId] = true
XSaveTool.SaveData(GetKey(KEY_STAGE_DETAIL), StageDetailReadDic)
end
function XFubenHackManager.GetBuffBarList()
return BuffBarList
end
function XFubenHackManager.GetBuffAbilityBonus()
local bonus = 0
for _, v in ipairs(BuffBarList) do
if v ~= 0 then
bonus = bonus + XFubenHackConfig.GetBuffById(v).AbilityBonus
end
end
return bonus
end
function XFubenHackManager.CheckAffixEquip(buffId)
for _, v in ipairs(BuffBarList) do
if v == buffId then
return true
end
end
return false
end
function XFubenHackManager.GetLevelByBuffId(buffId)
return BuffLevelDic[buffId]
end
function XFubenHackManager.CheckAffixRedPoint()
for i = 1, LevelInfo.Level do
if not AffixUnlockMap[i] then
return true
end
end
local count = 0
local buffBarCount = 0
for i = XFubenHackConfig.BuffBarCapacity, 0, -1 do
if XFubenHackManager.IsBuffPosUnlock(i) then
buffBarCount = i
break
end
end
for i = 1, buffBarCount do
if BuffBarList[i] == 0 then
if LevelInfo.Level >= buffBarCount then
return true
end
else
count = count + 1
end
end
if count < LevelInfo.Level and count < buffBarCount then
return true
end
return false
end
function XFubenHackManager.GetBuffListShowIndex()
for i = 1, LevelInfo.Level do
if not AffixUnlockMap[i+1] then
return i
end
end
return LevelInfo.Level
end
function XFubenHackManager.IsAffixUnlock(level)
return LevelInfo.Level >= level and AffixUnlockMap[level]
end
function XFubenHackManager.UnlockAffix(level)
if LevelInfo.Level < level then
local desc = CS.XTextManager.GetText("FubenHackUnlockBuffFail")
return false, desc
else
AffixUnlockMap[level] = true
XSaveTool.SaveData(GetKey(KEY_AFFIX_UNLOCK), AffixUnlockMap)
local desc = CS.XTextManager.GetText("FubenHackUnlockBuffSucc")
return true, desc
end
end
function XFubenHackManager.IsBuffPosUnlock(index)
return BuffPosLevelDic[index] and LevelInfo.Level >= BuffPosLevelDic[index], BuffPosLevelDic[index] or -1
end
function XFubenHackManager.GetLevelCfg(level)
return XFubenHackConfig.GetLevelCfg(CurChapterId, level)
end
function XFubenHackManager.GetMaxLevel()
local cfgs = XFubenHackConfig.GetLevelCfgs(CurChapterId)
return cfgs and #cfgs or 0
end
-- 保存编队信息
function XFubenHackManager.SaveTeamLocal(curTeam)
XSaveTool.SaveData(GetKey(KEY_TEAM), curTeam)
end
-- 读取本地编队信息
function XFubenHackManager.LoadTeamLocal()
local team = XSaveTool.GetData(GetKey(KEY_TEAM)) or XDataCenter.TeamManager.EmptyTeam
return team
end
--获取奖励
function XFubenHackManager.GetStarRewardList()
local ownStars = XFubenHackManager.GetStarProgress()
local canGet = false
local startIndex = 1
local leastGap = XMath.IntMax()
local starReward = {}
for i, v in ipairs(XFubenHackManager.GetCurChapterTemplate().RewardId) do
local cfg = XFubenHackConfig.GetRewardById(v)
if cfg then
local data = {}
data.Id = cfg.Id
data.RequireStar = cfg.NeedStars
data.RewardId = cfg.RewardId
data.IsFinish = ownStars >= cfg.NeedStars
data.IsReward = XFubenHackManager.CheckStarRewardGet(v)
starReward[i] = data
if canGet then goto CONTINUE end
if data.IsFinish and not data.IsReward then
startIndex = i
canGet = true
elseif not data.IsFinish then
local gap = cfg.NeedStars - ownStars
if leastGap > gap then
leastGap = gap
startIndex = i
end
end
end
::CONTINUE::
end
return starReward, canGet, startIndex
end
--判断是否已经领奖
function XFubenHackManager.CheckStarRewardGet(rewardId)
if not rewardId then
return
end
return RewardDic and RewardDic[rewardId]
end
function XFubenHackManager.GetStarReward(id, cb)
XNetwork.Call(FUBEN_HACK_PROTO.GetHackRewardRequest, { Id = id }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
RewardDic[id] = true
if cb then
cb(res.RewardGoodsList)
end
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_HACK_UPDATE)
end)
end
-- [初始化数据]
function XFubenHackManager.InitStageInfo()
local stages = XFubenHackConfig.GetStages()
for _, v in pairs(stages) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.Id)
if stageInfo then
stageInfo.Type = XDataCenter.FubenManager.StageType.Hack
end
end
-- 通关后需要会执行InitStage 所以需要刷新
XFubenHackManager.RefreshStagePassed()
end
function XFubenHackManager.RefreshStagePassed()
if CurChapterId == 0 then return end
local chapter = XFubenHackManager.GetCurChapterTemplate()
for _, stageId in ipairs(chapter.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
if stageInfo then
stageInfo.Passed = StageStarRecordDic[stageId] or false
stageInfo.StarsMap = XFubenHackManager.GetStarMap(stageId)
stageInfo.Unlock = true
stageInfo.IsOpen = true
if stageCfg.RequireLevel > 0 and XPlayer.Level < stageCfg.RequireLevel then
stageInfo.Unlock = false
end
for _, preStageId in pairs(stageCfg.PreStageId or {}) do
if preStageId > 0 then
if not StageStarRecordDic[preStageId] then
stageInfo.Unlock = false
stageInfo.IsOpen = false
break
end
end
end
end
end
end
function XFubenHackManager.CheckPreFight(stage)
if not StageStarRecordDic[stage.StageId] then
local consume = XFubenHackConfig.GetStageInfo(stage.StageId).ConsumeTicket
local count = XDataCenter.ItemManager.GetCount(ActivityInfo.TicketId)
if consume > count then
local msg = CS.XTextManager.GetText("FubenHackTicketNotEnough")
XUiManager.TipMsg(msg)
return false
end
end
return true
end
function XFubenHackManager.PreFight(stage, teamId)
local preFight = {}
preFight.CardIds = {}
preFight.RobotIds = {}
preFight.StageId = stage.StageId
if not stage.RobotId or #stage.RobotId <= 0 then
local teamData = XDataCenter.TeamManager.GetTeamData(teamId)
for i, v in pairs(teamData) do
local isRobot = XRobotManager.CheckIsRobotId(v)
--preFight.RobotIds[i] = isRobot and v or 0
if isRobot then tableInsert(preFight.RobotIds, v) end
preFight.CardIds[i] = XRobotManager.CheckIdToCharacterId(v)
end
preFight.CaptainPos = XDataCenter.TeamManager.GetTeamCaptainPos(teamId)
preFight.FirstFightPos = XDataCenter.TeamManager.GetTeamFirstFightPos(teamId)
end
return preFight
end
-- [胜利]
function XFubenHackManager.ShowReward(winData)
if not winData then return end
XLuaUiManager.Open("UiSettleWinMainLine", winData)
end
function XFubenHackManager.SetBuff(index, buffId, cb)
if index == 0 then
for pos, v in ipairs(BuffBarList) do
if v == 0 and XFubenHackManager.IsBuffPosUnlock(pos) then
index = pos
break
end
end
end
if index ~= 0 then
XNetwork.Call(FUBEN_HACK_PROTO.SetHackBuffRequest, {Index = index, BuffId = buffId},function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return false
end
BuffBarList[index] = buffId
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_HACK_UPDATE)
cb(true)
end)
else
cb(false, CS.XTextManager.GetText("FubenHackEquipBuffFail"))
end
end
function XFubenHackManager.GetHackDailyTicket()
if IsTicketGet then return false end
XNetwork.Call(FUBEN_HACK_PROTO.GetHackDailyTicketRequest, {},function(res)
if res.Code ~= XCode.Success then
-- XUiManager.TipCode(res.Code)
return false
end
IsTicketGet = true
local rewards = {{ TemplateId = res.TicketId , Count = res.TicketCount }}
XUiManager.OpenUiObtain(rewards, CS.XTextManager.GetText("FubenHackDailyTicket"))
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_HACK_UPDATE)
return true
end)
end
function XFubenHackManager.GetCurChapterTemplate()
return XFubenHackConfig.GetChapterTemplate(CurChapterId) or {}
end
function XFubenHackManager.GetStarMap(stageId)
local starsMark = StageStarRecordDic[stageId] or 0
local count, starMap = GetStarsCount(starsMark)
return starMap, count
end
-- 获取所有关卡进度
function XFubenHackManager.GetStageSchedule()
local chapter = XFubenHackManager.GetCurChapterTemplate()
local passCount = 0
local allCount = #chapter.StageId
for _, stageId in ipairs(chapter.StageId) do
if StageStarRecordDic[stageId] then
passCount = passCount + 1
end
end
return passCount, allCount
end
-- 主题活动页面是否可挑战接口
function XFubenHackManager.IsChallengeable()
if not ActivityInfo then return false end
if not IsTicketGet or XDataCenter.ItemManager.GetCount(ActivityInfo.TicketId) > 0 then
local passCount, allCount = XFubenHackManager.GetStageSchedule()
if passCount < allCount then
return true
end
end
return false
end
-- 获取篇章星数
function XFubenHackManager.GetStarProgress()
local templates = XFubenHackManager.GetCurChapterTemplate()
local totalStars = #templates.StageId * MAX_STAGE_STAR_COUNT
local ownStars = 0
for _, v in ipairs(templates.StageId) do
local _, starCount = XFubenHackManager.GetStarMap(v)
ownStars = ownStars + starCount
end
return ownStars, totalStars
end
function XFubenHackManager.GetAvailableActs()
local act = XFubenHackManager.GetCurrentActTemplate()
local activityList = {}
if act and
not XFubenHackManager.GetIsActivityEnd() and
not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.FubenHack) then
tableInsert(activityList, {
Id = act.Id,
Type = XDataCenter.FubenManager.ChapterType.Hack,
Name = act.Name,
Icon = act.BannerBg,
})
end
return activityList
end
--判断活动是否开启
function XFubenHackManager.GetIsActivityEnd()
if not ActivityInfo then
return true, true
end
local timeNow = XTime.GetServerNowTimestamp()
local isEnd = timeNow >= XFubenHackManager.GetEndTime()
local isStart = timeNow >= XFubenHackManager.GetStartTime()
local inActivity = (not isEnd) and (isStart)
return not inActivity, timeNow < XFubenHackManager.GetStartTime()
end
--获取活动开始时间
function XFubenHackManager.GetStartTime()
if DefaultActivityInfo then
return XFunctionManager.GetStartTimeByTimeId(DefaultActivityInfo.TimeId) or 0
end
return 0
end
--获取活动结束时间
function XFubenHackManager.GetEndTime()
if DefaultActivityInfo then
return XFunctionManager.GetEndTimeByTimeId(DefaultActivityInfo.TimeId) or 0
end
return 0
end
--获取本轮结束时间
function XFubenHackManager.GetCurChapterEndTime()
local chapter = XFubenHackManager.GetCurChapterTemplate()
if DefaultActivityInfo then
return XFunctionManager.GetEndTimeByTimeId(chapter.TimeId) or 0
end
return 0
end
-- 注册出战界面代理
function XFubenHackManager.RegisterEditBattleProxy()
if IsRegisterEditBattleProxy then return end
IsRegisterEditBattleProxy = true
XUiNewRoomSingleProxy.RegisterProxy(XDataCenter.FubenManager.StageType.Hack,
require("XUi/XUiFubenHack/Proxy/XUiHackNewRoomSingle"))
XUiRoomCharacterProxy.RegisterProxy(XDataCenter.FubenManager.StageType.Hack,
require("XUi/XUiFubenHack/Proxy/XUiHackRoomCharacter"))
end
--登录/活动开始/跨周时下发
function XFubenHackManager.NotifyData(data)
ActivityInfo = XFubenHackConfig.GetActivityTemplateById(data.Id)
CurChapterId = data.ChapterId
if CurChapterId ~= 0 then
LevelExpDic = {[1] = 0}
BuffPosLevelDic = {}
local maxLv = XFubenHackManager.GetMaxLevel()
for i = 1, maxLv do
local levelCfg = XFubenHackManager.GetLevelCfg(i)
LevelExpDic[i + 1] = LevelExpDic[i] + levelCfg.UpExp
BuffLevelDic[levelCfg.BuffId] = i
for pos = 1, levelCfg.UnlockBuffPos do
if not BuffPosLevelDic[pos] then
BuffPosLevelDic[pos] = i
end
end
end
--BuffLevelDic[XFubenHackManager.GetLevelCfg(maxLv).BuffId] = maxLv
LevelInfo.Level = data.Level
LevelInfo.TotalExp = data.TotalExp
LevelInfo.CurExp = data.TotalExp - LevelExpDic[data.Level] or 0
IsTicketGet = data.IsTicketGet
BuffBarList = data.LevelBuffIds
RewardDic = {}
for _, rewardId in ipairs(data.RewardIds) do
RewardDic[rewardId] = true
end
StageStarRecordDic = {}
for _, stageInfo in ipairs(data.StageInfos) do
StageStarRecordDic[stageInfo.Id] = stageInfo.Star
end
XFubenHackManager.RefreshStagePassed()
AffixUnlockMap = XSaveTool.GetData(GetKey(KEY_AFFIX_UNLOCK))
if not AffixUnlockMap then
AffixUnlockMap = {}
for i = 1, LevelInfo.Level do
AffixUnlockMap[i] = true
end
XSaveTool.SaveData(GetKey(KEY_AFFIX_UNLOCK), AffixUnlockMap)
end
StageDetailReadDic = XSaveTool.GetData(GetKey(KEY_STAGE_DETAIL)) or {}
end
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ACTIVITY_ON_RESET, XDataCenter.FubenManager.StageType.Hack)
end
-- 下发等级数据
function XFubenHackManager.NotifyHackLevelData(data)
LevelInfo.Level = data.Level
LevelInfo.TotalExp = data.TotalExp
LevelInfo.CurExp = data.TotalExp - LevelExpDic[data.Level]
-- 派发更新通知
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_HACK_UPDATE)
end
-- 下发关卡数据(通关星数)
function XFubenHackManager.NotifyStageData(stageInfo)
StageStarRecordDic[stageInfo.Id] = stageInfo.Star
XFubenHackManager.RefreshStagePassed()
end
-- 下发门票领取状态
function XFubenHackManager.NotifyHackTicketGetState(data)
IsTicketGet = data.IsTicketGet
-- 派发更新通知
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_HACK_UPDATE)
end
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, function()
Init()
end)
return XFubenHackManager
end
XRpc.NotifyHackLoginData = function(data)
XDataCenter.FubenHackManager.NotifyData(data)
end
XRpc.NotifyHackLevelData = function(data)
XDataCenter.FubenHackManager.NotifyHackLevelData(data)
end
XRpc.NotifyHackStageInfoChange = function(data)
XDataCenter.FubenHackManager.NotifyStageData(data.StageInfo)
end
XRpc.NotifyHackTicketGetState = function(data)
XDataCenter.FubenHackManager.NotifyHackTicketGetState(data)
end