Files
StellaSora_DataLua/lua/game/adventure/mainlinelevel/mainlineprologuelevel.lua
T
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

471 lines
15 KiB
Lua

local MainlinePrologueLevel = class("MainlinePrologueLevel")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local LocalData = require("GameCore.Data.LocalData")
local RapidJson = require("rapidjson")
local mapFloor = {
[1] = "Game.Adventure.MainlineLevel.PrologueFloor.DesertFloor",
[2] = "Game.Adventure.MainlineLevel.PrologueFloor.BattleFloor"
}
local mapEventConfig = {
LevelStateChanged = "OnEvent_LevelStateChanged",
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
ExitModule = "OnEvent_ExitModule",
AfterEnterModule = "OnEvent_AfterEnterModule",
PrologueBattleReload = "OnEvent_PrologueBattleReload",
PrologueBattleArchive = "OnEvent_PrologueBattleArchive",
AdventureModuleEnter = "OnEvent_AdventureModuleEnter",
EnterModule = "OnEvent_EnterModule"
}
local enterFloorForTest = 0
local PrologueSceneId = 1200103
local tbAfterDesertFloor = {1200104, 1200106}
local tbTrialCharacter = {
{
1200201,
1200203,
1200202
},
{
1200201,
1200203,
1200202
}
}
local tbSelectPerks = {
{
500501,
500801,
500101
}
}
local mapBoxReward = {
[1] = {
500501,
500801,
500101
}
}
local tbTheme = {
GameEnum.rglTheme.ChainLightning,
GameEnum.rglTheme.WindBlade,
GameEnum.rglTheme.FireRing
}
function MainlinePrologueLevel:Init(parent)
self.curFloor = nil
self.sAfterBattleAvg = "ST1001"
local lastAccount = LocalData.GetLocalData("LoginUIData", "LastUserName_All")
local sJson = LocalData.GetLocalData(lastAccount, "MainlinePrologueLevel")
if sJson ~= nil then
local tb = decodeJson(sJson)
self.isThreePlayer = tb.isThreePlayer
self.revivalPoint = Vector3(tb.revivalPoint[1], tb.revivalPoint[2], tb.revivalPoint[3])
self.btnNames = tb.btnNames
self.tbSelectPerks = tb.tbSelectPerks
self.curFloorIdx = tb.curFloorIdx
self.bDesertComplete = tb.bDesertComplete
self.nCurAvgCmdIdx = tb.nCurAvgCmdIdx
self.bBattleEnd = tb.bBattleEnd
self.curCharId = tb.curCharId
self.curNpcRewardIdx = tb.curNpcRewardIdx
self.nBoxId = tb.nBoxId
else
self.isThreePlayer = false
self.revivalPoint = Vector3.zero
self.btnNames = nil
self.tbSelectPerks = {}
self.curFloorIdx = 1
self.bDesertComplete = false
self.nCurAvgCmdIdx = 0
self.bBattleEnd = false
self.curCharId = 0
self.curNpcRewardIdx = 1
self.nBoxId = 0
end
EventManager.Hit("MainlinePrologueLevelNextModule", self)
self:BindEvent()
self.parent = parent
self.bSettle = false
self.tbTrialId = {}
self.tbChar = {}
if not self.bDesertComplete then
CS.AdventureModuleHelper.EnterProloguelMap(PrologueSceneId)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
elseif self.bBattleEnd then
self:OnEvent_LevelStateChanged()
else
if #tbTrialCharacter[self.curFloorIdx] > 0 then
PlayerData.Char:CreateTrialChar(tbTrialCharacter[self.curFloorIdx])
for _, nTrialId in pairs(tbTrialCharacter[self.curFloorIdx]) do
if 0 < nTrialId then
local mapTrialChar = PlayerData.Char:GetTrialCharById(nTrialId)
table.insert(self.tbChar, mapTrialChar.nId)
table.insert(self.tbTrialId, nTrialId)
end
end
end
for _, nTrialId in ipairs(self.tbTrialId) do
if 0 < nTrialId then
local mapTrialChar = PlayerData.Char:GetTrialCharById(nTrialId)
local tbstInfo, stActorInfo, nHeartStoneLevel = self.CalCharFixedEffectTrial(nTrialId)
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, mapTrialChar.nId, stActorInfo)
end
end
self:SetFloor(2)
CS.AdventureModuleHelper.EnterProloguelBattleMap(tbAfterDesertFloor[self.curFloorIdx], self.tbChar, {}, self.isThreePlayer, self.revivalPoint, self.btnNames)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
end
function MainlinePrologueLevel:SetLocalData()
local mapLocalData = {
isThreePlayer = self.isThreePlayer,
revivalPoint = {
self.revivalPoint.x,
self.revivalPoint.y,
self.revivalPoint.z
},
btnNames = self.btnNames,
tbSelectPerks = self.tbSelectPerks,
curFloorIdx = self.curFloorIdx,
bDesertComplete = self.bDesertComplete,
nCurAvgCmdIdx = self.nCurAvgCmdIdx,
bBattleEnd = self.bBattleEnd,
curCharId = self.curCharId,
curNpcRewardIdx = self.curNpcRewardIdx,
nBoxId = self.nBoxId
}
local sJson = RapidJson.encode(mapLocalData)
local lastAccount = LocalData.GetLocalData("LoginUIData", "LastUserName_All")
LocalData.SetLocalData(lastAccount, "MainlinePrologueLevel", sJson)
end
function MainlinePrologueLevel:SetFloor(nType)
if self.curFloor ~= nil then
self.curFloor:Exit()
end
self.curFloor = nil
local luaPath = mapFloor[nType]
if luaPath == nil then
printError("no exist type:" .. nType)
luaPath = mapFloor[1]
end
local luaFile = require(luaPath)
local luaClass = luaFile.new(self)
luaClass:Enter()
self.curFloor = luaClass
end
function MainlinePrologueLevel:UnsetFloor()
if self.curFloor ~= nil then
self.curFloor:Exit()
end
self.curFloor = nil
end
function MainlinePrologueLevel: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 MainlinePrologueLevel: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 MainlinePrologueLevel.CalCharFixedEffectTrial(nTrialId)
local tbstInfo = {}
local tbEffectId = {}
local mapTrialChar = PlayerData.Char:GetTrialCharById(nTrialId)
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
local nHeartStoneLevel = PlayerData.Char:CalCharacterTrialAttrBattle(nTrialId, tbstInfo, stActorInfo)
return tbstInfo, stActorInfo, nHeartStoneLevel
end
function MainlinePrologueLevel:SetTheme()
safe_call_cs_func(CS.AdventureModuleHelper.SetRglTheme, tbTheme)
end
function MainlinePrologueLevel:SetThemePerk()
local tbThemePerkInfo = {}
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
for _, nPerkId in ipairs(self.tbSelectPerks) do
stPerkInfo.perkId = nPerkId
stPerkInfo.nCount = 1
table.insert(tbThemePerkInfo, stPerkInfo)
end
if 0 < #tbThemePerkInfo then
safe_call_cs_func(CS.AdventureModuleHelper.ChangeThemePerkIds, tbThemePerkInfo)
end
end
function MainlinePrologueLevel:GetRewardNpc(nNpcId, nNpcUid)
local function SelectPerkCallBack(_, tbResult)
EventManager.Remove(EventId.SelectPerk, self, SelectPerkCallBack)
self.curNpcRewardIdx = self.curNpcRewardIdx + 1
table.insert(self.tbSelectPerks, tbResult[1])
local tbThemePerkInfo = {}
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = tbResult[1]
stPerkInfo.nCount = 1
table.insert(tbThemePerkInfo, stPerkInfo)
safe_call_cs_func(CS.AdventureModuleHelper.ChangeThemePerkIds, tbThemePerkInfo)
local mapNpc = ConfigTable.GetData("NPC", nNpcId)
if mapNpc.completeDestroy then
safe_call_cs_func(CS.InteractiveManager.Instance.setInteractiveNpcState, CS.InteractiveManager.Instance, nNpcUid)
end
NovaAPI.DispatchEventWithData("PROLOGUELEVEL_SELECTPERK")
end
if tbSelectPerks[self.curNpcRewardIdx] == nil then
printError(string.format("没有第%d个奖励", self.curNpcRewardIdx))
return
end
local tbPerks = {}
for _, nPerkId in ipairs(tbSelectPerks[self.curNpcRewardIdx]) do
table.insert(tbPerks, {
Id = nPerkId,
Level = 1,
nMaxLevel = 3
})
end
local mapBag = {
mapPerk = {},
mapItem = {},
mapSlotPerk = {
[1] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[2] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[3] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[4] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
}
}
}
EventManager.Add(EventId.SelectPerk, self, SelectPerkCallBack)
EventManager.Hit(EventId.OpenPanel, PanelId.FRThemePerkSelect, {
{Perks = tbPerks, Theme = 0}
}, 0, mapBag, {}, true, true)
end
function MainlinePrologueLevel:GetRewardBox(nBoxId)
local function SelectPerkCallBack(_, tbResult)
EventManager.Remove(EventId.SelectPerk, self, SelectPerkCallBack)
self.curNpcRewardIdx = self.curNpcRewardIdx + 1
table.insert(self.tbSelectPerks, tbResult[1])
local tbThemePerkInfo = {}
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = tbResult[1]
stPerkInfo.nCount = 1
table.insert(tbThemePerkInfo, stPerkInfo)
safe_call_cs_func(CS.AdventureModuleHelper.ChangeThemePerkIds, tbThemePerkInfo)
local mapNpc = ConfigTable.GetData("NPC", nNpcId)
if mapNpc.completeDestroy then
safe_call_cs_func(CS.InteractiveManager.Instance.setInteractiveNpcState, CS.InteractiveManager.Instance, nNpcUid)
end
NovaAPI.DispatchEventWithData("PROLOGUELEVEL_SELECTPERK")
end
if mapBoxReward[self.nBoxId] == nil then
printError(string.format("没有配置宝箱id为%d的奖励", self.nBoxId))
return
end
local tbPerks = {}
for _, nPerkId in ipairs(mapBoxReward[self.nBoxId]) do
table.insert(tbPerks, {
Id = nPerkId,
Level = 1,
nMaxLevel = 3
})
end
local mapBag = {
mapPerk = {},
mapItem = {},
mapSlotPerk = {
[1] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[2] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[3] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
},
[4] = {
nPerkId = 0,
nQty = 0,
nMaxLevel = 0
}
}
}
EventManager.Add(EventId.SelectPerk, self, SelectPerkCallBack)
EventManager.Hit(EventId.OpenPanel, PanelId.FRThemePerkSelect, {
{Perks = tbPerks, Theme = 0}
}, 0, mapBag, {}, true, true)
end
function MainlinePrologueLevel:OnEvent_LevelStateChanged()
self.bDesertComplete = true
if 0 < #tbAfterDesertFloor and #tbAfterDesertFloor > self.curFloorIdx and not self.bBattleEnd then
self:ChangeFloor()
return
end
local function func_AvgEnd()
EventManager.Remove("StoryDialog_DialogEnd", self, func_AvgEnd)
NovaAPI.EnterModule("MainMenuModuleScene", true)
self.parent:LevelEnd()
end
local function UnloadCallback()
CS.GameCameraStackManager.Instance:CloseMainCamera(0.1)
CS.ClientManager.Instance:CloseLoadingView(nil)
PlayerData.Char:DeleteTrialChar()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, UnloadCallback)
local ModuleManager = require("GameCore.Module.ModuleManager")
if ModuleManager.GetIsAdventure() then
NovaAPI.InputDisable()
end
if self.sAfterBattleAvg ~= "" then
self.bBattleEnd = true
self:SetLocalData()
EventManager.Add("StoryDialog_DialogEnd", self, func_AvgEnd)
EventManager.Hit("StoryDialog_DialogStart", self.sAfterBattleAvg, nil, self.nCurAvgCmdIdx)
else
func_AvgEnd()
end
end
self:UnsetFloor()
local ModuleManager = require("GameCore.Module.ModuleManager")
if ModuleManager.GetIsAdventure() then
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, UnloadCallback)
CS.AdventureModuleHelper.LevelStateChanged(true)
NovaAPI.InputDisable()
else
UnloadCallback()
end
end
function MainlinePrologueLevel:OnEvent_ExitModule(_, sEnterModuleName)
end
function MainlinePrologueLevel:OnEvent_AfterEnterModule(sEnterModuleName)
if sEnterModuleName == "EmptyModuleScene" then
local wait = function()
self.bDesertComplete = true
self:SetLocalData()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self.tbChar = {}
self.tbTrialId = {}
if #tbTrialCharacter[self.curFloorIdx] > 0 then
PlayerData.Char:CreateTrialChar(tbTrialCharacter[self.curFloorIdx])
for _, nTrialId in pairs(tbTrialCharacter[self.curFloorIdx]) do
if 0 < nTrialId then
local mapTrialChar = PlayerData.Char:GetTrialCharById(nTrialId)
table.insert(self.tbChar, mapTrialChar.nId)
table.insert(self.tbTrialId, nTrialId)
end
end
end
for _, nTrialId in ipairs(self.tbTrialId) do
if 0 < nTrialId then
local mapTrialChar = PlayerData.Char:GetTrialCharById(nTrialId)
local tbstInfo, stActorInfo, nHeartStoneLevel = self.CalCharFixedEffectTrial(nTrialId)
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, mapTrialChar.nId, stActorInfo)
end
end
self:SetFloor(2)
CS.AdventureModuleHelper.EnterProloguelBattleMap(tbAfterDesertFloor[self.curFloorIdx], self.tbChar, {}, self.isThreePlayer, self.revivalPoint, self.btnNames)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
cs_coroutine.start(wait)
EventManager.Hit(EventId.CloesCurPanel)
end
end
function MainlinePrologueLevel:OnEvent_PrologueBattleReload()
local function levelUnloadCallback()
NovaAPI.EnterModule("EmptyModuleScene", true)
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelUnloadCallback)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelUnloadCallback)
CS.AdventureModuleHelper.LevelStateChanged(true)
end
function MainlinePrologueLevel:ChangeFloor()
local function levelUnloadCallback()
PlayerData.Char:DeleteTrialChar()
self.curFloorIdx = self.curFloorIdx + 1
NovaAPI.EnterModule("EmptyModuleScene", true)
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelUnloadCallback)
self.btnNames = {}
self.revivalPoint = Vector3.zero
self:SetLocalData()
end
local id = CS.AdventureModuleHelper.GetCurrentActivePlayer()
self.curCharId = CS.AdventureModuleHelper.GetCharacterId(id)
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelUnloadCallback)
self:UnsetFloor()
CS.AdventureModuleHelper.LevelStateChanged(true)
end
function MainlinePrologueLevel:OnEvent_LoadLevelRefresh()
if self.curFloorIdx > 0 then
for _, nTrialId in ipairs(self.tbTrialId) do
if 0 < nTrialId then
local tbstInfo, stActorInfo, nHeartStoneLevel = self.CalCharFixedEffectTrial(nTrialId)
end
end
end
end
function MainlinePrologueLevel:OnEvent_PrologueBattleArchive(isThreePlayer, revivalPoint, btnNames, nCmdId, nBoxId)
if nCmdId == -1 then
local lastAccount = LocalData.GetLocalData("LoginUIData", "LastUserName_All")
LocalData.SetLocalData(lastAccount, "MainlinePrologueLevel", "")
end
self.nBoxId = nBoxId
if isThreePlayer == nil then
end
self.isThreePlayer = isThreePlayer
self.revivalPoint = revivalPoint == nil and Vector3.zero or revivalPoint
btnNames = btnNames == nil and {
[0] = "",
Count = 1
} or btnNames
self.nCurAvgCmdIdx = nCmdId
local tbNames = {}
local nCount = btnNames.Count - 1
for i = 0, nCount do
table.insert(tbNames, btnNames[i])
end
self.btnNames = tbNames
self:SetLocalData()
end
function MainlinePrologueLevel:OnEvent_AdventureModuleEnter()
if self.bDesertComplete then
self:SetTheme()
self:SetThemePerk()
EventManager.Hit(EventId.OpenPanel, PanelId.Hud)
end
end
function MainlinePrologueLevel:OnEvent_EnterModule()
if not self.bDesertComplete then
EventManager.Hit(EventId.OpenPanel, PanelId.Prologue, self.tbChar)
else
EventManager.Hit(EventId.OpenPanel, PanelId.PrologueAdventurePanel, self.tbChar)
end
end
return MainlinePrologueLevel