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

2648 lines
90 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local StarTowerLevelData = class("StarTowerLevelData")
local LocalStarTowerDataKey = "StarTowerData"
local RapidJson = require("rapidjson")
local PATH = "Game.Adventure.StarTower.StarTowerRoom."
local ConfigData = require("GameCore.Data.ConfigData")
local PB = require("pb")
local FP = CS.TrueSync.FP
local FDP = CS.TrueSync.FDP
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local ModuleManager = require("GameCore.Module.ModuleManager")
local SDKManager = CS.SDKManager.Instance
local AttrConfig = require("GameCore.Common.AttrConfig")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local LocalData = require("GameCore.Data.LocalData")
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 mapBGMCfg = {
[GameEnum.starTowerRoomType.BattleRoom] = false,
[GameEnum.starTowerRoomType.EliteBattleRoom] = false,
[GameEnum.starTowerRoomType.BossRoom] = false,
[GameEnum.starTowerRoomType.FinalBossRoom] = false,
[GameEnum.starTowerRoomType.DangerRoom] = false,
[GameEnum.starTowerRoomType.HorrorRoom] = false,
[GameEnum.starTowerRoomType.ShopRoom] = true,
[GameEnum.starTowerRoomType.EventRoom] = true,
[GameEnum.starTowerRoomType.UnifyBattleRoom] = false
}
local mapEventConfig = {
takeEffect = "OnEvent_TakeEffect",
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
AdventureModuleEnter = "OnEvent_AdventureModuleEnter",
[EventId.StarTowerMap] = "OnEvent_OpenStarTowerMap",
AbandonStarTower = "OnEvent_AbandonStarTower",
[EventId.StarTowerDepot] = "OnEvent_OpenStarTowerDepot",
[EventId.StarTowerLeave] = "OnEvent_StarTowerLeave",
ReplayShopRoomBGM = "ReplayShopBGM"
}
local EncodeTempDataJson = function(mapData)
local stTempData = CS.StarTowerTempData(1)
local stCharacter = {}
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
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
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
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
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
for _, st in pairs(stCharacter) do
stTempData.characterInfo:Add(st)
end
local jsonData, length = NovaAPI.ParseStarTowerDataCompressed(stTempData)
return jsonData, length
end
local DecodeTempDataJson = function(sData)
local tempData = {}
tempData.skillInfo = {}
local stData = NovaAPI.DecodeStarTowerDataCompressed(sData)
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
local nCharCount = stData.characterInfo.Count
for index = 0, nCharCount - 1 do
local stChar = stData.characterInfo[index]
local nCharId = stChar.nCharId
local nEffectCount = stChar.tbEffect.Count
if tempData.effectInfo == nil then
tempData.effectInfo = {}
end
if tempData.effectInfo[nCharId] == nil then
tempData.effectInfo[nCharId] = {
mapEffect = {}
}
end
for e = 0, nEffectCount - 1 do
local stEffect = stChar.tbEffect[e]
tempData.effectInfo[nCharId].mapEffect[stEffect.nId] = {
nCount = stEffect.nCount,
nCd = stEffect.nCd
}
end
local nBuffCount = stChar.tbBuff.Count
if tempData.buffInfo == nil then
tempData.buffInfo = {}
end
if tempData.buffInfo[nCharId] == nil then
tempData.buffInfo[nCharId] = {}
end
for b = 0, nBuffCount - 1 do
local stBuff = stChar.tbBuff[b]
table.insert(tempData.buffInfo[nCharId], {
Id = stBuff.Id,
CD = stBuff.CD,
nNum = stBuff.nNum
})
end
if stChar.stateInfo ~= nil then
if tempData.stateInfo == nil then
tempData.stateInfo = {}
end
tempData.stateInfo[nCharId] = {
jsonStr = "",
nState = stChar.stateInfo.nState,
nStateTime = stChar.stateInfo.nStateTime
}
end
if stChar.ammoInfo ~= nil then
if tempData.ammoInfo == nil then
tempData.ammoInfo = {}
end
tempData.ammoInfo[nCharId] = {
nCurAmmo = stChar.ammoInfo.nCurAmmo,
nAmmo1 = stChar.ammoInfo.nAmmo1,
nAmmo2 = stChar.ammoInfo.nAmmo2,
nAmmo3 = stChar.ammoInfo.nAmmo3,
nAmmoMax1 = stChar.ammoInfo.nAmmoMax1,
nAmmoMax2 = stChar.ammoInfo.nAmmoMax2,
nAmmoMax3 = stChar.ammoInfo.nAmmoMax3
}
end
end
return tempData
end
function StarTowerLevelData:ctor(parent, nStarTowerId)
self:BindEvent()
local BuildStarTowerAllFloorData = function(nTowerId)
local mapStarTowerCfgData = ConfigTable.GetData("StarTower", nTowerId)
if mapStarTowerCfgData == nil then
return {}
end
local ret = {}
local levelDifficulty = mapStarTowerCfgData.Difficulty
local difficulty = mapStarTowerCfgData.ValueDifficulty
local tbStage = mapStarTowerCfgData.StageGroupIds
local tbFloorNum = mapStarTowerCfgData.FloorNum
for nIdx, nStageGroupId in ipairs(tbStage) do
local nFloorNum = tbFloorNum[nIdx]
if nFloorNum == nil then
nFloorNum = 99
printError("FloorNum Missing" .. nTowerId .. " " .. nIdx)
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, levelDifficulty
end
local BuildStarTowerExpData = function(nTowerId)
local ret = {}
local forEachExp = function(mapData)
if mapData.StarTowerId == nTowerId then
ret[mapData.Stage] = mapData
end
end
ForEachTableLine(DataTable.StarTowerFloorExp, forEachExp)
return ret
end
self.parent = parent
self.nTowerId = nStarTowerId
self.nCurLevel = 1
self.bRanking = false
self.tbStarTowerAllLevel, self.nStarTowerDifficulty, self.nStarTowerLevelDifficulty = BuildStarTowerAllFloorData(self.nTowerId)
self.mapFloorExp = BuildStarTowerExpData(self.nTowerId)
self.tbStrengthMachineCost = ConfigTable.GetConfigNumberArray("StrengthenMachineGoldConsume")
EventManager.Hit("SetStarTowerLevelData", self)
end
function StarTowerLevelData:Exit()
self:UnBindEvent()
if self.curRoom ~= nil then
self.curRoom:Exit()
end
EventManager.Hit("SetStarTowerLevelData")
end
function StarTowerLevelData: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 StarTowerLevelData: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 StarTowerLevelData:Init(mapMeta, mapRoom, mapBag, lastId)
local GetCharacterAttr = function(tbTeam, mapDisc)
local ret = {}
for idx, nTid in ipairs(tbTeam) do
local stActorInfo = self:CalCharFixedEffect(nTid, idx == 1, mapDisc)
ret[nTid] = stActorInfo
end
return ret
end
self.mapCharData, self.mapDiscData = self:BuildCharacterData(mapMeta.Chars, mapMeta.Discs)
self._mapNote = {}
local mapCfg = ConfigTable.GetData("StarTower", mapMeta.Id)
if mapCfg ~= nil then
local nDropGroup = mapCfg.SubNoteSkillDropGroupId
local tbNoteDrop = CacheTable.GetData("_SubNoteSkillDropGroup", nDropGroup)
if tbNoteDrop ~= nil then
for _, v in ipairs(tbNoteDrop) do
self._mapNote[v.SubNoteSkillId] = 0
end
end
end
self._mapPotential = {}
self._mapFateCard = {}
self._mapItem = {}
self.nTowerId = mapMeta.Id
self.nCurLevel = mapRoom.Data.Floor
self.tbTeam = {}
self.mapPotentialAddLevel = {}
self.nLastStarTowerId = lastId or 0
self.nLastRoomType = -1
self.sLastBGM = ""
for _, mapChar in ipairs(mapMeta.Chars) do
table.insert(self.tbTeam, mapChar.Id)
self._mapPotential[mapChar.Id] = {}
local tbActive = self.mapCharData[mapChar.Id].tbActive
local tbEquipment = self.mapCharData[mapChar.Id].tbEquipment
self.mapPotentialAddLevel[mapChar.Id] = self:GetCharEnhancedPotential(tbActive, tbEquipment)
end
self.tbDisc = {}
for _, mapDisc in ipairs(mapMeta.Discs) do
table.insert(self.tbDisc, mapDisc.Id)
end
self.tbActiveSecondaryIds = mapMeta.ActiveSecondaryIds
self.tbGrowthNodeEffect = PlayerData.StarTower:GetClientEffectByNode(mapMeta.TowerGrowthNodes)
self.nResurrectionCnt = mapMeta.ResurrectionCnt or 0
self.curRoom = nil
self.mapFateCardUseCount = {}
self.nTeamLevel = mapMeta.TeamLevel
self.nTeamExp = mapMeta.TeamExp
self.nTotalTime = mapMeta.TotalTime
self.nNPCInteractions = mapMeta.NPCInteractions
if self.nRankBattleTime == nil then
self.nRankBattleTime = 0
end
self.mapActorInfo = {
[self.tbTeam[1]] = {
nHp = mapMeta.CharHp
}
}
self.nRoomType = mapRoom.Data.RoomType == nil and -1 or mapRoom.Data.RoomType
local mapStarTower = ConfigTable.GetData("StarTower", self.nTowerId)
if mapStarTower then
local nTeamIndex = PlayerData.StarTower:GetGroupFormation(mapStarTower.GroupId)
local nPreselectionId = PlayerData.Team:GetTeamPreselectionId(nTeamIndex)
self.mapPreselectionData = PlayerData.PotentialPreselection:GetPreselectionById(nPreselectionId)
end
self.cachedClientData = mapMeta.ClientData
self.mapCharacterTempData = DecodeTempDataJson(mapMeta.ClientData)
self.mapEffectTriggerCount = {}
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.mapDiscData)
self.cachedRoomMeta = mapRoom
if mapBag ~= nil then
for _, mapFateCardEft in ipairs(mapBag.FateCard) do
self._mapFateCard[mapFateCardEft.Tid] = {
mapFateCardEft.Remain,
mapFateCardEft.Room
}
end
for _, mapPotential in ipairs(mapBag.Potentials) do
local nTid = mapPotential.Tid
local mapPotentialCfgData = ConfigTable.GetData("Potential", nTid)
if mapPotentialCfgData == nil then
printError("PotentialCfgData Missing" .. nTid)
else
local nCharId = mapPotentialCfgData.CharId
if self._mapPotential[nCharId] == nil then
self._mapPotential[nCharId] = {}
end
self._mapPotential[nCharId][nTid] = mapPotential.Level
end
end
for _, mapItem in ipairs(mapBag.Items) do
local mapItemCfgData = ConfigTable.GetData_Item(mapItem.Tid)
if mapItemCfgData ~= nil and mapItemCfgData.Stype == GameEnum.itemStype.SubNoteSkill then
self._mapNote[mapItem.Tid] = mapItem.Qty
else
self._mapItem[mapItem.Tid] = mapItem.Qty
end
end
for _, mapItem in ipairs(mapBag.Res) do
self._mapItem[mapItem.Tid] = mapItem.Qty
end
end
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 bBattleEnd = self.CheckBattleEnd(mapRoom.Cases)
local nRoomType = self.nRoomType
local tbDropInfo = self:GetDropInfo(self.nCurLevel, nRoomType, mapRoom.Cases)
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
local callback = function()
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerPanel, self.tbTeam, self.tbDisc, self.mapCharData, self.mapDiscData, self.mapPotentialAddLevel, self.nTowerId, self.nLastStarTowerId)
safe_call_cs_func(CS.AdventureModuleHelper.EnterStarTowerMap, self.nStarTowerDifficulty, bBattleEnd, bFinal, tbDropInfo, nNextRoomType)
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, mapRoom.Cases, mapRoom.Data)
end
NovaAPI.EnterModule("AdventureModuleScene", true, 22, callback)
WwiseAudioMgr:PostEvent("rouguelike_outfit_setVV")
end
function StarTowerLevelData:StarTowerClear(nCaseId)
local PlaySuccessPerform = function(nMapId, mapResult, tbTeam, tbDisc)
local sBGM = ""
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
if ConfigTable.GetData("StarTowerMap", nMapId) == nil then
printError("MapDataMissing:" .. nMapId)
end
local nType = ConfigTable.GetData("StarTowerMap", nMapId).Theme
local sName = ConfigTable.GetData("EndSceneType", nType).EndSceneName
local func_SettlementFinish = function()
end
WwiseAudioMgr:PostEvent("music_clear")
WwiseAudioMgr:PostEvent("music_combat")
local tbSkin = {}
for _, nCharId in ipairs(tbTeam) do
local nSkinId = PlayerData.Char:GetCharSkinId(nCharId)
table.insert(tbSkin, nSkinId)
end
CS.AdventureModuleHelper.PlaySettlementPerform(sName, sBGM, tbSkin, func_SettlementFinish)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
local function openBattleResultPanel()
EventManager.Remove("SettlementPerformLoadFinish", self, openBattleResultPanel)
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerResult, mapResult, tbTeam)
PlayerData.State:CacheStarTowerStateData(nil)
self.parent:StarTowerEnd()
end
EventManager.Add("SettlementPerformLoadFinish", self, openBattleResultPanel)
CS.AdventureModuleHelper.LevelStateChanged(true)
PlayerData.StarTower:CacheOnePassedId(mapResult.nRoguelikeId)
EventManager.Hit(EventId.OpenPanel, PanelId.BattleResultMask)
end
local nCheckSum = 0
local bSuccess
local EnterReq = {MapId = 0, Checksum = nCheckSum}
local mapMsg = {Id = nCaseId, EnterReq = EnterReq}
local NetCallback = function(_, mapNetMsg)
local mapBuildInfo
local mapChangeInfo = {}
local tbRes = {}
local tbItem = {}
local nTime = 0
local mapNpcAffinity
local tbTowerRewards = {}
if mapNetMsg.Settle ~= nil then
mapBuildInfo = mapNetMsg.Settle.Build
mapChangeInfo = mapNetMsg.Settle.Change
nTime = mapNetMsg.Settle.TotalTime
mapNpcAffinity = mapNetMsg.Settle.Reward
local mapItems = {}
for _, mapFirstReward in ipairs(mapNetMsg.Settle.Awards) do
for _, mapRewardItem in ipairs(mapFirstReward.Items) do
if mapItems[mapRewardItem.Tid] == nil then
mapItems[mapRewardItem.Tid] = 0
end
mapItems[mapRewardItem.Tid] = mapItems[mapRewardItem.Tid] + mapRewardItem.Qty
end
end
for nTid, nQty in pairs(mapItems) do
table.insert(tbTowerRewards, {
Tid = nTid,
Qty = nQty,
rewardType = AllEnum.RewardType.First
})
end
for _, mapItem in ipairs(mapNetMsg.Settle.TowerRewards) do
table.insert(tbTowerRewards, {
Tid = mapItem.Tid,
Qty = mapItem.Qty
})
end
self.parent:CacheNpcAffinityChange(mapNetMsg.Settle.Reward, mapNetMsg.Settle.NpcInteraction)
end
if mapChangeInfo ~= nil then
local encodeInfo = UTILS.DecodeChangeInfo(mapChangeInfo)
if encodeInfo["proto.Res"] ~= nil then
for _, mapCoin in ipairs(encodeInfo["proto.Res"]) do
table.insert(tbRes, {
nTid = mapCoin.Tid,
nCount = mapCoin.Qty
})
if mapCoin.Tid == AllEnum.CoinItemId.FRRewardCurrency then
PlayerData.StarTower:AddStarTowerTicket(mapCoin.Qty)
end
end
end
if encodeInfo["proto.Item"] ~= nil then
for _, mapItem in ipairs(encodeInfo["proto.Item"]) do
local mapItemConfigData = ConfigTable.GetData_Item(mapItem.Tid)
if mapItemConfigData == nil then
return
end
if mapItemConfigData.Stype ~= GameEnum.itemStype.Res then
table.insert(tbItem, {
nTid = mapItem.Tid,
nCount = mapItem.Qty
})
end
end
end
end
local nPotentialCount = 0
for _, mapPotential in pairs(self._mapPotential) do
for _, nCount in pairs(mapPotential) do
nPotentialCount = nPotentialCount + nCount
end
end
local mapResult = {
nRoguelikeId = self.nTowerId,
tbDisc = self.tbDisc,
tbRes = tbRes,
tbPresents = {},
tbOutfit = {},
tbItem = tbItem,
tbRarityCount = {},
bSuccess = true,
nFloor = self.nCurLevel,
nStage = self.tbStarTowerAllLevel[self.nCurLevel].Id,
mapBuild = mapBuildInfo,
nExp = 0,
nPerkCount = nPotentialCount,
tbBonus = {},
nTime = nTime,
tbAffinities = {},
mapChangeInfo = mapChangeInfo,
tbRewards = tbTowerRewards,
mapNPCAffinity = mapNpcAffinity
}
PlaySuccessPerform(self.curMapId, mapResult, self.tbTeam, self.tbDisc)
local tabUpLevel = {}
table.insert(tabUpLevel, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tabUpLevel, {
"game_cost_time",
tostring(nTime)
})
table.insert(tabUpLevel, {
"real_cost_time",
tostring(0)
})
if mapBuildInfo and mapBuildInfo.Brief ~= nil then
table.insert(tabUpLevel, {
"build_id",
tostring(mapBuildInfo.Brief.Id)
})
else
table.insert(tabUpLevel, {
"build_id",
tostring(0)
})
end
table.insert(tabUpLevel, {
"tower_id",
tostring(self.nTowerId)
})
table.insert(tabUpLevel, {
"room_floor",
tostring(self.nCurLevel)
})
table.insert(tabUpLevel, {
"room_type",
tostring(self.nRoomType)
})
table.insert(tabUpLevel, {
"action",
tostring(10)
})
NovaAPI.UserEventUpload("star_tower", tabUpLevel)
local mapStarTower = ConfigTable.GetData("StarTower", self.nTowerId)
if mapStarTower and mapStarTower.GroupId ~= 4 then
local tmpEventId = string.format("pc_star_tower_%s_%s", mapStarTower.GroupId, mapStarTower.Difficulty)
PlayerData.Base:UserEventUpload_PC(tmpEventId)
end
end
HttpNetHandler.SendMsg(NetMsgId.Id.star_tower_interact_req, mapMsg, nil, NetCallback)
end
function StarTowerLevelData:EnterRoom(nCaseId, nRoomType)
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(nCaseId)
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
if nRoomType == GameEnum.starTowerRoomType.DangerRoom or nRoomType == GameEnum.starTowerRoomType.HorrorRoom then
print(string.format("Enter HighDangerRoom RoomType:%d", nRoomType))
local nStage = self.tbStarTowerAllLevel[self.nCurLevel].Id
stRoomMeta = CS.Lua2CSharpInfo_FixedRoguelike(self.nTowerId, nStage, tbHistoryMapId, self.tbTeam, tbCharSkinId, 0, "", 0, nRoomType, self.bRanking, 0)
else
self.nCurLevel = self.nCurLevel + 1
local nNextStage = self.tbStarTowerAllLevel[self.nCurLevel].Id
stRoomMeta = CS.Lua2CSharpInfo_FixedRoguelike(self.nTowerId, nNextStage, tbHistoryMapId, self.tbTeam, tbCharSkinId, 0, "", 0, -1, self.bRanking, 0)
end
local floorId = 0
local sExData = ""
local scenePrefabId = 0
self.nRoomType = nRoomType
self.curMapId, floorId, sExData, scenePrefabId = safe_call_cs_func2(CS.AdventureModuleHelper.RandomStarTowerMap, stRoomMeta)
if self.curMapId == nil then
printError("返回地图id为空!")
end
self:SetRoguelikeHistoryMapId(self.curMapId)
local function OnLevelUnloadComplete()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
Actor2DManager.ClearAll()
self:ResetCharacter()
end
local NetCallback = function(_, mapNetData)
if mapNetData.EnterResp == nil then
printError("房间数据返回为空")
return
end
self.cachedRoomMeta = mapNetData.EnterResp.Room
self:ProcessChangeInfo(mapNetData.Change)
local bBattleEnd = self.CheckBattleEnd(mapNetData.EnterResp.Room.Cases)
local mapMapData = ConfigTable.GetData("StarTowerMap", self.curMapId)
if mapMapData == nil then
return
end
local tbDropInfo = self:GetDropInfo(self.nCurLevel, nRoomType, mapNetData.EnterResp.Room.Cases)
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, bBattleEnd, bFinal, tbDropInfo, nNextRoomType)
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, mapNetData.EnterResp.Room.Cases, mapNetData.EnterResp.Room.Data)
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
safe_call_cs_func(CS.AdventureModuleHelper.ClearCharacterDamageRecord, false)
safe_call_cs_func(CS.AdventureModuleHelper.LevelStateChanged, false)
end
local clientData, nDataLength = self:CacheTempData()
self.cachedClientData = clientData
local EnterReq = {
MapId = self.curMapId,
ParamId = floorId,
DateLen = nDataLength,
ClientData = clientData,
MapParam = sExData,
MapTableId = scenePrefabId
}
local mapMsg = {Id = nCaseId, EnterReq = EnterReq}
HttpNetHandler.SendMsg(NetMsgId.Id.star_tower_interact_req, mapMsg, nil, NetCallback)
end
function StarTowerLevelData:StarTowerInteract(mapMsgData, callback)
if self.bEnd then
return
end
local NetCallback = function(_, mapNetData)
local mapChangeNote, mapChangeSecondarySkill = self:ProcessTowerChangeData(mapNetData.Data)
local tbChangeFateCard, mapItemChange, mapPotentialChange = self:ProcessChangeInfo(mapNetData.Change)
local nExpChange = 0
local nLevelChange = 0
local nBagCount = self._mapItem[AllEnum.CoinItemId.FixedRogCurrency]
if nBagCount == nil then
nBagCount = 0
end
local bSyncHp = false
if 0 < #tbChangeFateCard then
bSyncHp = true
end
for _, v in pairs(mapChangeNote) do
if 0 < v.Qty then
bSyncHp = true
break
end
end
if nil ~= next(mapPotentialChange) then
bSyncHp = true
end
EventManager.Hit("RefreshStarTowerCoin", nBagCount)
EventManager.Hit("RefreshNoteCount", clone(self._mapNote), mapChangeNote, mapChangeSecondarySkill)
EventManager.Hit("RefreshFateCard", clone(self._mapFateCard))
if mapNetData.BattleEndResp ~= nil and mapNetData.BattleEndResp.Victory ~= nil then
nLevelChange = mapNetData.BattleEndResp.Victory.Lv - self.nTeamLevel
nExpChange = mapNetData.BattleEndResp.Victory.Exp
self.nTeamLevel = mapNetData.BattleEndResp.Victory.Lv
self.nTeamExp = mapNetData.BattleEndResp.Victory.Exp
self.nRankBattleTime = self.nRankBattleTime + mapNetData.BattleEndResp.Victory.BattleTime
end
if self.curRoom ~= nil then
self.curRoom:SaveCase(mapNetData.Cases)
self.curRoom:SaveSelectResp(mapNetData.SelectResp, mapMsgData.Id)
if bSyncHp then
self.curRoom:SyncHp()
end
end
if callback ~= nil and type(callback) == "function" then
callback(mapNetData, tbChangeFateCard, mapChangeNote, mapItemChange, nLevelChange, nExpChange, mapPotentialChange, mapChangeSecondarySkill)
end
end
HttpNetHandler.SendMsg(NetMsgId.Id.star_tower_interact_req, mapMsgData, nil, NetCallback)
end
function StarTowerLevelData:StarTowerFailed(mapChangeInfo, mapBuildInfo, nTime, npcAffinityReward, TowerRewards, NpcInteraction)
print("放弃遗迹")
local tbRes = {}
local tbPresents = {}
local tbOutfit = {}
local tbItem = {}
if self.curRoom ~= nil then
nTime = nTime + self.curRoom.nTime
end
if mapChangeInfo ~= nil then
local encodeInfo = UTILS.DecodeChangeInfo(mapChangeInfo)
if encodeInfo["proto.Res"] ~= nil then
for _, mapCoin in ipairs(encodeInfo["proto.Res"]) do
table.insert(tbRes, {
nTid = mapCoin.Tid,
nCount = mapCoin.Qty
})
if mapCoin.Tid == AllEnum.CoinItemId.FRRewardCurrency then
PlayerData.StarTower:AddStarTowerTicket(mapCoin.Qty)
end
end
end
if encodeInfo["proto.Item"] ~= nil then
for _, mapItem in ipairs(encodeInfo["proto.Item"]) do
local mapItemConfigData = ConfigTable.GetData_Item(mapItem.Tid)
if mapItemConfigData == nil then
return
end
if mapItemConfigData.Stype ~= GameEnum.itemStype.Res then
table.insert(tbItem, {
nTid = mapItem.Tid,
nCount = mapItem.Qty
})
end
end
end
end
local nPotentialCount = 0
for _, mapPotential in pairs(self._mapPotential) do
for _, nCount in pairs(mapPotential) do
nPotentialCount = nPotentialCount + nCount
end
end
self.parent:CacheNpcAffinityChange(npcAffinityReward, NpcInteraction)
local mapResult = {
nRoguelikeId = self.nTowerId,
tbDisc = self.tbDisc,
tbRes = tbRes,
tbPresents = tbPresents,
tbOutfit = tbOutfit,
tbItem = tbItem,
tbRarityCount = {},
bSuccess = false,
nFloor = self.nCurLevel,
nStage = self.tbStarTowerAllLevel[self.nCurLevel].Id,
mapBuild = mapBuildInfo,
nExp = 0,
nPerkCount = nPotentialCount,
tbBonus = {},
nTime = nTime,
tbAffinities = {},
mapChangeInfo = mapChangeInfo,
tbRewards = TowerRewards,
mapNPCAffinity = npcAffinityReward
}
if ModuleManager.GetIsAdventure() then
WwiseAudioMgr:PostEvent("music_clear")
WwiseAudioMgr:PostEvent("music_combat")
end
local tabUpLevel = {}
table.insert(tabUpLevel, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tabUpLevel, {
"game_cost_time",
tostring(nTime)
})
table.insert(tabUpLevel, {
"real_cost_time",
tostring(CS.ClientManager.Instance.serverTimeStampWithTimeZone - self.curRoom._EntryTime)
})
table.insert(tabUpLevel, {
"tower_id",
tostring(self.nTowerId)
})
table.insert(tabUpLevel, {
"room_floor",
tostring(self.nCurLevel)
})
table.insert(tabUpLevel, {
"room_type",
tostring(self.nRoomType)
})
table.insert(tabUpLevel, {
"action",
tostring(3)
})
NovaAPI.UserEventUpload("star_tower", tabUpLevel)
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerResult, mapResult, self.tbTeam)
PlayerData.State:CacheStarTowerStateData(nil)
self.parent:StarTowerEnd()
end
function StarTowerLevelData:ResetCharacter()
for nCharId, mapInfo in pairs(self.mapCharAttr) do
if self.mapActorInfo ~= nil and self.mapActorInfo[nCharId] ~= nil then
mapInfo.initHp = self.mapActorInfo[nCharId].nHp
end
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, mapInfo)
end
self:SetCharStatus()
self:ResetAmmo()
self:ResetSommon()
self:ResetPersonalPerk()
self:ResetFateCard()
self:ResetNoteInfo()
self:ResetDiscInfo()
end
function StarTowerLevelData:OnEvent_AdventureModuleEnter()
for nCharId, mapInfo in pairs(self.mapCharAttr) do
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAttribute, nCharId, mapInfo)
end
self:SetCharStatus()
self:ResetAmmo()
self:ResetSommon()
self:ResetPersonalPerk()
self:ResetFateCard()
self:ResetNoteInfo()
self:ResetDiscInfo()
end
function StarTowerLevelData:OnEvent_LoadLevelRefresh()
self.mapFateCardUseCount = {}
self.mapPotentialEft = {}
self.mapDiscEft = {}
self.mapNoteEft = {}
self.mapFateCardEft = {}
self.mapPotentialEft, self.mapDiscEft, self.mapFateCardEft, self.mapNoteEft = self:ResetEffect()
if self.curRoom ~= nil then
self:PlayRoomBGM()
self.curRoom:Enter()
end
if self.mapCharacterTempData.shieldList ~= nil then
safe_call_cs_func(CS.AdventureModuleHelper.ResetShield, self.tbTeam[1], self.mapCharacterTempData.shieldList)
end
self:ResetBuff()
self:SetFateCardToAdventureModule()
self:SetActorHP()
self:ResetSkill()
self:ResetFateCardRoomEft()
end
function StarTowerLevelData: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
EventManager.Hit("FateCardCountChange", nFateCardId)
self.mapFateCardUseCount[nFateCardId] = self.mapFateCardUseCount[nFateCardId] + 1
end
end
function StarTowerLevelData:OnEvent_OpenStarTowerMap()
NovaAPI.DispatchEventWithData("LUA2CSHARP_UI_PAUSE")
local bHighDanger = false
bHighDanger = self.nRoomType == GameEnum.starTowerRoomType.DangerRoom or self.nRoomType == GameEnum.starTowerRoomType.HorrorRoom
EventManager.Hit("OpenStarTowerMap", self.tbStarTowerAllLevel, self.nCurLevel, self.nTowerId, self.tbTeam, bHighDanger, nil, self.mapCharData, #self.tbStarTowerAllLevel)
end
function StarTowerLevelData:OnEvent_OpenStarTowerDepot(nTog, nParam)
EventManager.Hit("OpenStarTowerDepot", self._mapPotential, self._mapNote, self._mapFateCard, self._mapItem, self.tbActiveSecondaryIds, nTog, nParam)
end
function StarTowerLevelData:OnEvent_AbandonStarTower()
if self.bEnd then
return
end
self.bEnd = true
local callback = function(_, msgData)
self:StarTowerFailed(msgData.Change, msgData.Build, msgData.TotalTime, msgData.Reward, msgData.TowerRewards, msgData.NpcInteraction)
end
HttpNetHandler.SendMsg(NetMsgId.Id.star_tower_give_up_req, {}, nil, callback)
end
function StarTowerLevelData:OnEvent_StarTowerLeave()
Actor2DManager.ClearAll()
if self.bEnd then
return
end
PanelManager.InputDisable()
local confirmCallback = function()
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
NovaAPI.EnterModule("MainMenuModuleScene", true, 17)
EventManager.Hit(EventId.ClosePanel, PanelId.StarTowerPanel)
end
self.bEnd = true
self.parent:StarTowerEnd()
local nRecon = PlayerData.State:GetStarTowerRecon()
local mapStateInfo = {
Id = self.nTowerId,
ReConnection = nRecon,
BuildId = 0,
CharIds = self.tbTeam,
Floor = self.nCurLevel
}
PlayerData.State:CacheStarTowerStateData(mapStateInfo)
PlayerData.back2Home = true
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
CS.AdventureModuleHelper.LevelStateChanged(true, 0, true)
PanelManager.InputEnable()
local tabUpLevel = {}
table.insert(tabUpLevel, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tabUpLevel, {
"game_cost_time",
tostring(self.curRoom.nTime)
})
table.insert(tabUpLevel, {
"real_cost_time",
tostring(CS.ClientManager.Instance.serverTimeStampWithTimeZone - self.curRoom._EntryTime)
})
table.insert(tabUpLevel, {
"tower_id",
tostring(self.nTowerId)
})
table.insert(tabUpLevel, {
"room_floor",
tostring(self.nCurLevel)
})
table.insert(tabUpLevel, {
"room_type",
tostring(self.nRoomType)
})
table.insert(tabUpLevel, {
"action",
tostring(18)
})
NovaAPI.UserEventUpload("star_tower", tabUpLevel)
end
local cancelCallback = function()
PanelManager.InputEnable()
end
local confirmGray = function()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("StarTower_CantLeaveHint") or "")
end
local nMaxCount = ConfigTable.GetConfigNumber("StarTowerReconnMaxCnt")
local nReConnection = PlayerData.State:GetStarTowerRecon()
local bGrayConfirm = nMaxCount <= nReConnection
local sHint = orderedFormat(ConfigTable.GetUIText("StarTower_Leave_Hint") or "", nMaxCount - nReConnection, nMaxCount)
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sHint,
callbackConfirm = bGrayConfirm and confirmGray or confirmCallback,
callbackCancel = cancelCallback,
bDisableSnap = false,
bGrayConfirm = bGrayConfirm
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function StarTowerLevelData:BuildCharacterData(tbCharacterData, tbDiscData)
local EquipmentData = require("GameCore.Data.DataClass.EquipmentDataEx")
local DiscData = require("GameCore.Data.DataClass.DiscData")
local mapCharacter = {}
local mapDisc = {}
for idx, mapChar in ipairs(tbCharacterData) do
local tbEquipment, tbEquipmentSlot, tbEquipmentEffect = {}, {}, {}
for _, starTowerEquipment in ipairs(mapChar.Gems) do
if starTowerEquipment.Attributes then
local bEmpty = false
for _, v in pairs(starTowerEquipment.Attributes) do
if v == 0 then
bEmpty = true
break
end
end
if not bEmpty then
local nGemId = PlayerData.Equipment:GetGemIdBySlot(mapChar.Id, starTowerEquipment.SlotId)
local mapEquipmentInfo = {
Lock = false,
Attributes = starTowerEquipment.Attributes,
AlterAttributes = {},
OverlockCount = starTowerEquipment.OverlockCount,
AlterOverlockCount = {}
}
local equipmentData = EquipmentData.new(mapEquipmentInfo, mapChar.Id, nGemId)
table.insert(tbEquipment, equipmentData)
tbEquipmentSlot[starTowerEquipment.SlotId] = equipmentData
end
end
end
for _, mapEquipment in pairs(tbEquipment) do
local tbEffect = mapEquipment:GetEffect()
for _, v in pairs(tbEffect) do
table.insert(tbEquipmentEffect, v)
end
end
local tbTalent = CacheTable.GetData("_TalentByIndex", mapChar.Id)
if tbTalent == nil then
printError("Talent表找不到该角色" .. mapChar.Id)
tbTalent = {}
end
local tbActive = {}
local tbNodes = UTILS.ParseByteString(mapChar.TalentNodes)
for nIndex, v in pairs(tbTalent) do
local bActive = UTILS.IsBitSet(tbNodes, nIndex)
if bActive then
table.insert(tbActive, v.Id)
end
end
local GetCharSkillAddedLevel = function(nCharId, tbSkillLv, active, bMainChar)
local tbSkillLevel = {}
local tbSkillIds = {}
local charCfgData = DataTable.Character[nCharId]
tbSkillIds[1] = charCfgData.NormalAtkId
tbSkillIds[2] = charCfgData.SkillId
tbSkillIds[3] = charCfgData.AssistSkillId
tbSkillIds[4] = charCfgData.UltimateId
local mapTalentEnhanceSkill = PlayerData.Talent:CreateEnhancedSkill(nCharId, active)
local mapEquipmentEnhanceSkill = {}
for _, v in pairs(tbEquipment) do
local tbSkill = v:GetEnhancedSkill()
for nSkillId, nAdd in pairs(tbSkill) do
if not mapEquipmentEnhanceSkill[nSkillId] then
mapEquipmentEnhanceSkill[nSkillId] = 0
end
mapEquipmentEnhanceSkill[nSkillId] = mapEquipmentEnhanceSkill[nSkillId] + nAdd
end
end
for i = 1, 4 do
local nSkillId = tbSkillIds[i]
local nAdd = 0
if mapTalentEnhanceSkill and mapTalentEnhanceSkill[nSkillId] then
nAdd = nAdd + mapTalentEnhanceSkill[nSkillId]
end
if mapEquipmentEnhanceSkill and mapEquipmentEnhanceSkill[nSkillId] then
nAdd = nAdd + mapEquipmentEnhanceSkill[nSkillId]
end
local nLv = tbSkillLv[i] + nAdd
table.insert(tbSkillLevel, nLv)
end
if bMainChar == true then
table.remove(tbSkillLevel, 3)
else
table.remove(tbSkillLevel, 2)
end
return tbSkillLevel
end
local tbTalentEffect = {}
for _, nTalentId in pairs(tbActive) do
local mapCfg = ConfigTable.GetData("Talent", nTalentId)
if mapCfg ~= nil then
for _, nEffectId in pairs(mapCfg.EffectId) do
table.insert(tbTalentEffect, nEffectId)
end
end
end
local effectIds = {}
local mapAffinityCfg = ConfigTable.GetData("CharAffinityTemplate", mapChar.Id)
if not mapAffinityCfg then
return effectIds
end
local templateId = mapAffinityCfg.TemplateId
local forEachAffinityLevel = function(affinityData)
if affinityData.TemplateId == templateId and mapChar.AffinityLevel ~= nil and affinityData.AffinityLevel == mapChar.AffinityLevel and affinityData.Effect ~= nil and #affinityData.Effect > 0 then
for k, v in ipairs(affinityData.Effect) do
table.insert(effectIds, v)
end
end
end
ForEachTableLine(DataTable.AffinityLevel, forEachAffinityLevel)
local tbAffinityeffectIds = effectIds
local charData = {
nId = mapChar.Id,
nRankExp = 0,
nFavor = 0,
nSkinId = PlayerData.Char:GetCharUsedSkinId(mapChar.Id),
tbEquipment = tbEquipment,
tbEquipmentSlot = tbEquipmentSlot,
nLevel = mapChar.Level,
nCreateTime = 0,
nAdvance = mapChar.Advance,
tbSkillLvs = GetCharSkillAddedLevel(mapChar.Id, mapChar.SkillLvs, tbActive, idx == 1),
bUseSkillWhenActive_Branch1 = false,
bUseSkillWhenActive_Branch2 = false,
tbPlot = {},
nAffinityExp = 0,
nAffinityLevel = mapChar.AffinityLevel,
tbAffinityQuests = {},
tbActive = tbActive,
tbAffinityeffectIds = tbAffinityeffectIds,
tbTalentEffect = tbTalentEffect,
tbEquipmentEffect = tbEquipmentEffect
}
mapCharacter[mapChar.Id] = charData
end
for _, startowerDisc in ipairs(tbDiscData) do
if startowerDisc.Id ~= 0 then
local mapDiscInfo = {
Id = startowerDisc.Id,
Level = startowerDisc.Level,
Exp = 0,
Phase = startowerDisc.Phase,
Star = startowerDisc.Star,
Read = false,
CreatTime = 0
}
local discData = DiscData.new(mapDiscInfo)
mapDisc[startowerDisc.Id] = discData
end
end
return mapCharacter, mapDisc
end
function StarTowerLevelData:GetCharEnhancedPotential(tbActiveTalent, tbEquipment)
local mapAddLevel = {}
local add = function(mapAdd)
if not mapAdd then
return
end
for nPotentialId, nAdd in pairs(mapAdd) do
if not mapAddLevel[nPotentialId] then
mapAddLevel[nPotentialId] = 0
end
mapAddLevel[nPotentialId] = mapAddLevel[nPotentialId] + nAdd
end
end
local mapTalentAddLevel = PlayerData.Talent:CreateEnhancedPotential(tbActiveTalent)
local mapEquipmentAddLevel = {}
for _, v in pairs(tbEquipment) do
local tbPotential = v:GetEnhancedPotential()
for nPotentialId, nAdd in pairs(tbPotential) do
if not mapEquipmentAddLevel[nPotentialId] then
mapEquipmentAddLevel[nPotentialId] = 0
end
mapEquipmentAddLevel[nPotentialId] = mapEquipmentAddLevel[nPotentialId] + nAdd
end
end
add(mapTalentAddLevel)
add(mapEquipmentAddLevel)
return mapAddLevel
end
function StarTowerLevelData:CalCharacterAttrBattle(nCharId, stAttr, bMainChar, mapDisc)
local GetCharEquipmentRandomAttr = function(tbEquipment)
if not tbEquipment or #tbEquipment == 0 then
return nil
end
local tbRandomAttrList = {}
for _, mapEquipment in pairs(tbEquipment) do
local mapRandomAttr = mapEquipment:GetRandomAttr()
for k, v in ipairs(mapRandomAttr) do
local nAttrId = v.AttrId
if nAttrId ~= nil then
local nCfgValue = v.CfgValue
local nValue = v.Value
if nil == tbRandomAttrList[nAttrId] then
tbRandomAttrList[nAttrId] = {CfgValue = nCfgValue, Value = nValue}
else
tbRandomAttrList[nAttrId].CfgValue = tbRandomAttrList[nAttrId].CfgValue + nCfgValue
tbRandomAttrList[nAttrId].Value = tbRandomAttrList[nAttrId].Value + nValue
end
end
end
end
for _, v in pairs(tbRandomAttrList) do
v.CfgValue = clearFloat(v.CfgValue)
end
return tbRandomAttrList
end
local mapChar = self.mapCharData[nCharId]
if mapChar == nil then
printError("没有该角色数据" .. nCharId)
mapChar = {
nLevel = 1,
nAdvance = 0,
tbSkillLvs = {
1,
1,
1,
1
}
}
end
local nLevel = mapChar.nLevel
local nAdvance = mapChar.nAdvance
local nAttrId = UTILS.GetCharacterAttributeId(nCharId, nAdvance, nLevel)
local mapCharAttrCfg = ConfigTable.GetData_Attribute(tostring(nAttrId))
if mapCharAttrCfg == nil then
printError("属性配置不存在:" .. nAttrId)
return {}
end
local mapCharCfg = DataTable.Character[nCharId]
if mapCharCfg == nil then
printError("角色配置不存在:" .. nCharId)
return {}
end
for _, v in ipairs(AllEnum.AttachAttr) do
if v.bPlayer and mapCharCfg[v.sKey] ~= nil then
mapCharAttrCfg[v.sKey] = mapCharCfg[v.sKey]
end
end
local mapDiscAttr = {}
for _, v in ipairs(AllEnum.AttachAttr) do
mapDiscAttr[v.sKey] = {
Key = v.sKey,
Value = 0,
CfgValue = 0
}
end
if mapDisc ~= nil then
for _, mapDiscData in pairs(mapDisc) do
for _, v in ipairs(AllEnum.AttachAttr) do
mapDiscAttr[v.sKey].CfgValue = mapDiscAttr[v.sKey].CfgValue + mapDiscData.mapAttrBase[v.sKey].CfgValue
end
end
end
local mapCharAttr = {}
for _, v in ipairs(AllEnum.AttachAttr) do
mapCharAttr[v.sKey] = mapCharAttrCfg[v.sKey] + mapDiscAttr[v.sKey].CfgValue
mapCharAttr["_" .. v.sKey] = mapCharAttr[v.sKey]
mapCharAttr["_" .. v.sKey .. "PercentAmend"] = 0
mapCharAttr["_" .. v.sKey .. "Amend"] = 0
end
local AddAttrEffect_AllEffectSub = function(nSubType, nValue, mapAttr)
local value = tonumber(nValue) or 0
if nSubType == GameEnum.parameterType.BASE_VALUE then
local nAdd = mapAttr.bPercent and value or value * ConfigData.IntFloatPrecision
mapCharAttr["_" .. mapAttr.sKey] = mapCharAttr["_" .. mapAttr.sKey] + nAdd
end
end
local tbRandomAttr = GetCharEquipmentRandomAttr(mapChar.tbEquipment)
if tbRandomAttr ~= nil then
for nAttrValueId, v in pairs(tbRandomAttr) do
local mapAttrCfg = ConfigTable.GetData("CharGemAttrValue", nAttrValueId)
if mapAttrCfg then
local attrType = mapAttrCfg.AttrType
local attrSubType1 = mapAttrCfg.AttrTypeFirstSubtype
local attrSubType2 = mapAttrCfg.AttrTypeSecondSubtype
local bAttrFix = attrType == GameEnum.effectType.ATTR_FIX or attrType == GameEnum.effectType.PLAYER_ATTR_FIX
if bAttrFix then
local mapAttr = AttrConfig.GetAttrByEffectType(attrType, attrSubType1)
if mapAttr == nil then
printError(string.format("【装备随机属性】lua属性配置中没找到对应配置!!! attrId = %s", nAttrValueId))
else
AddAttrEffect_AllEffectSub(attrSubType2, v.CfgValue, mapAttr)
end
end
end
end
end
for _, v in ipairs(AllEnum.AttachAttr) do
mapCharAttr[v.sKey] = mapCharAttr["_" .. v.sKey] * (1 + mapCharAttr["_" .. v.sKey .. "PercentAmend"] / 100) + mapCharAttr["_" .. v.sKey .. "Amend"]
mapCharAttr[v.sKey] = math.floor(mapCharAttr[v.sKey])
end
local tbTalent = PlayerData.Talent:GetFateTalentByTalentNodes(nCharId, mapChar.tbActive)
stAttr.actorLevel = nLevel
stAttr.breakCount = mapChar.nAdvance
stAttr.activeTalentInfos = tbTalent
stAttr.Atk = mapCharAttr.Atk
stAttr.Hp = mapCharAttr.Hp
stAttr.Def = mapCharAttr.Def
stAttr.CritRate = mapCharAttr.CritRate
stAttr.CritResistance = mapCharAttr.CritResistance
stAttr.CritPower = mapCharAttr.CritPower
stAttr.HitRate = mapCharAttr.HitRate
stAttr.Evd = mapCharAttr.Evd
stAttr.DefPierce = mapCharAttr.DefPierce
stAttr.WEP = mapCharAttr.WEP
stAttr.FEP = mapCharAttr.FEP
stAttr.SEP = mapCharAttr.SEP
stAttr.AEP = mapCharAttr.AEP
stAttr.LEP = mapCharAttr.LEP
stAttr.DEP = mapCharAttr.DEP
stAttr.WEE = mapCharAttr.WEE
stAttr.FEE = mapCharAttr.FEE
stAttr.SEE = mapCharAttr.SEE
stAttr.AEE = mapCharAttr.AEE
stAttr.LEE = mapCharAttr.LEE
stAttr.DEE = mapCharAttr.DEE
stAttr.WER = mapCharAttr.WER
stAttr.FER = mapCharAttr.FER
stAttr.SER = mapCharAttr.SER
stAttr.AER = mapCharAttr.AER
stAttr.LER = mapCharAttr.LER
stAttr.DER = mapCharAttr.DER
stAttr.WEI = mapCharAttr.WEI
stAttr.FEI = mapCharAttr.FEI
stAttr.SEI = mapCharAttr.SEI
stAttr.AEI = mapCharAttr.AEI
stAttr.LEI = mapCharAttr.LEI
stAttr.DEI = mapCharAttr.DEI
stAttr.DefIgnore = mapCharAttr.DefIgnore
stAttr.ShieldBonus = mapCharAttr.ShieldBonus
stAttr.IncomingShieldBonus = mapCharAttr.IncomingShieldBonus
stAttr.SkillLevel = mapChar.tbSkillLvs
stAttr.skinId = mapChar.nSkinId
stAttr.attrId = tostring(nAttrId)
stAttr.Suppress = mapCharAttr.Suppress
stAttr.NormalDmgRatio = mapCharAttr.NORMALDMG
stAttr.SkillDmgRatio = mapCharAttr.SKILLDMG
stAttr.UltraDmgRatio = mapCharAttr.ULTRADMG
stAttr.OtherDmgRatio = mapCharAttr.OTHERDMG
stAttr.RcdNormalDmgRatio = mapCharAttr.RCDNORMALDMG
stAttr.RcdSkillDmgRatio = mapCharAttr.RCDSKILLDMG
stAttr.RcdUltraDmgRatio = mapCharAttr.RCDULTRADMG
stAttr.RcdOtherDmgRatio = mapCharAttr.RCDOTHERDMG
stAttr.MarkDmgRatio = mapCharAttr.MARKDMG
stAttr.SummonDmgRatio = mapCharAttr.SUMMONDMG
stAttr.RcdSummonDmgRatio = mapCharAttr.RCDSUMMONDMG
stAttr.ProjectileDmgRatio = mapCharAttr.PROJECTILEDMG
stAttr.RcdProjectileDmgRatio = mapCharAttr.RCDPROJECTILEDMG
stAttr.GENDMG = mapCharAttr.GENDMG
stAttr.DMGPLUS = mapCharAttr.DMGPLUS
stAttr.FINALDMG = mapCharAttr.FINALDMG
stAttr.FINALDMGPLUS = mapCharAttr.FINALDMGPLUS
stAttr.WEERCD = mapCharAttr.WEERCD
stAttr.FEERCD = mapCharAttr.FEERCD
stAttr.SEERCD = mapCharAttr.SEERCD
stAttr.AEERCD = mapCharAttr.AEERCD
stAttr.LEERCD = mapCharAttr.LEERCD
stAttr.DEERCD = mapCharAttr.DEERCD
stAttr.GENDMGRCD = mapCharAttr.GENDMGRCD
stAttr.DMGPLUSRCD = mapCharAttr.DMGPLUSRCD
stAttr.NormalCritRate = mapCharAttr.NormalCritRate
stAttr.SkillCritRate = mapCharAttr.SkillCritRate
stAttr.UltraCritRate = mapCharAttr.UltraCritRate
stAttr.MarkCritRate = mapCharAttr.MarkCritRate
stAttr.SummonCritRate = mapCharAttr.SummonCritRate
stAttr.ProjectileCritRate = mapCharAttr.ProjectileCritRate
stAttr.OtherCritRate = mapCharAttr.OtherCritRate
stAttr.NormalCritPower = mapCharAttr.NormalCritPower
stAttr.SkillCritPower = mapCharAttr.SkillCritPower
stAttr.UltraCritPower = mapCharAttr.UltraCritPower
stAttr.MarkCritPower = mapCharAttr.MarkCritPower
stAttr.SummonCritPower = mapCharAttr.SummonCritPower
stAttr.ProjectileCritPower = mapCharAttr.ProjectileCritPower
stAttr.OtherCritPower = mapCharAttr.OtherCritPower
stAttr.EnergyConvRatio = mapCharAttr.EnergyConvRatio
stAttr.EnergyEfficiency = mapCharAttr.EnergyEfficiency
stAttr.ToughnessDamageAdjust = mapCharAttr.ToughnessDamageAdjust
stAttr.initHp = 0
return 0
end
function StarTowerLevelData:ProcessChangeInfo(mapChangeData)
local mapData = UTILS.DecodeChangeInfo(mapChangeData)
local tbChangeFateCard = {}
local mapRewardChange = {}
local mapPotentialChange = {}
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)
local nBeforeCount = math.max(nBeforeEftCount, nBeforeRoomCount)
if self._mapFateCard[mapFateCardData.Tid] ~= nil and nBeforeCount <= 0 then
nCountSum = 2
end
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
local nCurLevel = self._mapPotential[nCharId][mapPotentialInfo.Tid]
local nNextLevel = self._mapPotential[nCharId][mapPotentialInfo.Tid] + mapPotentialInfo.Level
mapPotentialChange[mapPotentialInfo.Tid] = {nLevel = nCurLevel, nNextLevel = nNextLevel}
self._mapPotential[nCharId][mapPotentialInfo.Tid] = nNextLevel
self:ChangePotentialCount(mapPotentialInfo.Tid, nNextLevel - nCurLevel)
self:ChangePotential(mapPotentialInfo.Tid)
end
end
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
local nScore = self:CalBuildScore()
EventManager.Hit("StarTowerRefreshBuildScore", nScore)
return tbChangeFateCard, mapRewardChange, mapPotentialChange
end
function StarTowerLevelData:ProcessTowerChangeData(mapChange)
if not mapChange then
return {}, {}
end
local mapChangeNote = {}
if mapChange.Infos and next(mapChange.Infos) ~= nil then
for _, mapNoteInfo in ipairs(mapChange.Infos) 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
mapChangeNote[mapNoteInfo.Tid] = mapNoteInfo
end
self:ResetNoteInfo()
self:ResetDiscInfo()
self:ChangeNote()
end
local mapChangeSecondarySkill = {}
if mapChange.Secondaries and next(mapChange.Secondaries) ~= nil then
for _, v in ipairs(mapChange.Secondaries) do
table.insert(mapChangeSecondarySkill, v)
if v.Active then
table.insert(self.tbActiveSecondaryIds, v.SecondaryId)
else
table.removebyvalue(self.tbActiveSecondaryIds, v.SecondaryId)
end
end
end
return mapChangeNote, mapChangeSecondarySkill
end
function StarTowerLevelData.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 StarTowerLevelData: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 StarTowerLevelData:GetStageId(nFloor)
if self.tbStarTowerAllLevel[nFloor] ~= nil then
return self.tbStarTowerAllLevel[nFloor].Id
end
return 0
end
function StarTowerLevelData:GetStage(nFloor)
if self.tbStarTowerAllLevel[nFloor] ~= nil then
return self.tbStarTowerAllLevel[nFloor].Stage
end
return 0
end
function StarTowerLevelData:RemoveFateCardEft(nFateCardId)
local mapFateCardCfgData = ConfigTable.GetData("FateCard", nFateCardId)
if mapFateCardCfgData == nil then
printError("FateCardCfgData Missing:" .. nFateCardId)
else
local nEftId = mapFateCardCfgData.ClientEffect
if self.mapFateCardEft[nEftId] ~= nil and self.mapFateCardEft[nEftId].tbEftUid ~= nil then
for _, tbUid in ipairs(self.mapFateCardEft[nEftId].tbEftUid) do
UTILS.RemoveEffect(tbUid[1], tbUid[2])
end
self.mapFateCardEft[nEftId] = nil
end
for _, nExEftId in ipairs(mapFateCardCfgData.ClientExEffect) do
if self.mapFateCardEft[nExEftId] ~= nil and self.mapFateCardEft[nExEftId].tbEftUid ~= nil then
for _, tbUid in ipairs(self.mapFateCardEft[nExEftId].tbEftUid) do
UTILS.RemoveEffect(tbUid[1], tbUid[2])
end
self.mapFateCardEft[nExEftId] = nil
end
end
end
end
function StarTowerLevelData: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 or mapFateCardCfgData.MethodMode ~= GameEnum.fateCardMethodMode.ClientFateCard 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 _, nEftId in ipairs(mapFateCardCfgData.ClientExEffect) do
self.mapFateCardEft[nEftId] = {
nFateCardId = nFateCardId,
tbEftUid = {}
}
end
for _, nCharId in ipairs(self.tbTeam) do
local nUid = UTILS.AddFateCardEft(nCharId, mapFateCardCfgData.ClientEffect, nReaminCount)
table.insert(self.mapFateCardEft[mapFateCardCfgData.ClientEffect].tbEftUid, {nUid, nCharId})
for _, nEftId in ipairs(mapFateCardCfgData.ClientExEffect) do
local nUid = UTILS.AddFateCardEft(nCharId, nEftId, -1)
table.insert(self.mapFateCardEft[nEftId].tbEftUid, {nUid, nCharId})
end
end
end
end
function StarTowerLevelData: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]
if self.mapPotentialAddLevel[nCharId] ~= nil and self.mapPotentialAddLevel[nCharId][nPotentialId] ~= nil then
nCount = nCount + self.mapPotentialAddLevel[nCharId][nPotentialId]
end
end
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
if nCharTid == mapPotentialCfgData.CharId then
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
end
function StarTowerLevelData:SetFateCardToAdventureModule()
local tbFateCardInfo = {}
for nId, tbFateCard in pairs(self._mapFateCard) do
local stFateCard = CS.Lua2CSharpInfo_FateCardInfo()
stFateCard.fateCardId = nId
stFateCard.Remain = tbFateCard[1]
stFateCard.Room = tbFateCard[2]
table.insert(tbFateCardInfo, stFateCard)
end
safe_call_cs_func(CS.AdventureModuleHelper.SetFateCardInfos, tbFateCardInfo)
end
function StarTowerLevelData:ChangeNote()
for nDiscId, mapDiscData in pairs(self.mapDiscData) do
if table.indexof(self.tbDisc, nDiscId) <= 3 then
if self.mapDiscEft[nDiscId] == nil then
self.mapDiscEft[nDiscId] = {}
else
for _, tbEft in pairs(self.mapDiscEft[nDiscId]) do
for _, tbEftData in ipairs(tbEft) do
UTILS.RemoveEffect(tbEftData[1], tbEftData[2])
end
end
self.mapDiscEft[nDiscId] = {}
end
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
end
end
for nNoteId, nNoteCount in pairs(self._mapNote) do
if self.mapNoteEft[nNoteId] == nil then
self.mapNoteEft[nNoteId] = {}
else
for _, tbEft in pairs(self.mapNoteEft[nNoteId]) do
for _, tbEftData in ipairs(tbEft) do
UTILS.RemoveEffect(tbEftData[1], tbEftData[2])
end
end
self.mapNoteEft[nNoteId] = {}
end
if 0 < nNoteCount then
local tbNoteEft = {}
local mapNoteCfgData = ConfigTable.GetData("SubNoteSkill", nNoteId)
if mapNoteCfgData == nil then
printError("NoteCfgData Missing:" .. nNoteId)
else
for _, nEftId in ipairs(mapNoteCfgData.EffectId) do
table.insert(tbNoteEft, {nEftId, nNoteCount})
end
end
for _, mapEft in ipairs(tbNoteEft) do
if self.mapNoteEft[nNoteId][mapEft[1]] == nil then
self.mapNoteEft[nNoteId][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.mapNoteEft[nNoteId][mapEft[1]], {nEftUid, nCharId})
end
end
end
end
end
end
function StarTowerLevelData:GetFateCardUsage()
local ret = {}
for nFateCardId, nCount in pairs(self.mapFateCardUseCount) do
table.insert(ret, {Id = nFateCardId, Times = nCount})
end
return ret
end
function StarTowerLevelData: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
return ret
end
function StarTowerLevelData.CheckBattleEnd(tbCases)
for _, mapCases in ipairs(tbCases) do
if mapCases.BattleCase ~= nil then
return false
end
end
return true
end
function StarTowerLevelData:GetDropInfo(nCurLevel, nRoomType, tbCases)
local ret = {
0,
0,
0,
0
}
local nCurStage = self.tbStarTowerAllLevel[nCurLevel]
local nCoinCount = nCurStage.InteriorCurrencyQuantity
ret[1] = nCoinCount
local mapExp = self.mapFloorExp[nCurStage.Stage]
if mapExp == nil then
ret[2] = 0
elseif nRoomType == GameEnum.starTowerRoomType.DangerRoom then
ret[2] = mapExp.DangerExp
elseif nRoomType == GameEnum.starTowerRoomType.HorrorRoom then
ret[2] = mapExp.HorrorExp
elseif nRoomType == GameEnum.starTowerRoomType.BattleRoom then
ret[2] = mapExp.NormalExp
elseif nRoomType == GameEnum.starTowerRoomType.EliteBattleRoom then
ret[2] = mapExp.EliteExp
elseif nRoomType == GameEnum.starTowerRoomType.BossRoom then
ret[2] = mapExp.BossExp
elseif nRoomType == GameEnum.starTowerRoomType.FinalBossRoom then
ret[2] = mapExp.FinalBossExp
else
ret[2] = 0
end
for _, mapCases in ipairs(tbCases) do
if mapCases.BattleCase ~= nil then
if mapCases.BattleCase.FateCard then
ret[3] = 1
end
if mapCases.BattleCase.SubNoteSkillNum then
ret[4] = mapCases.BattleCase.SubNoteSkillNum
end
end
end
return ret
end
function StarTowerLevelData:RecoverHp(nEffectId)
for _, nCharId in ipairs(self.tbTeam) do
print("AddRecoverEft:" .. nEffectId)
UTILS.AddEffect(nCharId, nEffectId, 0, 0)
end
local nMainChar = self.tbTeam[1]
local mapHp = self.GetActorHp()
local nHp
if mapHp ~= nil then
nHp = mapHp[nMainChar]
end
if nHp == nil then
nHp = -1
end
return nHp
end
function StarTowerLevelData:QueryLevelInfo(nId, nType, nParam1, nParam2)
if nType == GameEnum.levelTypeData.None then
return 0
elseif nType == GameEnum.levelTypeData.Exclusive then
local mapPotential = ConfigTable.GetData("Potential", nId)
if mapPotential == nil then
return 1
end
local nCharId = mapPotential.CharId
if self._mapPotential[nCharId] == nil then
return 1
end
if self._mapPotential[nCharId][nId] == nil then
return 1
end
return self._mapPotential[nCharId][nId]
elseif nType == GameEnum.levelTypeData.Actor then
if self.mapCharData[nId] == nil then
return nil
end
return self.mapCharData[nId].nLevel
elseif nType == GameEnum.levelTypeData.SkillSlot then
if self.mapCharData[nId] == nil then
return nil
end
if nParam1 == nil then
return self.mapCharData[nId].tbSkillLvs[1]
elseif nParam1 == 2 then
return self.mapCharData[nId].tbSkillLvs[2]
elseif nParam1 == 4 then
return self.mapCharData[nId].tbSkillLvs[3]
elseif nParam1 == 5 then
return self.mapCharData[nId].tbSkillLvs[1]
else
return self.mapCharData[nId].tbSkillLvs[1]
end
elseif nType == GameEnum.levelTypeData.BreakCount then
if self.mapCharData[nId] == nil then
return nil
end
return self.mapCharData[nId].nAdvance + 1
end
end
function StarTowerLevelData: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 StarTowerLevelData: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 StarTowerLevelData: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 StarTowerLevelData:PlayRoomBGM()
local bPlayOutfitBGM = mapBGMCfg[self.nRoomType]
local bChangeBgmState = true
if self.nLastRoomType ~= -1 then
if not mapBGMCfg[self.nLastRoomType] or not bPlayOutfitBGM then
self:ResetRoomBGM()
else
bChangeBgmState = false
end
end
if not bPlayOutfitBGM then
return
end
local nIndex = math.random(1, 3)
local nDiscId = self.tbDisc[nIndex]
local mapOutfitCfg = ConfigTable.GetData("DiscIP", nDiscId)
local sBGM = ""
if mapOutfitCfg ~= nil then
sBGM = mapOutfitCfg.VoFile
end
if "" ~= sBGM then
WwiseAudioMgr:PostEvent("music_outfit_enter")
WwiseAudioMgr:SetState("combat", "explore")
WwiseAudioMgr:SetState("outfit", sBGM)
self.sLastBGM = sBGM
elseif self.nLastRoomType == GameEnum.starTowerRoomType.ShopRoom or self.nLastRoomType == GameEnum.starTowerRoomType.EventRoom then
self:ResetRoomBGM()
self.sLastBGM = ""
end
self.nLastRoomType = self.nRoomType
end
function StarTowerLevelData:ResetRoomBGM()
WwiseAudioMgr:StopDiscMusic(true, function()
NovaAPI.UnLoadBankByEventName("music_outfit_stop")
end)
end
function StarTowerLevelData:ReplayShopBGM()
if self.sLastBGM ~= "" then
WwiseAudioMgr:PostEvent("music_outfit_enter")
WwiseAudioMgr:SetState("combat", "explore")
WwiseAudioMgr:SetState("outfit", self.sLastBGM)
end
end
function StarTowerLevelData:CacheTempData()
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])
local jsonString = AdventureModuleHelper.GetPlayerActorLocalDataJson(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 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,
jsonStr = jsonString
}
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
if charTid == self.tbTeam[1] then
self.mapCharacterTempData.shieldList = AdventureModuleHelper.GetEntityShieldList(playerids[i])
end
end
local mapCharHp = self.GetActorHp()
for nTid, mapCharInfo in pairs(self.mapActorInfo) do
if mapCharHp[nTid] ~= nil then
mapCharInfo.nHp = mapCharHp[nTid]
end
end
local data, nDataLength = EncodeTempDataJson(self.mapCharacterTempData)
return data, nDataLength
end
function StarTowerLevelData:CalCharFixedEffect(nCharId, bMainChar, mapDisc)
local stActorInfo = CS.Lua2CSharpInfo_CharAttribute()
self:CalCharacterAttrBattle(nCharId, stActorInfo, bMainChar, mapDisc)
return stActorInfo
end
function StarTowerLevelData:ResetAmmo()
if self.mapCharacterTempData.ammoInfo ~= nil then
local ret = {}
for nCharId, mapAmmo in pairs(self.mapCharacterTempData.ammoInfo) do
local stInfo = CS.Lua2CSharpInfo_ActorAmmoInfo()
local tbAmmoCount = {
mapAmmo.nAmmo1,
mapAmmo.nAmmo2,
mapAmmo.nAmmo3,
mapAmmo.nAmmoMax1 or 0,
mapAmmo.nAmmoMax2 or 0,
mapAmmo.nAmmoMax3 or 0
}
stInfo.actorID = nCharId
stInfo.ammoCount = tbAmmoCount
stInfo.ammoType = mapAmmo.nCurAmmo
table.insert(ret, stInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.SetActorAmmoInfos, ret)
end
end
function StarTowerLevelData:ResetSommon()
if self.mapCharacterTempData.sommonInfo ~= nil then
safe_call_cs_func(CS.AdventureModuleHelper.SetSummonMonsters, self.mapCharacterTempData.sommonInfo)
end
end
function StarTowerLevelData:ResetEffect()
local retPotential = {}
local retDisc = {}
local retFateCard = {}
local retNote = {}
local mapCharEffect = {}
for _, nCharId in ipairs(self.tbTeam) do
mapCharEffect[nCharId] = {}
mapCharEffect[nCharId][AllEnum.EffectType.Affinity] = self.mapCharData[nCharId].tbAffinityeffectIds == nil and {} or self.mapCharData[nCharId].tbAffinityeffectIds
mapCharEffect[nCharId][AllEnum.EffectType.Talent] = self.mapCharData[nCharId].tbTalentEffect == nil and {} or self.mapCharData[nCharId].tbTalentEffect
mapCharEffect[nCharId][AllEnum.EffectType.Equipment] = self.mapCharData[nCharId].tbEquipmentEffect == nil and {} or self.mapCharData[nCharId].tbEquipmentEffect
local nCount = 0
if self._mapPotential[nCharId] ~= nil then
for nPotentialId, nPotentialCount in pairs(self._mapPotential[nCharId]) do
if self.mapPotentialAddLevel[nCharId] ~= nil and self.mapPotentialAddLevel[nCharId][nPotentialId] ~= nil then
nPotentialCount = nPotentialCount + self.mapPotentialAddLevel[nCharId][nPotentialId]
end
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 nDiscId, mapDiscData in pairs(self.mapDiscData) do
if table.indexof(self.tbDisc, nDiscId) <= 3 then
local tbDiscEft = mapDiscData:GetSkillEffect(self._mapNote)
mapDiscEffect[mapDiscData.nId] = tbDiscEft
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.MethodMode == GameEnum.fateCardMethodMode.ClientFateCard and mapFateCardCfgData.ClientEffect ~= 0 then
mapFateCardEffect[nFateCardId] = {}
table.insert(mapFateCardEffect[nFateCardId], {
mapFateCardCfgData.ClientEffect,
tbRemain[1]
})
for _, nEftId in ipairs(mapFateCardCfgData.ClientExEffect) do
table.insert(mapFateCardEffect[nFateCardId], {nEftId, -1})
end
end
end
end
local mapNoteEffect = {}
for nNoteId, nNoteCount in pairs(self._mapNote) do
if 0 < nNoteCount then
local mapNoteCfgData = ConfigTable.GetData("SubNoteSkill", nNoteId)
if mapNoteCfgData == nil then
printError("NoteCfgData Missing:" .. nNoteId)
else
mapNoteEffect[nNoteId] = {}
for _, nEftId in ipairs(mapNoteCfgData.EffectId) do
table.insert(mapNoteEffect[nNoteId], {nEftId, nNoteCount})
end
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.Equipment] ~= nil then
for _, nEftId in ipairs(mapCharEffect[nCharId][AllEnum.EffectType.Equipment]) 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
for _, tbEft in ipairs(tbFateCardEft) do
local nEftUid = UTILS.AddFateCardEft(nCharId, tbEft[1], tbEft[2])
if retFateCard[tbEft[1]] == nil then
retFateCard[tbEft[1]] = {
nFateCardId = nFateCardId,
tbEftUid = {}
}
end
table.insert(retFateCard[tbEft[1]].tbEftUid, {nEftUid, nCharId})
end
end
for nNoteId, tbNoteEft in pairs(mapNoteEffect) do
if retNote[nNoteId] == nil then
retNote[nNoteId] = {}
end
for _, mapEft in ipairs(tbNoteEft) do
if retNote[nNoteId][mapEft[1]] == nil then
retNote[nNoteId][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(retNote[nNoteId][mapEft[1]], {nEftUid, nCharId})
end
end
end
return retPotential, retDisc, retFateCard, retNote
end
function StarTowerLevelData:ResetPersonalPerk()
for nCharId, mapPotential in pairs(self._mapPotential) do
local tbStInfo = {}
for nPotentialId, nCount in pairs(mapPotential) do
if self.mapPotentialAddLevel[nCharId] ~= nil and self.mapPotentialAddLevel[nCharId][nPotentialId] ~= nil then
nCount = nCount + self.mapPotentialAddLevel[nCharId][nPotentialId]
end
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 StarTowerLevelData:ChangePotentialCount(nPotentialId, nChangeCount)
local mapPotential = ConfigTable.GetData("Potential", nPotentialId)
if mapPotential ~= nil then
local nCharId = mapPotential.CharId
local stPerkInfo = CS.Lua2CSharpInfo_TPPerkInfo()
stPerkInfo.perkId = nPotentialId
stPerkInfo.nCount = nChangeCount
safe_call_cs_func(CS.AdventureModuleHelper.ChangePersonalPerkIds, {stPerkInfo}, nCharId, true)
end
end
function StarTowerLevelData: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.MethodMode == GameEnum.fateCardMethodMode.LuaFateCard and cardInfo.ThemeType ~= 0 then
local fcInfo = CS.Lua2CSharpInfo_FateCardThemeInfo()
fcInfo.theme = cardInfo.ThemeType
fcInfo.rank = cardInfo.ThemeValue
fcInfo.triggerTypes = cardInfo.ThemeTriggerType
fcInfo.operateType = 1
table.insert(tbFCInfo, fcInfo)
end
end
end
safe_call_cs_func(CS.AdventureModuleHelper.SetFateCardThemes, tbFCInfo)
end
function StarTowerLevelData:ResetFateCardRoomEft()
local roomEffect = {}
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.MethodMode == GameEnum.fateCardMethodMode.FloorBuffFateCard then
table.insert(roomEffect, cardInfo.ClientEffect)
end
end
end
safe_call_cs_func(CS.AdventureModuleHelper.RefreshRoomEffects, roomEffect)
end
function StarTowerLevelData: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 StarTowerLevelData:ResetDiscInfo()
local tbDiscInfo = {}
for nDiscId, mapDiscData in pairs(self.mapDiscData) do
if table.indexof(self.tbDisc, nDiscId) <= 3 and mapDiscData ~= nil then
local discInfo = mapDiscData:GetDiscInfo(self._mapNote)
table.insert(tbDiscInfo, discInfo)
end
end
safe_call_cs_func(CS.AdventureModuleHelper.SetDiscInfo, tbDiscInfo)
end
function StarTowerLevelData:SetActorHP()
local tbActorInfo = {}
if self.mapActorInfo == nil then
return
end
for nTid, mapCharInfo in pairs(self.mapActorInfo) do
local stCharInfo = CS.Lua2CSharpInfo_ActorAttribute()
stCharInfo.actorID = nTid
stCharInfo.curHP = mapCharInfo.nHp
table.insert(tbActorInfo, stCharInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.ResetActorAttributes, tbActorInfo)
end
function StarTowerLevelData:ResetBuff()
local ret = {}
if self.mapCharacterTempData.buffInfo ~= nil then
for nCharId, mapBuff in pairs(self.mapCharacterTempData.buffInfo) do
for _, mapBuffInfo in ipairs(mapBuff) do
local stBuffInfo = CS.Lua2CSharpInfo_ResetBuffInfo()
stBuffInfo.Id = mapBuffInfo.Id
stBuffInfo.Cd = mapBuffInfo.CD
stBuffInfo.buffNum = mapBuffInfo.nNum
if ret[nCharId] == nil then
ret[nCharId] = {}
end
table.insert(ret[nCharId], stBuffInfo)
end
end
end
safe_call_cs_func(CS.AdventureModuleHelper.ResetBuff, ret)
end
function StarTowerLevelData: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 StarTowerLevelData:SetCharStatus()
local nStatus = 0
local nStatusTime = 0
local tbActorInfo = {}
local jsonStr = ""
for _, nTid in ipairs(self.tbTeam) do
local stCharInfo = CS.Lua2CSharpInfo_ActorStatus()
if self.mapCharacterTempData.stateInfo ~= nil and self.mapCharacterTempData.stateInfo[nTid] ~= nil then
nStatus = self.mapCharacterTempData.stateInfo[nTid].nState
nStatusTime = self.mapCharacterTempData.stateInfo[nTid].nStateTime
jsonStr = self.mapCharacterTempData.stateInfo[nTid].jsonStr
end
stCharInfo.actorID = nTid
stCharInfo.status = nStatus
stCharInfo.specialStatusTime = nStatusTime
stCharInfo.localDataJson = jsonStr
table.insert(tbActorInfo, stCharInfo)
end
safe_call_cs_func(CS.AdventureModuleHelper.SetActorStatus, tbActorInfo)
end
function StarTowerLevelData:ReBattle()
if self.cachedRoomMeta == nil then
return false
end
if self.cachedClientData ~= nil then
self.mapCharacterTempData = DecodeTempDataJson(self.cachedClientData)
self.mapEffectTriggerCount = {}
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
end
if self.curRoom ~= nil then
self.curRoom:Exit()
self.curRoom = nil
end
local roomClass = self:GetcurRoom()
self.curRoom = roomClass.new(self, self.cachedRoomMeta.Cases, self.cachedRoomMeta.Data)
local function OnLevelUnloadComplete()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
self:ResetCharacter()
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, OnLevelUnloadComplete)
safe_call_cs_func(CS.AdventureModuleHelper.ClearCharacterDamageRecord, false)
NovaAPI.DispatchEventWithData("Level_Restart", nil, {})
safe_call_cs_func(CS.AdventureModuleHelper.LevelStateChanged, false)
end
function StarTowerLevelData:IsPreselectionData()
return self.mapPreselectionData ~= nil
end
function StarTowerLevelData:GetPotenRecommendStatus()
local bPotentialRecommend = false
local ispreSelect = PlayerData.StarTower:IsPreselectionData()
if not ispreSelect then
return bPotentialRecommend, ispreSelect
end
local bPotentialRecommend = true
local bPa = LocalData.GetPlayerLocalData("PotentialAllSwitchRecomm")
if nil ~= bPa then
bPotentialRecommend = bPa
else
local nState = ConfigTable.GetConfigNumber("PotentialAllSwitchRecomm")
bPotentialRecommend = nState == 1
end
return bPotentialRecommend, true
end
function StarTowerLevelData:GetRecommendList(tbPotential)
local tbRecommend = {}
if self.mapPreselectionData ~= nil then
for k, v in ipairs(self.mapPreselectionData.tbCharPotential) do
if k == 1 then
if self.tbTeam[k] == v.nCharId then
for _, potential in ipairs(v.tbPotential) do
if table.indexof(tbPotential, potential.nId) > 0 then
table.insert(tbRecommend, {
nId = potential.nId,
nLevel = potential.nLevel
})
end
end
end
elseif 1 < table.indexof(self.tbTeam, v.nCharId) then
for _, potential in ipairs(v.tbPotential) do
if table.indexof(tbPotential, potential.nId) > 0 then
table.insert(tbRecommend, {
nId = potential.nId,
nLevel = potential.nLevel
})
end
end
end
end
end
return tbRecommend
end
function StarTowerLevelData:GetRecommondPotential(tbPotentialData)
local tbPotential = {}
for _, mapData in ipairs(tbPotentialData) do
table.insert(tbPotential, mapData.Id)
end
if self.mapPreselectionData ~= nil then
local tbRecommend = self:GetRecommendList(tbPotential)
return tbRecommend
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 < 1 then
return ret
end
if #ret1 < 2 then
return ret1
end
local ret2 = {}
local nCurBuildCount = -1
local bHasBuild = false
local GetPotentialBuildCount = function(nPotnetialId)
local ret = 0
local retBuild = 0
local potentialCfg = ConfigTable.GetData("Potential", nPotnetialId)
if potentialCfg ~= nil then
retBuild = potentialCfg.Build
local nCharId = potentialCfg.CharId
for nId, nCount in pairs(self._mapPotential[nCharId]) do
local mapCfg = ConfigTable.GetData("Potential", nId)
local potentialItemCfg = ConfigTable.GetData_Item(nId)
if mapCfg ~= nil and potentialItemCfg ~= nil then
local param = 1
if potentialItemCfg.Stype == GameEnum.itemStype.SpecificPotential then
param = 99
end
if mapCfg.Build == potentialCfg.Build then
ret = ret + param
end
end
end
end
return ret, retBuild
end
for _, v in ipairs(ret1) do
local nPotentialId = v.nId
local nCount, nBuild = GetPotentialBuildCount(nPotentialId)
if nCurBuildCount < 0 and nBuild ~= 0 then
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
bHasBuild = nBuild ~= GameEnum.potentialBuild.PotentialBuildCommon
elseif bHasBuild then
if nBuild ~= GameEnum.potentialBuild.PotentialBuildCommon then
if nCount == nCurBuildCount then
table.insert(ret2, {nId = nPotentialId})
elseif nCount > nCurBuildCount then
ret2 = {}
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
bHasBuild = nBuild ~= GameEnum.potentialBuild.PotentialBuildCommon
end
end
elseif nBuild == GameEnum.potentialBuild.PotentialBuildCommon then
if nCount == nCurBuildCount then
table.insert(ret2, {nId = nPotentialId})
elseif nCount > nCurBuildCount then
ret2 = {}
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
end
else
ret2 = {}
table.insert(ret2, {nId = nPotentialId})
nCurBuildCount = nCount
bHasBuild = true
end
end
if #ret2 < 1 then
return ret1
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
if #ret3 < 1 then
return ret2
end
return ret3
end
return StarTowerLevelData