Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

263 lines
10 KiB
Lua

local ActivityLevelsInstanceLevel = class("ActivityLevelsInstanceLevel")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local AdventureModuleHelper = CS.AdventureModuleHelper
local TimerManager = require("GameCore.Timer.TimerManager")
local mapEventConfig = {
LevelStateChanged = "OnEvent_SendMsgFinishBattle",
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
[EventId.AbandonBattle] = "OnEvent_AbandonBattle",
AdventureModuleEnter = "OnEvent_AdventureModuleEnter",
BattlePause = "OnEvent_Pause",
ActivityInstance_Result = "LevelResultChange",
ActivityLevelSettle_Failed = "OnEvent_ActivityLevelSettleFailed",
ActivityLevels_Instance_Gameplay_Time = "OnEvent_ActivityLevels_Time"
}
function ActivityLevelsInstanceLevel:Init(parent, nActivityId, nLevelId, nBuildId)
self.parent = parent
self.nLevelId = nLevelId
self.nActivityId = nActivityId
self.isSettlement = false
self.nBuildId = nBuildId
self.curFloorIdx = 1
self.levelTotalTime = 0
local GetBuildCallback = function(mapBuildData)
self.mapBuildData = mapBuildData
self.tbCharId = {}
for _, mapChar in ipairs(self.mapBuildData.tbChar) do
table.insert(self.tbCharId, mapChar.nTid)
end
self.tbDiscId = {}
for _, nDiscId in ipairs(self.mapBuildData.tbDisc) do
if 0 < nDiscId then
table.insert(self.tbDiscId, nDiscId)
end
end
self.mapActorInfo = {}
for idx, nTid in ipairs(self.tbCharId) do
local stActorInfo = self:CalCharFixedEffect(nTid, idx == 1, self.tbDiscId)
self.mapActorInfo[nTid] = stActorInfo
end
PlayerData.nCurGameType = AllEnum.WorldMapNodeType.ActivityLevels
local mapParams = {
tostring(self.curFloorIdx),
tostring(self.levelTotalTime)
}
CS.AdventureModuleHelper.EnterActivityLevelsInstance(nLevelId, self.tbCharId, mapParams)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
PlayerData.Build:GetBuildDetailData(GetBuildCallback, nBuildId)
end
function ActivityLevelsInstanceLevel:OnEvent_LoadLevelRefresh()
local mapAllEft, mapDiscEft, mapNoteEffect, tbNoteInfo = PlayerData.Build:GetBuildAllEft(self.mapBuildData.nBuildId)
safe_call_cs_func(CS.AdventureModuleHelper.SetNoteInfo, tbNoteInfo)
self.mapEftData = UTILS.AddBuildEffect(mapAllEft, mapDiscEft, mapNoteEffect)
EventManager.Hit("OpenActivityLevelsInstanceRoomInfo", self.nLevelId, self.levelTotalTime)
end
function ActivityLevelsInstanceLevel:OnEvent_LevelResult(tbStar, bAbandon)
end
function ActivityLevelsInstanceLevel:OnEvent_AbandonBattle()
self:LevelResultChange(false, 0)
end
function ActivityLevelsInstanceLevel:OnEvent_AdventureModuleEnter()
PlayerData.Achievement:SetSpecialBattleAchievement(GameEnum.levelType.ActivityLevels)
EventManager.Hit(EventId.OpenPanel, PanelId.ActivityLevelsBattlePanel, self.tbCharId)
self:SetPersonalPerk()
self:SetDiscInfo()
for idx, nCharId in ipairs(self.tbCharId) do
local stActorInfo = self:CalCharFixedEffect(nCharId, idx == 1, self.tbDiscId)
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, stActorInfo)
end
end
function ActivityLevelsInstanceLevel:OnEvent_SendMsgFinishBattle()
if self.isSettlement then
return
end
local mapCfg = ConfigTable.GetData("ActivityLevelsLevel", self.nLevelId)
if self.curFloorIdx < #mapCfg.FloorId then
local GetBuildCallback = function(mapBuildData)
self.curFloorIdx = self.curFloorIdx + 1
self.mapBuildData = mapBuildData
self.tbCharId = {}
for _, mapChar in ipairs(self.mapBuildData.tbChar) do
table.insert(self.tbCharId, mapChar.nTid)
end
self.tbDiscId = {}
for _, nDiscId in ipairs(self.mapBuildData.tbDisc) do
if 0 < nDiscId then
table.insert(self.tbDiscId, nDiscId)
end
end
self.mapActorInfo = {}
for idx, nTid in ipairs(self.tbCharId) do
local stActorInfo = self:CalCharFixedEffect(nTid, idx == 1, self.tbDiscId)
self.mapActorInfo[nTid] = stActorInfo
end
PlayerData.nCurGameType = AllEnum.WorldMapNodeType.ActivityLevels
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
self:OnEvent_AdventureModuleEnter()
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
local mapParams = {
tostring(self.curFloorIdx),
tostring(self.levelTotalTime)
}
CS.AdventureModuleHelper.EnterActivityLevelsInstance(self.nLevelId, self.tbCharId, mapParams)
CS.AdventureModuleHelper.LevelStateChanged(false)
end
PlayerData.Build:GetBuildDetailData(GetBuildCallback, self.nBuildId)
return
end
end
function ActivityLevelsInstanceLevel:LevelResultChange(isWin, totalTime)
EventManager.Hit("ActivityLevelsInstanceBattleEnd")
self:SettleLevelsInstance(isWin, totalTime)
end
function ActivityLevelsInstanceLevel:RefreshCharDamageData()
self.tbCharDamage = UTILS.GetCharDamageResult(self.tbCharId)
end
function ActivityLevelsInstanceLevel:SettleLevelsInstance(isWin, totalTime)
if self.isSettlement then
return
end
self.isSettlement = true
local starCount = 0
self:RefreshCharDamageData()
if isWin then
local mapCfg = ConfigTable.GetData("ActivityLevelsLevel", self.nLevelId)
if totalTime <= mapCfg.ThreeStarCondition[1] then
starCount = 3
elseif totalTime <= mapCfg.TwoStarCondition[1] then
starCount = 2
else
starCount = 1
end
end
local callback = function(taFixed, tbFirstReward, nExp, mapChangeInfo)
NovaAPI.InputEnable()
EventManager.Hit("ActivityLevelsInstanceLevelEnd")
self.passStar = starCount
if isWin then
self:PlaySuccessPerform(taFixed, tbFirstReward, nExp, starCount, mapChangeInfo)
else
EventManager.Hit(EventId.ClosePanel, PanelId.BtnTips)
local sLarge, sSmall = "", ""
EventManager.Hit(EventId.OpenPanel, PanelId.ActivityLevelsInstanceResultPanel, false, 0, {}, {}, {}, 0, false, sLarge, sSmall, self.nLevelId, self.tbCharId, mapChangeInfo, self.tbCharDamage)
end
self:UnBindEvent()
self.parent:LevelEnd()
end
NovaAPI.InputDisable()
self.parent:SendActivityLevelSettleReq(self.nActivityId, starCount, callback)
end
function ActivityLevelsInstanceLevel:OnEvent_ActivityLevelSettleFailed()
NovaAPI.InputEnable()
EventManager.Hit("ActivityLevelsInstanceLevelEnd")
self.passStar = 0
EventManager.Hit(EventId.ClosePanel, PanelId.BtnTips)
local sLarge, sSmall = "", ""
EventManager.Hit(EventId.OpenPanel, PanelId.ActivityLevelsInstanceResultPanel, false, 0, {}, {}, {}, 0, false, sLarge, sSmall, self.nLevelId, self.tbCharId, nil, self.tbCharDamage)
local nCurTime = CS.ClientManager.Instance.serverTimeStamp
local nEndTime = self.parent.nEndTime
if nCurTime > nEndTime then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Activity_End_Notice"))
end
self:UnBindEvent()
self.parent:LevelEnd()
end
function ActivityLevelsInstanceLevel:PlaySuccessPerform(FixedRewardItems, FirstRewardItems, nExp, starCount, mapChangeInfo)
local func_SettlementFinish = function(bSuccess)
end
local tbChar = self.tbCharId
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
local tabFloor = ConfigTable.GetData("ActivityLevelsLevel", self.nLevelId).FloorId
local tabFloorCount = #tabFloor
local nType = ConfigTable.GetData("ActivityLevelsFloor", tabFloor[tabFloorCount]).Theme
local sName = ConfigTable.GetData("EndSceneType", nType).EndSceneName
local tbSkin = {}
for _, nCharId in ipairs(tbChar) do
local nSkinId = PlayerData.Char:GetCharSkinId(nCharId)
table.insert(tbSkin, nSkinId)
end
CS.AdventureModuleHelper.PlaySettlementPerform(sName, "", tbSkin, func_SettlementFinish)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
local function openBattleResultPanel()
EventManager.Remove("SettlementPerformLoadFinish", self, openBattleResultPanel)
local sLarge, sSmall = "", ""
EventManager.Hit(EventId.OpenPanel, PanelId.ActivityLevelsInstanceResultPanel, true, starCount, FixedRewardItems or {}, FirstRewardItems or {}, {}, nExp or 0, false, sLarge, sSmall, self.nLevelId, self.tbCharId, mapChangeInfo, self.tbCharDamage)
self.bSettle = false
self.parent:LevelEnd()
self:UnBindEvent()
end
EventManager.Add("SettlementPerformLoadFinish", self, openBattleResultPanel)
CS.AdventureModuleHelper.LevelStateChanged(true)
EventManager.Hit(EventId.OpenPanel, PanelId.BattleResultMask)
end
function ActivityLevelsInstanceLevel:BindEvent()
if type(mapEventConfig) ~= "table" then
return
end
for nEventId, sCallbackName in pairs(mapEventConfig) do
local callback = self[sCallbackName]
if type(callback) == "function" then
EventManager.Add(nEventId, self, callback)
end
end
end
function ActivityLevelsInstanceLevel:UnBindEvent()
if type(mapEventConfig) ~= "table" then
return
end
for nEventId, sCallbackName in pairs(mapEventConfig) do
local callback = self[sCallbackName]
if type(callback) == "function" then
EventManager.Remove(nEventId, self, callback)
end
end
end
function ActivityLevelsInstanceLevel:SetCharFixedAttribute()
for nCharId, stActorInfo in pairs(self.mapActorInfo) do
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, stActorInfo)
end
end
function ActivityLevelsInstanceLevel:CalCharFixedEffect(nCharId, bMainChar, tbDiscId)
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
PlayerData.Char:CalCharacterAttrBattle(nCharId, stActorInfo, bMainChar, tbDiscId, self.mapBuildData.nBuildId)
return stActorInfo
end
function ActivityLevelsInstanceLevel:SetPersonalPerk()
if self.mapBuildData ~= nil then
for nCharId, tbPerk in pairs(self.mapBuildData.tbPotentials) do
local mapAddLevel = PlayerData.Char:GetCharEnhancedPotential(nCharId)
local tbPerkInfo = {}
for _, mapPerkInfo in ipairs(tbPerk) do
local nAddLv = mapAddLevel[mapPerkInfo.nPotentialId] or 0
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = mapPerkInfo.nPotentialId
stPerkInfo.nCount = mapPerkInfo.nLevel + nAddLv
table.insert(tbPerkInfo, stPerkInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.ChangePersonalPerkIds, tbPerkInfo, nCharId)
end
end
end
function ActivityLevelsInstanceLevel:SetDiscInfo()
local tbDiscInfo = {}
for k, nDiscId in ipairs(self.mapBuildData.tbDisc) do
if k <= 3 then
local discInfo = PlayerData.Disc:CalcDiscInfoInBuild(nDiscId, self.mapBuildData.tbSecondarySkill)
table.insert(tbDiscInfo, discInfo)
end
end
safe_call_cs_func(CS.AdventureModuleHelper.SetDiscInfo, tbDiscInfo)
end
function ActivityLevelsInstanceLevel:OnEvent_Pause()
EventManager.Hit("OpenActivityLevelsInstancePause", self.nActivityId, self.nLevelId, self.tbCharId)
end
function ActivityLevelsInstanceLevel:OnEvent_ActivityLevels_Time(nTime)
self.levelTotalTime = nTime
end
return ActivityLevelsInstanceLevel