Files
SL1900 8c4bd41668 Update - 1.13.0.124
EN: 1.13.0.124
CN: 1.13.0.124
JP: 1.13.0.128
KR: 1.13.0.130
2026-07-21 12:30:00 +09:00

1813 lines
57 KiB
Lua

local LocalData = require("GameCore.Data.LocalData")
local SDKManager = CS.SDKManager.Instance
local PB = require("pb")
local FP = CS.TrueSync.FP
local FDP = CS.TrueSync.FDP
local mapPrologueConfig = {
nDifficulty = 1,
tbStage = {99901},
FloorNum = {5},
tbTeam = {
103,
112,
111
},
tbDiscs = {},
tbEvent = {
{},
{},
{
{
Id = 3,
SelectPotentialCase = {
Infos = {
{Tid = 510307, Level = 1},
{Tid = 510302, Level = 1},
{Tid = 510312, Level = 1}
}
}
}
},
{
{
Id = 4,
SelectPotentialCase = {
Infos = {
{Tid = 510341, Level = 1},
{Tid = 510301, Level = 1},
{Tid = 510308, Level = 1}
}
}
},
{
Id = 5,
SelectPotentialCase = {
Infos = {
{Tid = 511125, Level = 1},
{Tid = 511121, Level = 1},
{Tid = 511130, Level = 1}
}
}
},
{
Id = 6,
SelectPotentialCase = {
Infos = {
{Tid = 511227, Level = 1},
{Tid = 511221, Level = 1},
{Tid = 511226, Level = 1}
}
}
}
},
{}
},
tbButton = {
{
"Fire2",
"Fire4",
"ActorSwitch1",
"ActorSwitch2",
"SwitchWithUltra1",
"SwitchWithUltra2"
},
{
"Fire1",
"Fire4",
"ActorSwitch1",
"ActorSwitch2",
"SwitchWithUltra1",
"SwitchWithUltra2"
},
{
"Fire4",
"ActorSwitch1",
"ActorSwitch2",
"SwitchWithUltra1",
"SwitchWithUltra2"
},
{
"ActorSwitch1",
"ActorSwitch2",
"SwitchWithUltra1",
"SwitchWithUltra2"
},
{}
},
tbLevel = {
{},
{},
{nLevel = 2, nExp = 1000},
{nLevel = 3, nExp = 1500},
{nLevel = 4, nExp = 1800},
{}
},
sAvgId1 = Settings.sPrologueAvgId1,
sVideoName = Settings.sPrologueVideo,
sAvgId2 = Settings.sPrologueAvgId2,
ClearVoice = {
"",
"",
"special_effect_slowmotion",
"special_effect_slowmotion",
"special_effect_slowmotion"
},
tEventIndex = {
[2] = 6,
[3] = 7,
[4] = 8,
[5] = 9
}
}
local StarTowerPrologueLevel = class("StarTowerPrologueLevel")
local LocalStarTowerDataKey = "StarTowerData"
local RapidJson = require("rapidjson")
local PATH = "Game.Adventure.StarTower.StarTowerRoom."
local mapProcCtrl = {
[GameEnum.starTowerRoomType.BattleRoom] = "BattleRoom",
[GameEnum.starTowerRoomType.EliteBattleRoom] = "BattleRoom",
[GameEnum.starTowerRoomType.BossRoom] = "BattleRoom",
[GameEnum.starTowerRoomType.FinalBossRoom] = "BattleRoom",
[GameEnum.starTowerRoomType.DangerRoom] = "BattleRoom",
[GameEnum.starTowerRoomType.HorrorRoom] = "BattleRoom"
}
local mapEventConfig = {
takeEffect = "OnEvent_TakeEffect",
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
AdventureModuleEnter = "OnEvent_AdventureModuleEnter",
[EventId.StarTowerMap] = "OnEvent_OpenStarTowerMap",
AbandonStarTower = "OnEvent_AbandonStarTower",
[EventId.StarTowerDepot] = "OnEvent_OpenStarTowerDepot",
FreezeFrameEnd = "OnEvent_FreezeFrameEnd",
[EventId.TransAnimOutClear] = "OnEvent_TransAnimOutClear"
}
local EncodeTempData = function(mapData)
local stTempData = CS.StarTowerTempData(1)
local stCharacter = {}
if mapData.effectInfo ~= nil then
for nCharId, mapEffect in pairs(mapData.effectInfo) do
if stCharacter[nCharId] == nil then
stCharacter[nCharId] = CS.StarTowerCharacter(nCharId)
end
for nEtfId, mapEft in pairs(mapEffect.mapEffect) do
stCharacter[nCharId].tbEffect:Add(CS.StarTowerEffect(nEtfId, mapEft.nCount, mapEft.nCd))
end
end
end
if mapData.buffInfo ~= nil then
for nCharId, mapBuff in pairs(mapData.buffInfo) do
if stCharacter[nCharId] == nil then
stCharacter[nCharId] = CS.StarTowerCharacter(nCharId)
end
for _, buffInfo in ipairs(mapBuff) do
stCharacter[nCharId].tbBuff:Add(CS.StarTowerBuffInfo(buffInfo.Id, buffInfo.CD, buffInfo.nNum))
end
end
end
if mapData.stateInfo ~= nil then
for nCharId, mapStatus in pairs(mapData.stateInfo) do
if stCharacter[nCharId] == nil then
stCharacter[nCharId] = CS.StarTowerCharacter(nCharId)
end
stCharacter[nCharId].stateInfo = CS.StarTowerState(mapStatus.nState, mapStatus.nStateTime)
end
end
if mapData.ammoInfo ~= nil then
for nCharId, mapAmmoInfo in pairs(mapData.ammoInfo) do
if stCharacter[nCharId] == nil then
stCharacter[nCharId] = CS.StarTowerCharacter(nCharId)
end
stCharacter[nCharId].ammoInfo = CS.StarTowerAmmoInfo(mapAmmoInfo.nCurAmmo, mapAmmoInfo.nAmmo1, mapAmmoInfo.nAmmo2, mapAmmoInfo.nAmmo3, mapAmmoInfo.nAmmoMax1, mapAmmoInfo.nAmmoMax2, mapAmmoInfo.nAmmoMax3)
end
end
if mapData.skillInfo ~= nil then
for _, skill in ipairs(mapData.skillInfo) do
stTempData.skillInfo:Add(CS.StarTowerSkill(skill.nCharId, skill.nSkillId, skill.nCd, skill.nSectionAmount, skill.nSectionResumeTime, skill.nUseTimeHint, skill.nEnergy))
end
end
for _, st in pairs(stCharacter) do
stTempData.characterInfo:Add(st)
end
local jsonData = NovaAPI.ParseStarTowerData(stTempData)
return jsonData
end
local DecodeTempData = function(sJsonChar)
local tempData = {}
tempData.skillInfo = {}
local stData = NovaAPI.DecodeStarTowerData(sJsonChar)
local nCount = stData.skillInfo.Count
for index = 0, nCount - 1 do
local stSkill = stData.skillInfo[index]
table.insert(tempData.skillInfo, {
nCharId = stSkill.nCharId,
nSkillId = stSkill.nSkillId,
nCd = stSkill.nCd,
nSectionAmount = stSkill.nSectionAmount,
nSectionResumeTime = stSkill.nSectionResumeTime,
nUseTimeHint = stSkill.nUseTimeHint,
nEnergy = stSkill.nEnergy
})
end
return tempData
end
function StarTowerPrologueLevel:ctor(parent)
self.nTransAnimOutClearCount = 1
self.EnumCase = {
Battle = 1,
OpenDoor = 2,
PotentialSelect = 3,
FateCardSelect = 4,
NoteSelect = 5,
NpcEvent = 6,
SelectSpecialPotential = 7,
RecoveryHP = 8,
NpcRecoveryHP = 9,
Hawker = 10,
StrengthenMachine = 11,
DoorDanger = 12
}
self:BindEvent()
local BuildStarTowerAllFloorData = function()
local ret = {}
local difficulty = mapPrologueConfig.nDifficulty
local tbStage = mapPrologueConfig.tbStage
local tbFloorNum = mapPrologueConfig.FloorNum
for nIdx, nStageGroupId in ipairs(tbStage) do
local nFloorNum = tbFloorNum[nIdx]
if nFloorNum == nil then
nFloorNum = 99
end
for nLevel = 1, nFloorNum do
local nStageLevelId = nStageGroupId * 100 + nLevel
if ConfigTable.GetData("StarTowerStage", nStageLevelId) == nil then
break
end
table.insert(ret, ConfigTable.GetData("StarTowerStage", nStageLevelId))
end
end
return ret, difficulty
end
self.bPrologue = true
self.parent = parent
self.nTowerId = 999
self.nCurLevel = 1
self.bRanking = false
self.tbStarTowerAllLevel, self.nStarTowerDifficulty = BuildStarTowerAllFloorData()
self.tbStrengthMachineCost = ConfigTable.GetConfigNumberArray("StrengthenMachineGoldConsume")
end
function StarTowerPrologueLevel:Exit()
self:UnBindEvent()
if self.curRoom ~= nil then
self.curRoom:Exit()
end
end
function StarTowerPrologueLevel: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 StarTowerPrologueLevel: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 StarTowerPrologueLevel:Init(mapMeta, mapRoom, mapLocalData, sJsonChar)
local GetCharacterAttr = function(tbTeam)
local ret = {}
for idx, nTid in ipairs(tbTeam) do
local stActorInfo = self.CalCharFixedEffect(nTid, idx == 1)
ret[nTid] = stActorInfo
end
return ret
end
self._mapNote = {
[90011] = 0,
[90012] = 0,
[90013] = 0,
[90014] = 0,
[90015] = 0
}
self._mapPotential = {}
self._mapFateCard = {}
self._mapItem = {}
self.nTowerId = mapMeta.Id
self.nCurLevel = mapRoom.Data.Floor
self.tbTeam = {}
for _, mapChar in ipairs(mapMeta.Chars) do
table.insert(self.tbTeam, mapChar.Id)
self._mapPotential[mapChar.Id] = {}
end
if mapLocalData.mapPotential ~= nil then
for _, tbData in ipairs(mapLocalData.mapPotential) do
if self._mapPotential[tbData[1]] == nil then
self._mapPotential[tbData[1]] = {}
end
self._mapPotential[tbData[1]][tbData[2]] = tbData[3]
end
end
if mapLocalData.mapFateCard ~= nil then
for _, tbData in ipairs(mapLocalData.mapFateCard) do
self._mapFateCard[tbData[1]] = {
tbData[2],
tbData[3]
}
end
end
self.tbDisc = mapMeta.Discs
self.curRoom = nil
self.mapFateCardUseCount = {}
self.nTeamLevel = mapLocalData.nLevel
self.nTeamExp = mapLocalData.nExp
self.nTotalTime = 0
self.mapCharacterTempData = DecodeTempData(sJsonChar)
self.mapEffectTriggerCount = {}
self.bBattleEnd = mapLocalData.bBattleEnd
self.tbEndCaseId = mapLocalData.tbEndCaseId
self.ActorHp = mapLocalData.ActorHp
if self.mapCharacterTempData.effectInfo ~= nil then
for _, mapData in pairs(self.mapCharacterTempData.effectInfo) do
if mapData.mapEffect ~= nil then
for nEftId, value in pairs(mapData.mapEffect) do
self.mapEffectTriggerCount[nEftId] = value.nCount
end
end
end
end
self.mapCharAttr = GetCharacterAttr(self.tbTeam)
self:SetRoguelikeHistoryMapId()
if #self.tbStarTowerAllLevel == 0 then
printError("StarTower Config Data Missing:" .. self.nTowerId)
end
self.curMapId = mapRoom.Data.MapId
self:SetRoguelikeHistoryMapId(self.curMapId)
local nNextRoomType = 0
local bFinal = false
if self.nCurLevel + 1 <= #self.tbStarTowerAllLevel then
local mapNextStage = self.tbStarTowerAllLevel[self.nCurLevel + 1]
nNextRoomType = mapNextStage.RoomType
else
bFinal = true
end
safe_call_cs_func(CS.AdventureModuleHelper.EnterStarTowerMap, self.nStarTowerDifficulty, false, bFinal, {
0,
0,
0
}, nNextRoomType)
local tbCase = {}
local mapStage = self.tbStarTowerAllLevel[self.nCurLevel]
if mapStage == nil or self.nCurLevel <= 2 then
table.insert(tbCase, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
table.insert(tbCase, {
Id = 2,
BattleCase = {TimeLimit = false, FateCard = false}
})
elseif mapStage.RoomType == GameEnum.starTowerRoomType.BattleRoom then
if self.bBattleEnd then
table.insert(tbCase, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
if mapPrologueConfig.tbEvent[self.nCurLevel] ~= nil then
for _, mapCaseData in ipairs(mapPrologueConfig.tbEvent[self.nCurLevel]) do
if 1 > table.indexof(self.tbEndCaseId, mapCaseData.Id) then
table.insert(tbCase, mapCaseData)
end
end
end
else
table.insert(tbCase, {
Id = 1,
BattleCase = {TimeLimit = false, FateCard = false}
})
end
else
table.insert(tbCase, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
end
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, tbCase, mapRoom.Data)
local tbButton = mapPrologueConfig.tbButton[self.nCurLevel]
if tbButton == nil then
tbButton = {}
end
safe_call_cs_func(CS.AdventureModuleHelper.SetProloguelBattleMsg, tbButton)
NovaAPI.EnterModule("AdventureModuleScene", true)
end
function StarTowerPrologueLevel:CheckDoorCase()
if mapPrologueConfig.tbEvent[self.nCurLevel] ~= nil then
for _, mapCaseData in ipairs(mapPrologueConfig.tbEvent[self.nCurLevel]) do
if table.indexof(self.tbEndCaseId, mapCaseData.Id) < 1 then
return false
end
end
end
return true
end
function StarTowerPrologueLevel:StarTowerInteract(mapMsgData, callback)
if self.bEnd then
return
end
local nExpChange = 0
local nLevelChange = 0
local nType, mapCase
local tbChangeFateCard = {}
local mapChangeNote = {}
local mapRewardChange = {}
if self.curRoom ~= nil then
nType, mapCase = self.curRoom:GetCaseById(mapMsgData.Id)
end
if nType ~= nil then
if nType == self.EnumCase.Battle then
self.bBattleEnd = true
local tbCase = {}
if mapPrologueConfig.tbEvent[self.nCurLevel] ~= nil then
for _, mapCaseData in ipairs(mapPrologueConfig.tbEvent[self.nCurLevel]) do
if table.indexof(self.tbEndCaseId, mapCaseData.Id) < 1 then
table.insert(tbCase, mapCaseData)
end
end
if mapPrologueConfig.ClearVoice[self.nCurLevel] ~= nil and mapPrologueConfig.ClearVoice[self.nCurLevel] ~= "" and not mapMsgData.BattleEndReq.Defeat then
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
WwiseAudioMgr:PostEvent(mapPrologueConfig.ClearVoice[self.nCurLevel])
end
end
local mapExpData = mapPrologueConfig.tbLevel[self.nCurLevel]
if mapExpData ~= nil then
if mapExpData.nExp ~= nil then
nExpChange = mapExpData.nExp - self.nTeamExp
self.nTeamExp = mapExpData.nExp
end
if mapExpData.nLevel ~= nil then
nLevelChange = mapExpData.nLevel - self.nTeamLevel
self.nTeamLevel = mapExpData.nLevel
end
end
local mapHp = self.GetActorHp()
local nHp
if mapHp ~= nil then
nHp = mapHp[self.ActorHp]
end
if nHp == nil then
nHp = -1
end
self.ActorHp = nHp
if self:CheckDoorCase() then
table.insert(tbCase, {
Id = 2,
DoorCase = {Floor = 1, Type = 1}
})
end
if self.curRoom ~= nil then
self.curRoom:SaveCase(tbCase)
end
elseif nType == self.EnumCase.PotentialSelect then
local tbPotential = mapCase.Infos
local nIdx = mapMsgData.SelectReq.Index + 1
local mapPotential = tbPotential[nIdx]
if mapPotential ~= nil then
local mapChangeInfo = {}
mapChangeInfo["proto.PotentialInfo"] = {
{
Tid = mapPotential.Tid,
Level = mapPotential.Level
}
}
tbChangeFateCard, mapChangeNote, mapRewardChange = self:ProcessChangeInfo(mapChangeInfo)
end
table.insert(self.tbEndCaseId, mapMsgData.Id)
if self:CheckDoorCase() then
local tbCase = {}
table.insert(tbCase, {
Id = 2,
DoorCase = {Floor = 1, Type = 1}
})
if self.curRoom ~= nil then
self.curRoom:SaveCase(tbCase)
end
end
elseif nType == self.EnumCase.FateCardSelect then
local tbFateCard = mapCase.Ids
local nIdx = mapMsgData.SelectReq.Index + 1
local nFateCardId = tbFateCard[nIdx]
if nFateCardId ~= nil then
local mapFateCardCfgData = ConfigTable.GetData("FateCard", nFateCardId)
if mapFateCardCfgData ~= nil then
local mapChangeInfo = {}
mapChangeInfo["proto.FateCardInfo"] = {
{
Tid = nFateCardId,
Remain = mapFateCardCfgData.Count,
Room = mapFateCardCfgData.ActiveNumber
}
}
tbChangeFateCard, mapChangeNote, mapRewardChange = self:ProcessChangeInfo(mapChangeInfo)
end
end
table.insert(self.tbEndCaseId, mapMsgData.Id)
if self:CheckDoorCase() then
local tbCase = {}
table.insert(tbCase, {
Id = 2,
DoorCase = {Floor = 1, Type = 1}
})
if self.curRoom ~= nil then
self.curRoom:SaveCase(tbCase)
end
end
end
end
if callback ~= nil and type(callback) == "function" then
local mapNetData = {
Id = mapMsgData.Id,
Settle = {}
}
callback(mapNetData, tbChangeFateCard, mapChangeNote, mapRewardChange, nLevelChange, nExpChange)
end
end
function StarTowerPrologueLevel:StarTowerClear()
local function onAvg2End()
EventManager.Remove("StoryDialog_DialogEnd", self, onAvg2End)
PlayerData.Guide:SetPlayerLearnReq(1, -1)
local tab_1 = {}
table.insert(tab_1, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
NovaAPI.UserEventUpload("chapter0_complete", tab_1)
local tbRewardList = {}
table.insert(tbRewardList, {
nId = 103,
bNew = true,
tbItemList = {}
})
table.insert(tbRewardList, {
nId = 111,
bNew = true,
tbItemList = {}
})
table.insert(tbRewardList, {
nId = 112,
bNew = true,
tbItemList = {}
})
local callback = function()
NovaAPI.EnterModule("MainMenuModuleScene", true, 17)
end
local tab = {}
table.insert(tab, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab, {
"newbie_tutorial_id",
"13"
})
NovaAPI.UserEventUpload("newbie_tutorial", tab)
EventManager.Hit(EventId.OpenPanel, PanelId.ReceiveSpecialReward, tbRewardList, callback)
end
local function onVideoEnd()
EventManager.Remove("VIDEO_END", self, onVideoEnd)
if mapPrologueConfig.sAvgId2 ~= "" and mapPrologueConfig.sAvgId2 ~= nil then
EventManager.Add("StoryDialog_DialogEnd", self, onAvg2End)
EventManager.Hit("StoryDialog_DialogStart", mapPrologueConfig.sAvgId2)
local tab_1 = {}
table.insert(tab_1, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab_1, {
"newbie_tutorial_id",
"12"
})
NovaAPI.UserEventUpload("newbie_tutorial", tab_1)
else
onAvg2End()
end
end
local function avgEndCallback()
EventManager.Remove("StoryDialog_DialogEnd", self, avgEndCallback)
EventManager.Add("VIDEO_END", self, onVideoEnd)
EventManager.Hit(EventId.OpenPanel, PanelId.ProVideoGUI, mapPrologueConfig.sVideoName, false, 0, false, 0, true)
local tab_1 = {}
table.insert(tab_1, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab_1, {
"newbie_tutorial_id",
"11"
})
NovaAPI.UserEventUpload("newbie_tutorial", tab_1)
end
local function levelEndCallback()
self.parent:StarTowerEnd()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
if mapPrologueConfig.sAvgId1 ~= "" and mapPrologueConfig.sAvgId1 ~= nil then
local tab = {}
table.insert(tab, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab, {
"newbie_tutorial_id",
"10"
})
NovaAPI.UserEventUpload("newbie_tutorial", tab)
EventManager.Add("StoryDialog_DialogEnd", self, avgEndCallback)
EventManager.Hit("StoryDialog_DialogStart", mapPrologueConfig.sAvgId1)
else
avgEndCallback()
end
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
CS.AdventureModuleHelper.LevelStateChanged(true)
end
function StarTowerPrologueLevel:EnterRoom()
if self.bEnd then
return
end
if self.curRoom ~= nil then
self.curRoom:Exit()
self.curRoom = nil
end
if self.nCurLevel + 1 > #self.tbStarTowerAllLevel then
self:StarTowerClear()
return
end
local tbHistoryMapId = self:GetRoguelikeHistoryMapId()
local tbCharSkinId = {}
for _, nCharId in ipairs(self.tbTeam) do
table.insert(tbCharSkinId, PlayerData.Char:GetCharSkinId(nCharId))
end
local stRoomMeta
self.nCurLevel = self.nCurLevel + 1
self.nTransAnimOutClearCount = 1
local tab = {}
table.insert(tab, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab, {
"newbie_tutorial_id",
tostring(mapPrologueConfig.tEventIndex[self.nCurLevel])
})
NovaAPI.UserEventUpload("newbie_tutorial", tab)
local nNextStage = self.tbStarTowerAllLevel[self.nCurLevel].Id
stRoomMeta = CS.Lua2CSharpInfo_FixedRoguelike(self.nTowerId, nNextStage, tbHistoryMapId, self.tbTeam, tbCharSkinId, 0, "", 0, -1, self.bRanking, 0)
local floorId
self.curMapId, floorId = safe_call_cs_func2(CS.AdventureModuleHelper.RandomStarTowerMap, stRoomMeta)
self:SetRoguelikeHistoryMapId(self.curMapId)
local function OnLevelUnloadComplete()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
self:OnEvent_AdventureModuleEnter()
end
local NetCallback = function(_, mapNetData)
if mapNetData.EnterResp == nil then
printError("房间数据返回为空")
return
end
self.bBattleEnd = false
local nNextRoomType = 0
local bFinal = false
if self.nCurLevel + 1 <= #self.tbStarTowerAllLevel then
local mapNextStage = self.tbStarTowerAllLevel[self.nCurLevel + 1]
nNextRoomType = mapNextStage.RoomType
else
bFinal = true
end
safe_call_cs_func(CS.AdventureModuleHelper.EnterStarTowerMap, self.nStarTowerDifficulty, false, bFinal, {
0,
0,
0
}, nNextRoomType)
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, mapNetData.EnterResp.Room.Cases, mapNetData.EnterResp.Room.Data)
local tbButton = mapPrologueConfig.tbButton[self.nCurLevel]
if tbButton == nil then
tbButton = {}
end
safe_call_cs_func(CS.AdventureModuleHelper.SetProloguelBattleMsg, tbButton)
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
safe_call_cs_func(CS.AdventureModuleHelper.LevelStateChanged, false)
end
local mapData = {
EnterResp = {
Room = {
Data = {
Floor = self.nCurLevel,
MapId = self.curMapId,
ParamId = floorId or 0
},
Cases = {}
}
}
}
local mapStage = self.tbStarTowerAllLevel[self.nCurLevel]
if mapStage == nil or self.nCurLevel <= 2 then
self.bBattleEnd = false
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
table.insert(mapData.EnterResp.Room.Cases, {
Id = 2,
BattleCase = {TimeLimit = false, FateCard = false}
})
elseif mapStage.RoomType == GameEnum.starTowerRoomType.BattleRoom then
self.bBattleEnd = false
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
BattleCase = {TimeLimit = false, FateCard = false}
})
else
self.bBattleEnd = true
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
end
for _, mapFateCardRemain in pairs(self._mapFateCard) do
if mapFateCardRemain[2] ~= nil and 0 < mapFateCardRemain[2] then
mapFateCardRemain[2] = mapFateCardRemain[2] - 1
end
end
NetCallback(nil, mapData)
self:SetLocalData()
end
function StarTowerPrologueLevel:StarTowerFailed()
if self.curRoom ~= nil then
self.curRoom:Exit()
self.curRoom = nil
end
local tbHistoryMapId = self:GetRoguelikeHistoryMapId()
local tbCharSkinId = {}
for _, nCharId in ipairs(self.tbTeam) do
table.insert(tbCharSkinId, PlayerData.Char:GetCharSkinId(nCharId))
end
local stRoomMeta
local nNextStage = self.tbStarTowerAllLevel[self.nCurLevel].Id
stRoomMeta = CS.Lua2CSharpInfo_FixedRoguelike(self.nTowerId, nNextStage, tbHistoryMapId, self.tbTeam, tbCharSkinId, 0, "", 0, -1, self.bRanking, 0)
local floorId
self.curMapId, floorId = safe_call_cs_func2(CS.AdventureModuleHelper.RandomStarTowerMap, stRoomMeta)
self:SetRoguelikeHistoryMapId(self.curMapId)
local function OnLevelUnloadComplete()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
self:OnEvent_AdventureModuleEnter()
end
local NetCallback = function(_, mapNetData)
if mapNetData.EnterResp == nil then
printError("房间数据返回为空")
return
end
self.bBattleEnd = false
local nNextRoomType = 0
local bFinal = false
if self.nCurLevel + 1 <= #self.tbStarTowerAllLevel then
local mapNextStage = self.tbStarTowerAllLevel[self.nCurLevel + 1]
nNextRoomType = mapNextStage.RoomType
else
bFinal = true
end
safe_call_cs_func(CS.AdventureModuleHelper.EnterStarTowerMap, self.nStarTowerDifficulty, false, bFinal, {
0,
0,
0
}, nNextRoomType)
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, mapNetData.EnterResp.Room.Cases, mapNetData.EnterResp.Room.Data)
local tbButton = mapPrologueConfig.tbButton[self.nCurLevel]
if tbButton == nil then
tbButton = {}
end
safe_call_cs_func(CS.AdventureModuleHelper.SetProloguelBattleMsg, tbButton)
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
safe_call_cs_func(CS.AdventureModuleHelper.LevelStateChanged, false)
end
local mapData = {
EnterResp = {
Room = {
Data = {
Floor = self.nCurLevel,
MapId = self.curMapId,
ParamId = floorId or 0
},
Cases = {}
}
}
}
local mapStage = self.tbStarTowerAllLevel[self.nCurLevel]
if mapStage == nil or self.nCurLevel <= 2 then
self.bBattleEnd = false
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
table.insert(mapData.EnterResp.Room.Cases, {
Id = 2,
BattleCase = {TimeLimit = false, FateCard = false}
})
elseif mapStage.RoomType == GameEnum.starTowerRoomType.BattleRoom then
self.bBattleEnd = false
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
BattleCase = {TimeLimit = false, FateCard = false}
})
else
self.bBattleEnd = true
table.insert(mapData.EnterResp.Room.Cases, {
Id = 1,
DoorCase = {Floor = 1, Type = 1}
})
end
NetCallback(nil, mapData)
self:SetLocalData()
end
function StarTowerPrologueLevel:ProcessChangeInfo(mapData)
local tbChangeFateCard = {}
local mapChangeNote = {}
local mapRewardChange = {}
if mapData["proto.FateCardInfo"] ~= nil then
for _, mapFateCardData in ipairs(mapData["proto.FateCardInfo"]) do
local nBeforeRoomCount = 0
local nBeforeEftCount = 0
if self._mapFateCard[mapFateCardData.Tid] ~= nil then
nBeforeRoomCount = self._mapFateCard[mapFateCardData.Tid][2]
nBeforeEftCount = self._mapFateCard[mapFateCardData.Tid][1]
end
if mapFateCardData.Qty == 0 then
self:RemoveFateCardEft(mapFateCardData.Tid)
self._mapFateCard[mapFateCardData.Tid] = nil
table.insert(tbChangeFateCard, {
mapFateCardData.Tid,
0,
0,
-1
})
else
local nCountSum = 0
if self._mapFateCard[mapFateCardData.Tid] == nil then
nCountSum = 1
end
self._mapFateCard[mapFateCardData.Tid] = {
mapFateCardData.Remain,
mapFateCardData.Room
}
if mapFateCardData.Room ~= 0 and mapFateCardData.Remain ~= 0 then
self:AddFateCardEft(mapFateCardData.Tid)
else
self:RemoveFateCardEft(mapFateCardData.Tid)
end
table.insert(tbChangeFateCard, {
mapFateCardData.Tid,
self._mapFateCard[mapFateCardData.Tid][1] - nBeforeEftCount,
self._mapFateCard[mapFateCardData.Tid][2] - nBeforeRoomCount,
nCountSum
})
end
end
end
if mapData["proto.PotentialInfo"] ~= nil then
for _, mapPotentialInfo in ipairs(mapData["proto.PotentialInfo"]) do
local mapPotentialCfgData = ConfigTable.GetData("Potential", mapPotentialInfo.Tid)
if mapPotentialCfgData == nil then
printError("PotentialCfgData Missing" .. mapPotentialInfo.Tid)
else
local nCharId = mapPotentialCfgData.CharId
if self._mapPotential[nCharId][mapPotentialInfo.Tid] == nil then
self._mapPotential[nCharId][mapPotentialInfo.Tid] = 0
end
self._mapPotential[nCharId][mapPotentialInfo.Tid] = self._mapPotential[nCharId][mapPotentialInfo.Tid] + mapPotentialInfo.Level
end
self:ChangePotential(mapPotentialInfo.Tid)
end
end
if mapData["proto.NoteInfo"] ~= nil then
for _, mapNoteInfo in ipairs(mapData["proto.NoteInfo"]) do
print(string.format("音符数量变化:%d,%d", mapNoteInfo.Tid, mapNoteInfo.Qty))
if self._mapNote[mapNoteInfo.Tid] == nil then
self._mapNote[mapNoteInfo.Tid] = 0
end
self._mapNote[mapNoteInfo.Tid] = self._mapNote[mapNoteInfo.Tid] + mapNoteInfo.Qty
if mapChangeNote[mapNoteInfo.Tid] == nil then
mapChangeNote[mapNoteInfo.Tid] = mapNoteInfo.Qty
else
mapChangeNote[mapNoteInfo.Tid] = mapChangeNote[mapNoteInfo.Tid] + mapNoteInfo.Qty
end
end
self:ResetNoteInfo()
self:ChangeNote()
end
if mapData["proto.TowerItemInfo"] ~= nil then
for _, mapItemInfo in ipairs(mapData["proto.TowerItemInfo"]) do
if self._mapItem[mapItemInfo.Tid] == nil then
self._mapItem[mapItemInfo.Tid] = 0
end
self._mapItem[mapItemInfo.Tid] = self._mapItem[mapItemInfo.Tid] + mapItemInfo.Qty
if mapRewardChange[mapItemInfo.Tid] == nil then
mapRewardChange[mapItemInfo.Tid] = mapItemInfo.Qty
else
mapRewardChange[mapItemInfo.Tid] = mapRewardChange[mapItemInfo.Tid] + mapItemInfo.Qty
end
end
end
if mapData["proto.TowerResInfo"] ~= nil then
for _, mapItemInfo in ipairs(mapData["proto.TowerResInfo"]) do
if self._mapItem[mapItemInfo.Tid] == nil then
self._mapItem[mapItemInfo.Tid] = 0
end
self._mapItem[mapItemInfo.Tid] = self._mapItem[mapItemInfo.Tid] + mapItemInfo.Qty
if mapRewardChange[mapItemInfo.Tid] == nil then
mapRewardChange[mapItemInfo.Tid] = mapItemInfo.Qty
else
mapRewardChange[mapItemInfo.Tid] = mapRewardChange[mapItemInfo.Tid] + mapItemInfo.Qty
end
end
end
return tbChangeFateCard, mapChangeNote, mapRewardChange
end
function StarTowerPrologueLevel:OnEvent_AdventureModuleEnter()
local mapDiscData = {}
for _, nDiscId in ipairs(self.tbDisc) do
mapDiscData[nDiscId] = PlayerData.Disc:GetDiscById(nDiscId)
end
local mapAddLevel = {}
for _, nCharId in ipairs(self.tbTeam) do
mapAddLevel[nCharId] = PlayerData.Char:GetCharEnhancedPotential(nCharId)
end
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerProloguePanel, self.tbTeam, self.tbDisc, {}, mapDiscData, mapAddLevel, self.nTowerId, 0)
EventManager.Hit("FirstInputEnable")
for nCharId, mapInfo in pairs(self.mapCharAttr) do
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, mapInfo)
end
self:ResetAmmo()
self:ResetSommon()
self:ResetPersonalPerk()
self:ResetFateCard()
self:ResetNoteInfo()
self:ResetDiscInfo()
end
function StarTowerPrologueLevel:OnEvent_LoadLevelRefresh()
self.mapFateCardUseCount = {}
self.mapPotentialEft, self.mapDiscEft, self.mapFateCardEft = self:ResetEffect()
if self.curRoom ~= nil then
self.curRoom:Enter()
end
self:SetActorHP()
self:ResetSkill()
end
function StarTowerPrologueLevel:OnEvent_TakeEffect(nCharId, EffectId)
if self.mapEffectTriggerCount == nil then
self.mapEffectTriggerCount = {}
end
if self.mapEffectTriggerCount[EffectId] == nil then
self.mapEffectTriggerCount[EffectId] = 0
end
self.mapEffectTriggerCount[EffectId] = self.mapEffectTriggerCount[EffectId] + 1
if self.mapFateCardEft[EffectId] ~= nil then
local nFateCardId = self.mapFateCardEft[EffectId].nFateCardId
if self.mapFateCardUseCount[nFateCardId] == nil then
self.mapFateCardUseCount[nFateCardId] = 0
end
self.mapFateCardUseCount[nFateCardId] = self.mapFateCardUseCount[nFateCardId] + 1
end
end
function StarTowerPrologueLevel:OnEvent_OpenStarTowerMap()
end
function StarTowerPrologueLevel:OnEvent_OpenStarTowerDepot()
EventManager.Hit("CloseStarTowerDepot")
end
function StarTowerPrologueLevel:OnEvent_AbandonStarTower()
end
function StarTowerPrologueLevel:OnEvent_FreezeFrameEnd()
if self.nCurLevel > 1 then
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
WwiseAudioMgr:PostEvent("special_effect_slowmotion_end")
end
end
function StarTowerPrologueLevel:OnEvent_TransAnimOutClear()
if (self.nCurLevel == 2 or self.nCurLevel == 5) and (self.nTransAnimOutClearCount == 1 or self.nTransAnimOutClearCount == 3) then
EventManager.Hit("InputEnable", false)
end
self.nTransAnimOutClearCount = self.nTransAnimOutClearCount + 1
end
function StarTowerPrologueLevel.GetActorHp()
local logStr = ""
local tbActorEntity = CS.AdventureModuleHelper.GetCurrentGroupPlayers()
local mapCurCharInfo = {}
local count = tbActorEntity.Count - 1
for i = 0, count do
local nCharId = CS.AdventureModuleHelper.GetCharacterId(tbActorEntity[i])
local hp = CS.AdventureModuleHelper.GetEntityHp(tbActorEntity[i])
mapCurCharInfo[nCharId] = hp
logStr = logStr .. string.format("EntityID:%d\t角色Id?%d\t角色血量:%d\n", tbActorEntity[i], nCharId, hp)
end
print(logStr)
return mapCurCharInfo
end
function StarTowerPrologueLevel:GetcurRoom()
if self.tbStarTowerAllLevel[self.nCurLevel] ~= nil then
local sRoomName = mapProcCtrl[self.tbStarTowerAllLevel[self.nCurLevel].RoomType]
if sRoomName == nil then
sRoomName = "EventRoom"
end
local fullPath = PATH .. sRoomName
print(fullPath)
local curRoom = require(fullPath)
return curRoom
else
printError("Stage Missing :" .. self.nCurLevel)
local sRoomName = "EventRoom"
local fullPath = PATH .. sRoomName
print(fullPath)
local curRoom = require(fullPath)
return curRoom
end
end
function StarTowerPrologueLevel:GetStageId(nFloor)
if self.tbStarTowerAllLevel[nFloor] ~= nil then
return self.tbStarTowerAllLevel[nFloor].Id
end
return 0
end
function StarTowerPrologueLevel:GetStageLevel(nStage)
for nLevel, mapStageData in ipairs(self.tbStarTowerAllLevel) do
if mapStageData.Id == nStage then
return nLevel
end
end
return 1
end
function StarTowerPrologueLevel:GetTeam()
return mapPrologueConfig.tbTeam
end
function StarTowerPrologueLevel:GetDiscs()
return mapPrologueConfig.tbDiscs
end
function StarTowerPrologueLevel:RemoveFateCardEft(nFateCardId)
local mapFateCardCfgData = ConfigTable.GetData("FateCard", nFateCardId)
if mapFateCardCfgData == nil then
printError("FateCardCfgData Missing:" .. nFateCardId)
else
local nEftId = mapFateCardCfgData.Id
if self.mapFateCardEft[nEftId] ~= nil then
for _, tbUid in ipairs(self.mapFateCardEft[nEftId].tbEftUid) do
UTILS.RemoveEffect(tbUid[1], tbUid[2])
end
self.mapFateCardEft[nEftId] = nil
end
end
end
function StarTowerPrologueLevel:AddFateCardEft(nFateCardId)
local mapFateCardCfgData = ConfigTable.GetData("FateCard", nFateCardId)
if mapFateCardCfgData == nil then
printError("FateCardCfgData Missing:" .. nFateCardId)
else
if self.mapFateCardEft[mapFateCardCfgData.ClientEffect] ~= nil then
return
end
if mapFateCardCfgData.ClientEffect == 0 then
return
end
local nReaminCount = mapFateCardCfgData.Count
if self._mapFateCard[nFateCardId] ~= nil then
nReaminCount = self._mapFateCard[nFateCardId][1]
end
if nReaminCount ~= 0 then
return
end
self.mapFateCardEft[mapFateCardCfgData.ClientEffect] = {
nFateCardId = nFateCardId,
tbEftUid = {}
}
for _, nCharId in ipairs(self.tbTeam) do
local nUid = UTILS.AddFateCardEft(nCharId, mapFateCardCfgData.ClientEffect, nReaminCount)
table.insert(self.mapFateCardEft[mapFateCardCfgData.ClientEffect].tbEftUid, nUid)
end
end
end
function StarTowerPrologueLevel:ChangePotential(nPotentialId)
local mapPotentialCfgData = ConfigTable.GetData("Potential", nPotentialId)
if mapPotentialCfgData == nil then
printError("PotentialCfgData Missing" .. nPotentialId)
return
end
local nCharId = mapPotentialCfgData.CharId
local nCount = 0
if self._mapPotential[nCharId][nPotentialId] ~= nil then
nCount = self._mapPotential[nCharId][nPotentialId]
end
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = nPotentialId
stPerkInfo.nCount = nCount
safe_call_cs_func(CS.AdventureModuleHelper.ChangePersonalPerkIds, {stPerkInfo}, nCharId)
if self.mapPotentialEft[nPotentialId] ~= nil then
for _, tbEft in ipairs(self.mapPotentialEft[nPotentialId]) do
UTILS.RemoveEffect(tbEft[1], tbEft[2])
end
self.mapPotentialEft[nPotentialId] = nil
end
if nCount < 1 then
return
end
local tbEft = {}
if mapPotentialCfgData.EffectId1 ~= 0 then
table.insert(tbEft, mapPotentialCfgData.EffectId1)
end
if mapPotentialCfgData.EffectId2 ~= 0 then
table.insert(tbEft, mapPotentialCfgData.EffectId2)
end
if mapPotentialCfgData.EffectId3 ~= 0 then
table.insert(tbEft, mapPotentialCfgData.EffectId3)
end
if mapPotentialCfgData.EffectId4 ~= 0 then
table.insert(tbEft, mapPotentialCfgData.EffectId4)
end
for _, nCharTid in ipairs(self.tbTeam) do
for _, nEftId in ipairs(tbEft) do
self.mapPotentialEft[nPotentialId] = {}
local nEftUseCount = self.mapEffectTriggerCount[nEftId]
if nEftUseCount == nil then
nEftUseCount = 0
end
local nEftUid = UTILS.AddEffect(nCharId, nEftId, nCount, nEftUseCount)
table.insert(self.mapPotentialEft[nPotentialId], {nEftUid, nCharTid})
end
end
end
function StarTowerPrologueLevel:ChangeNote()
local checkHas = function(tbDiscEft, nEftId)
for _, v in pairs(tbDiscEft) do
if v[1] == nEftId then
return true
end
end
return false
end
for k, nDiscId in ipairs(self.tbDisc) do
if k <= 3 then
if self.mapDiscEft[nDiscId] == nil then
self.mapDiscEft[nDiscId] = {}
end
local mapDiscData = PlayerData.Disc:GetDiscById(nDiscId)
if mapDiscData ~= nil then
local tbDiscEft = mapDiscData:GetSkillEffect(self._mapNote)
for _, mapEft in ipairs(tbDiscEft) do
if self.mapDiscEft[nDiscId][mapEft[1]] == nil then
self.mapDiscEft[nDiscId][mapEft[1]] = {}
local nEftUseCount = self.mapEffectTriggerCount[mapEft[1]]
if nEftUseCount == nil then
nEftUseCount = 0
end
for _, nCharId in ipairs(self.tbTeam) do
local nEftUid = UTILS.AddEffect(nCharId, mapEft[1], mapEft[2], nEftUseCount)
table.insert(self.mapDiscEft[nDiscId][mapEft[1]], {nEftUid, nCharId})
end
end
end
local tbRemoveEft = {}
for nEftId, tbEft in pairs(self.mapDiscEft[nDiscId]) do
if not checkHas(tbDiscEft, nEftId) then
table.insert(tbRemoveEft, nEftId)
for _, tbEftData in ipairs(tbEft) do
UTILS.RemoveEffect(tbEftData[1], tbEftData[2])
end
end
end
for _, nEftId in ipairs(tbRemoveEft) do
self.mapDiscEft[nDiscId][nEftId] = nil
end
end
end
end
end
function StarTowerPrologueLevel:GetFateCardUsage()
local ret = {}
for nFateCardId, nCount in pairs(self.mapFateCardUseCount) do
table.insert(ret, {Id = nFateCardId, Times = nCount})
end
return ret
end
function StarTowerPrologueLevel:GetDamageRecord()
local ret = {}
for _, nCharId in pairs(self.tbTeam) do
local nDamage = safe_call_cs_func(CS.AdventureModuleHelper.GetCharacterDamage, nCharId, false)
table.insert(ret, nDamage)
end
safe_call_cs_func(CS.AdventureModuleHelper.ClearCharacterDamageRecord, false)
return ret
end
function StarTowerPrologueLevel.CheckBattleEnd(tbCases)
for _, mapCases in ipairs(tbCases) do
if mapCases.BattleCase ~= nil then
return false
end
end
return true
end
function StarTowerPrologueLevel:RecoverHp(nEffectId)
local nCharId = self.tbTeam[1]
print("AddRecoverEft:" .. nEffectId)
UTILS.AddEffect(nCharId, nEffectId, 0, 0)
local mapHp = self.GetActorHp()
local nHp
if mapHp ~= nil then
nHp = mapHp[nCharId]
end
if nHp == nil then
nHp = -1
end
return nHp
end
function StarTowerPrologueLevel:CalBuildScore()
local nPotentialScore = 0
for _, tbPotentialInfo in pairs(self._mapPotential) do
for nPotentialId, nPotentialLevel in pairs(tbPotentialInfo) do
local mapPotentialCfgData = ConfigTable.GetData("Potential", nPotentialId)
if nil ~= mapPotentialCfgData and 0 < nPotentialLevel then
nPotentialScore = nPotentialScore + mapPotentialCfgData.BuildScore[nPotentialLevel]
end
end
end
local nDiscScore = 0
for k, nDiscId in ipairs(self.tbDisc) do
if 0 ~= nDiscId and k <= 3 then
nDiscScore = nDiscScore + PlayerData.Disc:GetDiscSkillScore(nDiscId, self._mapNote)
end
end
local nNoteScore = 0
for nNoteId, nNoteCount in pairs(self._mapNote) do
if 0 < nNoteCount then
local mapCfg = ConfigTable.GetData("SubNoteSkill", nNoteId)
if mapCfg and next(mapCfg.Scores) ~= nil then
local nMax = #mapCfg.Scores
local nLevel = nNoteCount > nMax and nMax or nNoteCount
nNoteScore = nNoteScore + mapCfg.Scores[nLevel]
end
end
end
return nPotentialScore + nDiscScore + nNoteScore
end
function StarTowerPrologueLevel:SetRoguelikeHistoryMapId(nMapId)
local LocalData = require("GameCore.Data.LocalData")
if nMapId == nil then
LocalData.SetPlayerLocalData(LocalStarTowerDataKey, RapidJson.encode({}))
return
end
local tbHistoryMap
local tbTemp = {}
local nHistoryMapCount = ConfigTable.GetConfigNumber("StarTowerHistoryMapLimit")
local sJsonRoguelikeData = LocalData.GetPlayerLocalData(LocalStarTowerDataKey)
if type(sJsonRoguelikeData) == "string" and sJsonRoguelikeData ~= "" then
tbHistoryMap = RapidJson.decode(sJsonRoguelikeData)
else
tbHistoryMap = {}
end
if nHistoryMapCount > #tbHistoryMap then
table.insert(tbHistoryMap, nMapId)
else
table.remove(tbHistoryMap, 1)
table.insert(tbHistoryMap, nMapId)
end
for _, mapId in ipairs(tbHistoryMap) do
table.insert(tbTemp, mapId)
end
local sJsonRoguelikeDataAfter = RapidJson.encode(tbTemp)
LocalData.SetPlayerLocalData(LocalStarTowerDataKey, sJsonRoguelikeDataAfter)
end
function StarTowerPrologueLevel:GetRoguelikeHistoryMapId()
local LocalData = require("GameCore.Data.LocalData")
local sJsonRoguelikeData = LocalData.GetPlayerLocalData(LocalStarTowerDataKey)
if type(sJsonRoguelikeData) == "string" and sJsonRoguelikeData ~= "" then
local tbHistoryMap = RapidJson.decode(sJsonRoguelikeData)
return tbHistoryMap
else
return {}
end
end
function StarTowerPrologueLevel:CacheTempData()
local FP = CS.TrueSync.FP
self.mapCharacterTempData = {}
local AdventureModuleHelper = CS.AdventureModuleHelper
local id = AdventureModuleHelper.GetCurrentActivePlayer()
self.mapCharacterTempData.curCharId = CS.AdventureModuleHelper.GetCharacterId(id)
self.mapCharacterTempData.skillInfo = {}
self.mapCharacterTempData.effectInfo = {}
self.mapCharacterTempData.buffInfo = {}
self.mapCharacterTempData.stateInfo = {}
self.mapCharacterTempData.ammoInfo = {}
self.mapCharacterTempData.sommonInfo = AdventureModuleHelper.GetSummonMonsterInfos()
local playerids = AdventureModuleHelper.GetCurrentGroupPlayers()
local Count = playerids.Count - 1
for i = 0, Count do
local charTid = AdventureModuleHelper.GetCharacterId(playerids[i])
local clsSkillId = AdventureModuleHelper.GetPlayerSkillCd(playerids[i])
local nStatus = AdventureModuleHelper.GetPlayerActorStatus(playerids[i])
local nStatusTime = AdventureModuleHelper.GetPlayerActorSpecialStatusTime(playerids[i])
local tbAmmo = AdventureModuleHelper.GetPlayerActorAmmoCount(playerids[i])
local nAmmoType = AdventureModuleHelper.GetPlayerActorAmmoType(playerids[i])
print(string.format("Status:%d,Time:%d", nStatus, nStatusTime))
if clsSkillId ~= nil then
local tbSkillInfos = clsSkillId.skillInfos
local nSkillCount = tbSkillInfos.Count - 1
for j = 0, nSkillCount do
local clsSkillInfo = tbSkillInfos[j]
local mapSkill = ConfigTable.GetData_Skill(clsSkillInfo.skillId)
if mapSkill == nil then
return
end
if not mapSkill.IsCleanSkillCD then
table.insert(self.mapCharacterTempData.skillInfo, {
nCharId = charTid,
nSkillId = clsSkillInfo.skillId,
nCd = clsSkillInfo.currentUseInterval.RawValue,
nSectionAmount = clsSkillInfo.currentSectionAmount,
nSectionResumeTime = clsSkillInfo.currentResumeTime.RawValue,
nUseTimeHint = clsSkillInfo.currentUseTimeHint.RawValue,
nEnergy = clsSkillInfo.currentEnergy._raw
})
end
end
end
self.mapCharacterTempData.effectInfo[charTid] = {
mapEffect = {}
}
local tbClsEfts = AdventureModuleHelper.GetEffectList(playerids[i])
if tbClsEfts ~= nil then
local nEftCount = tbClsEfts.Count - 1
for k = 0, nEftCount do
local eftInfo = tbClsEfts[k]
local mapEft = ConfigTable.GetData_Effect(eftInfo.effectConfig.Id)
if mapEft == nil then
return
end
local nCd = eftInfo.CD.RawValue
if mapEft.Remove and 0 < nCd then
self.mapCharacterTempData.effectInfo[charTid].mapEffect[eftInfo.effectConfig.Id] = {nCount = 0, nCd = nCd}
end
end
end
if self.mapEffectTriggerCount ~= nil then
for nEftId, nCount in pairs(self.mapEffectTriggerCount) do
if self.mapCharacterTempData.effectInfo[charTid].mapEffect[nEftId] == nil then
self.mapCharacterTempData.effectInfo[charTid].mapEffect[nEftId] = {nCount = nCount, nCd = 0}
else
self.mapCharacterTempData.effectInfo[charTid].mapEffect[nEftId].nCount = nCount
end
end
end
local tbBuffInfo = AdventureModuleHelper.GetEntityBuffList(playerids[i])
self.mapCharacterTempData.buffInfo[charTid] = {}
if tbBuffInfo ~= nil then
local nBuffCount = tbBuffInfo.Count - 1
for l = 0, nBuffCount do
local eftInfo = tbBuffInfo[l]
local mapBuff = ConfigTable.GetData_Buff(eftInfo.buffConfig.Id)
if mapBuff == nil then
return
end
if mapBuff.NotRemove then
table.insert(self.mapCharacterTempData.buffInfo[charTid], {
Id = eftInfo.buffConfig.Id,
CD = eftInfo:GetBuffLeftTime().RawValue,
nNum = eftInfo:GetBuffNum()
})
end
end
end
self.mapCharacterTempData.stateInfo[charTid] = {nState = nStatus, nStateTime = nStatusTime}
if tbAmmo ~= nil then
self.mapCharacterTempData.ammoInfo[charTid] = {}
self.mapCharacterTempData.ammoInfo[charTid].nCurAmmo = nAmmoType
self.mapCharacterTempData.ammoInfo[charTid].nAmmo1 = tbAmmo[0]
self.mapCharacterTempData.ammoInfo[charTid].nAmmo2 = tbAmmo[1]
self.mapCharacterTempData.ammoInfo[charTid].nAmmo3 = tbAmmo[2]
if tbAmmo.Length >= 6 then
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax1 = tbAmmo[3]
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax2 = tbAmmo[4]
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax3 = tbAmmo[5]
else
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax1 = 0
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax2 = 0
self.mapCharacterTempData.ammoInfo[charTid].nAmmoMax3 = 0
end
end
end
end
function StarTowerPrologueLevel.CalCharFixedEffect(nCharId, bMainChar)
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
PlayerData.Char:CalCharacterAttrBattle(nCharId, stActorInfo, bMainChar)
return stActorInfo
end
function StarTowerPrologueLevel:ResetAmmo()
if self.mapCharacterTempData.ammoInfo ~= nil then
local ret = {}
for nCharId, mapAmmo in ipairs(self.mapCharacterTempData.ammoInfo) do
local stInfo = CS.Lua2CSharpInfo_ActorAmmoInfo()
local tbAmmoCount = {
stInfo.nAmmo1,
stInfo.nAmmo2,
stInfo.nAmmo3,
stInfo.nAmmoMax1,
stInfo.nAmmoMax2,
stInfo.nAmmoMax3
}
stInfo.actorID = nCharId
stInfo.ammoCount = tbAmmoCount
stInfo.ammoType = mapAmmo.nCurAmmo
table.insert(ret, stInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.ResetActorSkillInfo, ret)
end
end
function StarTowerPrologueLevel:ResetSommon()
if self.mapCharacterTempData.sommonInfo ~= nil then
safe_call_cs_func(CS.AdventureModuleHelper.SetSummonMonsters, self.mapCharacterTempData.sommonInfo)
end
end
function StarTowerPrologueLevel:ResetEffect()
local retPotential = {}
local retDisc = {}
local retFateCard = {}
local mapCharEffect = {}
for _, nCharId in ipairs(self.tbTeam) do
mapCharEffect[nCharId] = {}
mapCharEffect[nCharId][AllEnum.EffectType.Affinity] = PlayerData.Char:CalcAffinityEffect(nCharId)
mapCharEffect[nCharId][AllEnum.EffectType.Talent] = PlayerData.Char:CalcTalentEffect(nCharId)
if self._mapPotential[nCharId] ~= nil then
for nPotentialId, nPotentialCount in pairs(self._mapPotential[nCharId]) do
if mapCharEffect[nCharId][AllEnum.EffectType.Potential] == nil then
mapCharEffect[nCharId][AllEnum.EffectType.Potential] = {}
end
local mapPotentialCfgData = ConfigTable.GetData("Potential", nPotentialId)
if mapPotentialCfgData == nil then
printError("Potential CfgData Missing:" .. nPotentialId)
else
mapCharEffect[nCharId][AllEnum.EffectType.Potential][nPotentialId] = {
{},
nPotentialCount
}
if mapPotentialCfgData.EffectId1 ~= 0 then
table.insert(mapCharEffect[nCharId][AllEnum.EffectType.Potential][nPotentialId][1], mapPotentialCfgData.EffectId1)
end
if mapPotentialCfgData.EffectId2 ~= 0 then
table.insert(mapCharEffect[nCharId][AllEnum.EffectType.Potential][nPotentialId][1], mapPotentialCfgData.EffectId2)
end
if mapPotentialCfgData.EffectId3 ~= 0 then
table.insert(mapCharEffect[nCharId][AllEnum.EffectType.Potential][nPotentialId][1], mapPotentialCfgData.EffectId3)
end
if mapPotentialCfgData.EffectId4 ~= 0 then
table.insert(mapCharEffect[nCharId][AllEnum.EffectType.Potential][nPotentialId][1], mapPotentialCfgData.EffectId4)
end
end
end
end
end
local mapDiscEffect = {}
for k, nDiscId in ipairs(self.tbDisc) do
if k <= 3 then
local mapDiscData = PlayerData.Disc:GetDiscById(nDiscId)
if mapDiscData ~= nil then
local tbDiscEft = mapDiscData:GetSkillEffect(self._mapNote)
mapDiscEffect[nDiscId] = tbDiscEft
end
end
end
local mapFateCardEffect = {}
for nFateCardId, tbRemain in pairs(self._mapFateCard) do
if tbRemain[1] ~= 0 and tbRemain[2] ~= 0 then
local mapFateCardCfgData = ConfigTable.GetData("FateCard", nFateCardId)
if mapFateCardCfgData == nil then
printError("FateCardCfgData Missing:" .. nFateCardId)
elseif mapFateCardCfgData.ClientEffect == 0 then
print("FateCardCfgData no clientEft:" .. nFateCardId)
else
mapFateCardEffect[nFateCardId] = {
mapFateCardCfgData.ClientEffect,
tbRemain[2]
}
end
end
end
for _, nCharId in ipairs(self.tbTeam) do
if mapCharEffect[nCharId][AllEnum.EffectType.Affinity] ~= nil then
for _, nEftId in ipairs(mapCharEffect[nCharId][AllEnum.EffectType.Affinity]) do
local nEftUseCount = self.mapEffectTriggerCount[nEftId]
if nEftUseCount == nil then
nEftUseCount = 0
end
UTILS.AddEffect(nCharId, nEftId, 0, nEftUseCount)
end
end
if mapCharEffect[nCharId][AllEnum.EffectType.Talent] ~= nil then
for _, nEftId in ipairs(mapCharEffect[nCharId][AllEnum.EffectType.Talent]) do
local nEftUseCount = self.mapEffectTriggerCount[nEftId]
if nEftUseCount == nil then
nEftUseCount = 0
end
UTILS.AddEffect(nCharId, nEftId, 0, nEftUseCount)
end
end
if mapCharEffect[nCharId][AllEnum.EffectType.Potential] ~= nil then
for nPotentialId, tbPotentialData in pairs(mapCharEffect[nCharId][AllEnum.EffectType.Potential]) do
for _, nEftId in ipairs(tbPotentialData[1]) do
if retPotential[nPotentialId] == nil then
retPotential[nPotentialId] = {}
end
local nEftUseCount = self.mapEffectTriggerCount[nEftId]
if nEftUseCount == nil then
nEftUseCount = 0
end
local nEftUid = UTILS.AddEffect(nCharId, nEftId, tbPotentialData[2], nEftUseCount)
table.insert(retPotential[nPotentialId], {nEftUid, nCharId})
end
end
end
for nDiscId, tbDiscEft in pairs(mapDiscEffect) do
if retDisc[nDiscId] == nil then
retDisc[nDiscId] = {}
end
for _, mapEft in ipairs(tbDiscEft) do
if retDisc[nDiscId][mapEft[1]] == nil then
retDisc[nDiscId][mapEft[1]] = {}
end
local nEftUseCount = self.mapEffectTriggerCount[mapEft[1]]
if nEftUseCount == nil then
nEftUseCount = 0
end
local nEftUid = UTILS.AddEffect(nCharId, mapEft[1], mapEft[2], nEftUseCount)
table.insert(retDisc[nDiscId][mapEft[1]], {nEftUid, nCharId})
end
end
for nFateCardId, tbFateCardEft in pairs(mapFateCardEffect) do
if retFateCard[nFateCardId] == nil then
retFateCard[nFateCardId] = {}
end
local nEftUid = UTILS.AddFateCardEft(nCharId, tbFateCardEft[1], tbFateCardEft[2])
if retFateCard[tbFateCardEft[1]] == nil then
retFateCard[tbFateCardEft[1]] = {
nFateCardId = nFateCardId,
tbEftUid = {}
}
end
table.insert(retFateCard[tbFateCardEft[1]].tbEftUid, {nEftUid, nCharId})
end
end
return retPotential, retDisc, retFateCard
end
function StarTowerPrologueLevel:ResetPersonalPerk()
for nCharId, mapPotential in pairs(self._mapPotential) do
local tbStInfo = {}
for nPotentialId, nCount in pairs(mapPotential) do
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = nPotentialId
stPerkInfo.nCount = nCount
table.insert(tbStInfo, stPerkInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.ChangePersonalPerkIds, tbStInfo, nCharId)
end
end
function StarTowerPrologueLevel:ResetFateCard()
local tbFCInfo = {}
for i, v in pairs(self._mapFateCard) do
if v[1] ~= 0 and v[2] ~= 0 then
local cardInfo = ConfigTable.GetData("FateCard", i)
if cardInfo == nil then
return
end
if cardInfo.ThemeType ~= 0 then
local fcInfo = CS.Lua2CSharpInfo_FateCardThemeInfo()
fcInfo.theme = cardInfo.ThemeType
fcInfo.rank = cardInfo.ThemeValue
fcInfo.triggerTypes = cardInfo.ThemeTriggerType
table.insert(tbFCInfo, fcInfo)
end
end
end
safe_call_cs_func(CS.AdventureModuleHelper.SetFateCardThemes, tbFCInfo)
end
function StarTowerPrologueLevel:ResetNoteInfo()
local tbNoteInfo = {}
for i, v in pairs(self._mapNote) do
local noteInfo = CS.Lua2CSharpInfo_NoteInfo()
noteInfo.noteId = i
noteInfo.noteCount = v
table.insert(tbNoteInfo, noteInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.SetNoteInfo, tbNoteInfo)
end
function StarTowerPrologueLevel:ResetDiscInfo()
local tbDiscInfo = {}
for k, nDiscId in ipairs(self.tbDisc) do
if k <= 3 then
local mapDiscData = PlayerData.Disc:GetDiscById(nDiscId)
if mapDiscData ~= nil then
local discInfo = mapDiscData:GetDiscInfo(self._mapNote)
table.insert(tbDiscInfo, discInfo)
end
end
end
safe_call_cs_func(CS.AdventureModuleHelper.SetDiscInfo, tbDiscInfo)
end
function StarTowerPrologueLevel:ResetSkill()
local ret = {}
if self.mapCharacterTempData.skillInfo ~= nil then
for _, skillInfo in ipairs(self.mapCharacterTempData.skillInfo) do
local stSkillInfo = CS.Lua2CSharpInfo_ResetSkillInfo()
stSkillInfo.skillId = skillInfo.nSkillId
stSkillInfo.currentSectionAmount = skillInfo.nSectionAmount
stSkillInfo.cd = skillInfo.nCd
stSkillInfo.currentResumeTime = skillInfo.nSectionResumeTime
stSkillInfo.currentUseTimeHint = skillInfo.nUseTimeHint
stSkillInfo.energy = skillInfo.nEnergy
if ret[skillInfo.nCharId] == nil then
ret[skillInfo.nCharId] = {}
end
table.insert(ret[skillInfo.nCharId], stSkillInfo)
end
end
safe_call_cs_func(CS.AdventureModuleHelper.ResetActorSkillInfo, ret)
end
function StarTowerPrologueLevel:SetActorHP()
local tbActorInfo = {}
local stCharInfo = CS.Lua2CSharpInfo_ActorAttribute()
stCharInfo.actorID = mapPrologueConfig.tbTeam[1]
stCharInfo.curHP = self.ActorHp
table.insert(tbActorInfo, stCharInfo)
safe_call_cs_func(CS.AdventureModuleHelper.ResetActorAttributes, {stCharInfo})
end
function StarTowerPrologueLevel:SetLocalData()
local tbPotential = {}
for nCharId, mapPotential in pairs(self._mapPotential) do
for nPotentialId, nCount in pairs(mapPotential) do
table.insert(tbPotential, {
nCharId,
nPotentialId,
nCount
})
end
end
local tbFateCard = {}
for nFateCardId, tbRemain in pairs(self._mapFateCard) do
table.insert(tbFateCard, {
nFateCardId,
tbRemain[1],
tbRemain[2]
})
end
local mapLocalData = {
mapFateCard = tbFateCard,
mapPotential = tbPotential,
nLevel = self.nTeamLevel,
nExp = self.nTeamExp,
bBattleEnd = self.bBattleEnd,
tbEndCaseId = self.tbEndCaseId,
nCurFloor = self.nCurLevel,
ActorHp = self.ActorHp
}
local sJson = RapidJson.encode(mapLocalData)
local sJsonCharacter = EncodeTempData(self.mapCharacterTempData)
local lastAccount = LocalData.GetLocalData("LoginUIData", "LastUserName_All")
LocalData.SetLocalData(lastAccount, "StarTowerPrologueLevel", sJson)
LocalData.SetLocalData(lastAccount, "StarTowerPrologueLevelChar", sJsonCharacter)
end
function StarTowerPrologueLevel:GetRecommondPotential(tbPotentialData)
local tbPotential = {}
for _, mapData in ipairs(tbPotentialData) do
table.insert(tbPotential, mapData.Id)
end
local ret = {}
local curRarity = 999
for _, nPotentialId in ipairs(tbPotential) do
local itemCfg = ConfigTable.GetData("Item", nPotentialId)
if itemCfg ~= nil then
local nRarity = itemCfg.Rarity
if itemCfg.Stype == GameEnum.itemStype.SpecificPotential then
nRarity = 0
end
if curRarity > nRarity then
ret = {}
curRarity = nRarity
table.insert(ret, {nId = nPotentialId})
elseif nRarity == curRarity then
table.insert(ret, {nId = nPotentialId})
end
end
end
if #ret < 2 then
return ret
end
local ret1 = {}
local nCurCharId = 0
local nCurCount = -1
local GetCharacterPotentialCount = function(nCharId)
local ret = 0
if self._mapPotential[nCharId] ~= nil then
for _, nCount in pairs(self._mapPotential[nCharId]) do
ret = ret + nCount
end
end
return ret
end
for _, v in ipairs(ret) do
local nPotentialId = v.nId
local potentialCfg = ConfigTable.GetData("Potential", nPotentialId)
if potentialCfg ~= nil then
local nCharId = potentialCfg.CharId
local nCount = GetCharacterPotentialCount(nCharId)
if nCurCount < 0 then
nCurCharId = nCharId
nCurCount = nCount
table.insert(ret1, {nId = nPotentialId})
elseif nCharId ~= nCurCharId and nCount < nCurCount then
ret1 = {}
nCurCharId = nCharId
nCurCount = nCount
table.insert(ret1, {nId = nPotentialId})
else
table.insert(ret1, {nId = nPotentialId})
end
end
end
if #ret1 < 2 then
return ret1
end
local ret2 = {}
local nCurBuildCount = -1
local GetPotentialBuildCount = function(nPotnetialId)
local ret = 0
local potentialCfg = ConfigTable.GetData("Potential", nPotnetialId)
if potentialCfg ~= nil then
local nCharId = potentialCfg.CharId
for nId, nCount in pairs(self._mapPotential[nCharId]) do
local mapCfg = ConfigTable.GetData("Potential", nId)
if mapCfg ~= nil and mapCfg.Build == potentialCfg.Build then
ret = ret + 1
end
end
end
return ret
end
for _, v in ipairs(ret1) do
local nPotentialId = v.nId
local nCount = GetPotentialBuildCount(nPotentialId)
if nCurBuildCount < 0 then
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
elseif nCount == nCurBuildCount then
table.insert(ret2, {nId = nPotentialId})
elseif nCount < nCurBuildCount then
ret2 = {}
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
end
end
if #ret2 < 2 then
return ret2
end
local ret3 = {}
local curLessPotential = -1
for _, v in ipairs(ret2) do
local nPotentialId = v.nId
local potentialCfg = ConfigTable.GetData("Potential", nPotentialId)
if potentialCfg ~= nil then
local nCharId = potentialCfg.CharId
local nCurCount = 0
if self._mapPotential[nCharId] ~= nil and self._mapPotential[nCharId][nPotentialId] ~= nil then
nCurCount = self._mapPotential[nCharId][nPotentialId]
end
if curLessPotential < 0 then
table.insert(ret3, {nId = nPotentialId})
curLessPotential = nCurCount
elseif nCurCount == curLessPotential then
table.insert(ret3, {nId = nPotentialId})
elseif nCurCount < curLessPotential then
ret3 = {}
table.insert(ret3, {nId = nPotentialId})
curLessPotential = nCurCount
end
end
end
return ret3
end
function StarTowerPrologueLevel:UserEventUpload(strEventName, parme1, parme2)
SDKManager:UserEventUpload(strEventName, tostring(parme1), tostring(parme2))
end
return StarTowerPrologueLevel