Files
StellaSora_DataLua/lua/game/adventure/regionbosslevel/regionbossbattlelevel.lua
T
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

310 lines
12 KiB
Lua

local RegionBossBattleLevel = class("RegionBossBattleLevel")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local AdventureModuleHelper = CS.AdventureModuleHelper
local TimerManager = require("GameCore.Timer.TimerManager")
local mapEventConfig = {
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
[EventId.AbandonBattle] = "OnEvent_AbandonBattle",
AdventureModuleEnter = "OnEvent_AdventureModuleEnter",
Region_Boss_Result = "LevelResultChange",
BattlePause = "OnEvnet_Pause"
}
function RegionBossBattleLevel:Init(parent, nLevelId, nBuildId, isWeekBoss)
self.parent = parent
self.nLevelId = nLevelId
self.nBuildId = nBuildId
self.isSettlement = false
local GetBuildCallback = function(mapBuildData)
self.mapBuildData = mapBuildData
self.tbCharId = {}
if mapBuildData == nil then
local sTip = ConfigTable.GetUIText("RegionBoss_Team_Delete")
EventManager.Hit(EventId.OpenMessageBox, sTip)
return
end
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
local nFloorId = 0
if isWeekBoss == 1 then
PlayerData.RogueBoss:SetIsWeeklyCopies(false)
nFloorId = ConfigTable.GetData("RegionBossLevel", nLevelId).FloorId
elseif isWeekBoss == 2 then
PlayerData.RogueBoss:SetIsWeeklyCopies(true)
nFloorId = ConfigTable.GetData("WeekBossLevel", nLevelId).FloorId
end
PlayerData.nCurGameType = AllEnum.WorldMapNodeType.Rogueboss
CS.AdventureModuleHelper.EnterRogueBossMap(nFloorId, self.tbCharId, nLevelId, 0, isWeekBoss)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
PlayerData.Build:GetBuildDetailData(GetBuildCallback, nBuildId)
self.nResultTime = 0
end
function RegionBossBattleLevel:RefreshCharDamageData()
self.tbCharDamage = UTILS.GetCharDamageResult(self.tbCharId)
end
function RegionBossBattleLevel:SettleRegionBoss(isWin)
if self.isSettlement then
return
end
self.isSettlement = true
self:RefreshCharDamageData()
local isWeeklyCopies = PlayerData.RogueBoss:GetIsWeeklyCopies()
print("is week " .. tostring(isWeeklyCopies))
if isWeeklyCopies then
local callback = function(mapMsgData, nPassStar)
local nExp = 0
local CacheRewardTab = {}
for i, v in ipairs(mapMsgData.FirstItems) do
v.rewardType = AllEnum.RewardType.First
table.insert(CacheRewardTab, v)
end
for i, v in ipairs(mapMsgData.AwardItems) do
table.insert(CacheRewardTab, v)
end
if isWin then
self:PlaySuccessPerform(ConfigTable.GetData("WeekBossLevel", self.nLevelId).FloorId, self.nBuildId, nExp, CacheRewardTab, mapMsgData.Change, true)
else
EventManager.Hit(EventId.OpenPanel, PanelId.RogueBossResult, 2, self.nResultTime, self.nBuildId, nExp, CacheRewardTab, mapMsgData.Change, self.tbCharDamage)
end
self:UnBindEvent()
self.parent:LevelEnd()
end
self.parent:WeeklyCopiesLevelSettleReq(isWin, self.nResultTime, callback)
else
local callback = function(mapMsgData, nPassStar)
self.passStar = nPassStar
local nExp = mapMsgData.Exp
local CacheRewardTab = {}
for i, v in ipairs(mapMsgData.FirstItems) do
v.rewardType = AllEnum.RewardType.First
table.insert(CacheRewardTab, v)
end
for i, v in ipairs(mapMsgData.ThreeStarItems) do
v.rewardType = AllEnum.RewardType.Three
table.insert(CacheRewardTab, v)
end
for i, v in ipairs(mapMsgData.SurpriseItems) do
v.rewardType = AllEnum.RewardType.Extra
table.insert(CacheRewardTab, v)
end
for i, v in ipairs(mapMsgData.AwardItems) do
table.insert(CacheRewardTab, v)
end
for i, v in ipairs(mapMsgData.DoubleItems) do
v.rewardType = AllEnum.RewardType.Double
table.insert(CacheRewardTab, v)
end
if isWin then
self:PlaySuccessPerform(ConfigTable.GetData("RegionBossLevel", self.nLevelId).FloorId, self.nBuildId, nExp, CacheRewardTab, mapMsgData.Change, false)
else
EventManager.Hit(EventId.OpenPanel, PanelId.BossInstanceResultPanel, false, 0, CacheRewardTab, nExp, self.nLevelId, self.tbCharId, mapMsgData.Change, self.tbCharDamage)
end
self:UnBindEvent()
self.parent:LevelEnd()
end
self.parent:RegionBossLevelSettleReq(isWin, self.nResultTime, callback)
end
end
function RegionBossBattleLevel: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)
end
function RegionBossBattleLevel:OnEvent_AbandonBattle()
self:SettleRegionBoss(false)
end
function RegionBossBattleLevel:OnEvent_AdventureModuleEnter()
local isWeeklyCopies = PlayerData.RogueBoss:GetIsWeeklyCopies()
if isWeeklyCopies then
PlayerData.Achievement:SetSpecialBattleAchievement(GameEnum.levelType.WeeklyCopies)
else
PlayerData.Achievement:SetSpecialBattleAchievement(GameEnum.levelType.RegionBoss)
end
EventManager.Hit(EventId.OpenPanel, PanelId.RegionBossBattlePanel, 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 RegionBossBattleLevel:OnEvent_OpenChest()
local wait = function()
self:SettleRegionBoss(true)
end
TimerManager.Add(1, 1, self, wait, true, true, true, nil)
end
function RegionBossBattleLevel:LevelResultChange(isWin, totaltime)
self.nResultTime = totaltime
self:SettleRegionBoss(isWin)
end
function RegionBossBattleLevel: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 RegionBossBattleLevel: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 RegionBossBattleLevel:PlaySuccessPerform(nMapId, buildId, nExp, tbReward, mapChangeInfo, isWeekBoss)
local func_SettlementFinish = function(bSuccess)
end
local tbChar = self.tbCharId
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
if isWeekBoss then
local nType = ConfigTable.GetData("WeekBossFloor", nMapId).Theme
local sName = ConfigTable.GetData("EndSceneType", nType).EndSceneName
print("sceneName:" .. sName)
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)
else
local nType = ConfigTable.GetData("RegionBossFloor", nMapId).Theme
local sName = ConfigTable.GetData("EndSceneType", nType).EndSceneName
print("sceneName:" .. sName)
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
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
local function openBattleResultPanel()
EventManager.Remove("SettlementPerformLoadFinish", self, openBattleResultPanel)
if self.passStar == nil then
self.passStar = 1
end
if isWeekBoss then
EventManager.Hit(EventId.OpenPanel, PanelId.RogueBossResult, 1, self.nResultTime, buildId, nExp, tbReward, mapChangeInfo, self.tbCharDamage)
else
EventManager.Hit(EventId.OpenPanel, PanelId.BossInstanceResultPanel, true, self.passStar, tbReward, nExp, self.nLevelId, self.tbCharId, mapChangeInfo, self.tbCharDamage)
end
end
EventManager.Add("SettlementPerformLoadFinish", self, openBattleResultPanel)
CS.AdventureModuleHelper.LevelStateChanged(true)
EventManager.Hit(EventId.OpenPanel, PanelId.BattleResultMask)
end
function RegionBossBattleLevel:SetTempActorAttribute(nCharId)
local mapChar = {nLevel = 1, nAdvance = 0}
local nLevel = mapChar.nLevel
local nAdvance = mapChar.nAdvance
local nAttrId = UTILS.GetCharacterAttributeId(nCharId, nAdvance, nLevel)
local mapCharAttr = ConfigTable.GetData_Attribute(tostring(nAttrId))
if mapCharAttr == nil then
printError("属性配置不存在:" .. nAttrId)
return {}
end
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
stActorInfo.Atk = mapCharAttr.Atk
stActorInfo.Def = mapCharAttr.Def
stActorInfo.MDef = mapCharAttr.Mdef
stActorInfo.ShieldBonus = mapCharAttr.ShieldBonus
stActorInfo.IncomingShieldBonus = mapCharAttr.IncomingShieldBonus
stActorInfo.Evd = mapCharAttr.Evd
stActorInfo.CritRate = mapCharAttr.CritRate
stActorInfo.CritResistance = mapCharAttr.CritResistance
stActorInfo.CritPower = mapCharAttr.CritPower
stActorInfo.HitRate = mapCharAttr.HitRate
stActorInfo.DefPierce = mapCharAttr.DefPierce
stActorInfo.WEE = mapCharAttr.WEE
stActorInfo.FEE = mapCharAttr.FEE
stActorInfo.SEE = mapCharAttr.SEE
stActorInfo.AEE = mapCharAttr.AEE
stActorInfo.LEE = mapCharAttr.LEE
stActorInfo.DEE = mapCharAttr.DEE
stActorInfo.WEP = mapCharAttr.WEP
stActorInfo.FEP = mapCharAttr.FEP
stActorInfo.AEP = mapCharAttr.AEP
stActorInfo.SEP = mapCharAttr.SEP
stActorInfo.LEP = mapCharAttr.LEP
stActorInfo.DEP = mapCharAttr.DEP
stActorInfo.WER = mapCharAttr.WER
stActorInfo.FER = mapCharAttr.FER
stActorInfo.AER = mapCharAttr.AER
stActorInfo.SER = mapCharAttr.SER
stActorInfo.LER = mapCharAttr.LER
stActorInfo.DER = mapCharAttr.DER
stActorInfo.Hp = mapCharAttr.Hp
stActorInfo.Suppress = mapCharAttr.Suppress
stActorInfo.SkillLevel = {
1,
1,
1
}
stActorInfo.skinId = PlayerData.Char:GetCharSkinId(nCharId)
stActorInfo.attrId = mapCharAttr.sAttrId
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, stActorInfo)
end
function RegionBossBattleLevel:SetCharFixedAttribute()
for nCharId, stActorInfo in pairs(self.mapActorInfo) do
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, stActorInfo)
end
end
function RegionBossBattleLevel:CalCharFixedEffect(nCharId, bMainChar, tbDiscId)
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
PlayerData.Char:CalCharacterAttrBattle(nCharId, stActorInfo, bMainChar, tbDiscId, self.mapBuildData.nBuildId)
return stActorInfo
end
function RegionBossBattleLevel: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 RegionBossBattleLevel: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 RegionBossBattleLevel:OnEvnet_Pause()
EventManager.Hit("OpenRegionBossPause", self.nLevelId, self.tbCharId)
end
return RegionBossBattleLevel