Files
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

401 lines
13 KiB
Lua

local GoldenSpyLevelData = class("GoldenSpyLevelData")
local GoldenSpyFloorData = require("Game.UI.Activity.GoldenSpy.GoldenSpyFloorData")
function GoldenSpyLevelData:ctor()
end
function GoldenSpyLevelData:InitData()
if self.floorData == nil then
self.floorData = GoldenSpyFloorData.new()
end
self.floorData:InitData()
self.nCurScore = 0
self.nCurFloor = 1
self.nCurFloorId = nil
self.tbCatchItem = {}
self.tbBuff = {}
self.tbUsedSkill = {}
self.tbSkillData = {}
self.taskData = {
nScore = 0,
tbItems = {}
}
self.nCompleteTaskCount = 0
self.nBuffRefreshCount = 0
self.nLevelType = nil
self.tbRandomPrefabName = {}
self.tempPointData = nil
end
function GoldenSpyLevelData:StartLevel(levelId)
self.levelId = levelId
self.levelConfig = ConfigTable.GetData("GoldenSpyLevel", levelId)
if self.levelConfig == nil then
return
end
self.nCurFloorId = self.levelConfig.FloorList[self.nCurFloor]
self.floorData:StartFloor(levelId, self.nCurFloorId)
self.nLevelType = self.levelConfig.LevelType
local tbSkillData = decodeJson(self.levelConfig.Skill)
for _, v in ipairs(tbSkillData) do
self.tbSkillData[v[1]] = v[2]
self.tbUsedSkill[v[1]] = 0
end
self.nBuffRefreshCount = self.levelConfig.BuffRefeshCount
end
function GoldenSpyLevelData:RestartCurrentFloor()
if self.tempPointData == nil then
self:InitData()
self:StartLevel(self.levelId)
return
end
self.nCurScore = self.tempPointData.nCurScore
self.tbCatchItem = self.tempPointData.tbCatchItem
self.tbBuff = self.tempPointData.tbBuff
self.tbUsedSkill = self.tempPointData.tbUsedSkill
self.tbSkillData = self.tempPointData.tbSkillData
self.nCompleteTaskCount = self.tempPointData.nCompleteTaskCount
self.nBuffRefreshCount = self.tempPointData.nBuffRefreshCount
local tbList = {}
for i = 1, #self.tempPointData.tbRandomPrefabName do
table.insert(tbList, self.tempPointData.tbRandomPrefabName[i])
end
self.tbRandomPrefabName = tbList
self.floorData:InitData()
self.floorData:StartFloor(self.levelId, self.nCurFloorId)
end
function GoldenSpyLevelData:NextFloor()
self.nCurFloor = self.nCurFloor + 1
self.nCurFloorId = self.levelConfig.FloorList[self.nCurFloor]
self.floorData:InitData()
self.floorData:StartFloor(self.levelId, self.nCurFloorId)
local tbCatchItem = {}
for k, v in pairs(self.tbCatchItem) do
tbCatchItem[k] = {
itemId = k,
itemCount = v.itemCount
}
end
local tbBuff = {}
for k, v in pairs(self.tbBuff) do
tbBuff[k] = {
buffId = v.buffId,
tbActiveFloor = v.tbActiveFloor,
bActive = v.bActive
}
end
local tbUsedSkill = {}
for k, v in pairs(self.tbUsedSkill) do
tbUsedSkill[k] = v
end
local tbSkillData = {}
for k, v in pairs(self.tbSkillData) do
tbSkillData[k] = v
end
local tbRandomPrefabName = {}
for i = 1, #self.tbRandomPrefabName do
table.insert(tbRandomPrefabName, self.tbRandomPrefabName[i])
end
self.tempPointData = {
nCurScore = self.nCurScore,
tbCatchItem = tbCatchItem,
tbBuff = tbBuff,
tbUsedSkill = tbUsedSkill,
tbSkillData = tbSkillData,
nCompleteTaskCount = self.nCompleteTaskCount,
nBuffRefreshCount = self.nBuffRefreshCount,
tbRandomPrefabName = tbRandomPrefabName
}
end
function GoldenSpyLevelData:GetFloorData()
return self.floorData
end
function GoldenSpyLevelData:GetCurScore()
return self.nCurScore
end
function GoldenSpyLevelData:AddScore(nScore)
self.nCurScore = self.nCurScore + nScore
end
function GoldenSpyLevelData:GetCurFloor()
return self.nCurFloor
end
function GoldenSpyLevelData:GetTotalFloor()
return #self.levelConfig.FloorList
end
function GoldenSpyLevelData:GetCurFloorId()
return self.nCurFloorId
end
function GoldenSpyLevelData:GetLevelPrefabName()
local floorCfg = ConfigTable.GetData("GoldenSpyFloor", self.nCurFloorId)
if floorCfg == nil then
return
end
local nPrefabName = floorCfg.PrefabName[1]
if self.levelConfig.LevelType == GameEnum.GoldenSpyLevelType.Random then
local tbPrefabPool = {}
for i = 1, #floorCfg.PrefabName do
table.insert(tbPrefabPool, floorCfg.PrefabName[i])
end
for i = #tbPrefabPool, 1, -1 do
local index = table.indexof(self.tbRandomPrefabName, tbPrefabPool[i])
if 0 < index then
table.remove(tbPrefabPool, i)
end
end
local nRandomIndex = math.random(1, #tbPrefabPool)
nPrefabName = tbPrefabPool[nRandomIndex]
table.insert(self.tbRandomPrefabName, nPrefabName)
end
return nPrefabName
end
function GoldenSpyLevelData:CatchedItem(nItemId, itemCtrl)
local itemCfg = ConfigTable.GetData("GoldenSpyItem", nItemId)
if itemCfg == nil then
return
end
local nScore = itemCfg.Score
if itemCtrl ~= nil then
if itemCtrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.SafeBox then
nScore = itemCtrl:GetScore()
end
if itemCtrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.Companion then
nScore = nScore + itemCtrl:GetBagItemPrice()
end
end
for _, v in ipairs(self.tbBuff) do
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore and buffCfg.Params[1] == itemCfg.ItemType and self:CheckBuffActive(v) then
nScore = nScore + buffCfg.Params[2]
end
end
self.nCurScore = self.nCurScore + nScore
if self.tbCatchItem[nItemId] == nil then
self.tbCatchItem[nItemId] = {itemId = nItemId, itemCount = 0}
end
self.tbCatchItem[nItemId].itemCount = self.tbCatchItem[nItemId].itemCount + 1
self.floorData:DeleteItem(nItemId)
local bFinishTask = self:UpdateTask(nItemId)
if bFinishTask then
self:RefreshTask()
end
return bFinishTask, nScore
end
function GoldenSpyLevelData:GetCatchItemData()
return self.tbCatchItem
end
function GoldenSpyLevelData:GetTaskData()
return self.taskData
end
function GoldenSpyLevelData:RefreshTask()
local nScore = 0
local tbItems = {}
self.taskData = {
nScore = 0,
tbItems = {}
}
local allItems = self.floorData:GetItems()
local items = {}
for _, v in pairs(allItems) do
local itemCfg = ConfigTable.GetData("GoldenSpyItem", v.itemId)
if itemCfg ~= nil and itemCfg.IsTask then
table.insert(items, v)
end
end
local nTotalItemCount = 0
for _, v in pairs(items) do
nTotalItemCount = nTotalItemCount + v.itemCount
end
if nTotalItemCount <= 0 then
return
end
local nRandomMaxCount = math.min(nTotalItemCount, 3)
local nExWeight = 0
for _, v in ipairs(self.tbBuff) do
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddTaskWeight and self:CheckBuffActive(v) then
nExWeight = nExWeight + buffCfg.Params[1]
end
end
local tbRandomTaskConfig = {}
local nRandomTotalWeight = 0
local mLogWeight = 0
local forEachLine_ExScore = function(mapLineData)
if mapLineData.ItemCount <= nRandomMaxCount then
table.insert(tbRandomTaskConfig, mapLineData)
if mapLineData.ItemCount == 1 then
nRandomTotalWeight = nRandomTotalWeight + mapLineData.Weight + nExWeight
mLogWeight = mapLineData.Weight + nExWeight
else
nRandomTotalWeight = nRandomTotalWeight + mapLineData.Weight
end
end
end
ForEachTableLine(DataTable.GoldenSpyExtraScore, forEachLine_ExScore)
if NovaAPI.IsEditorPlatform() then
print("GoldenSpyLevelCtrl: 单个物品任务权重:", mLogWeight, "总权重:", nRandomTotalWeight)
end
if #tbRandomTaskConfig <= 0 then
return
end
local nRandomWeight = math.random(1, nRandomTotalWeight)
local tempWeight = 0
local nRandomCount = 0
for i, v in ipairs(tbRandomTaskConfig) do
if v.ItemCount == 1 then
tempWeight = tempWeight + v.Weight + nExWeight
else
tempWeight = tempWeight + v.Weight
end
if nRandomWeight <= tempWeight then
nScore = v.Score
nRandomCount = v.ItemCount
break
end
end
local tempNum = 0
local tempItemList = {}
for _, v in pairs(items) do
for i = 1, v.itemCount do
table.insert(tempItemList, v.itemId)
end
end
for i = 1, nRandomCount do
local nRandomNum = math.random(1, #tempItemList)
table.insert(tbItems, {
nItemId = tempItemList[nRandomNum],
bFinish = false
})
table.remove(tempItemList, nRandomNum)
end
for _, v in ipairs(self.tbBuff) do
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddExScoreFactor and self:CheckBuffActive(v) then
nScore = nScore * (1 + buffCfg.Params[1] / 100.0)
nScore = math.floor(nScore)
end
end
self.taskData = {nScore = nScore, tbItems = tbItems}
end
function GoldenSpyLevelData:UpdateTask(nItemId)
if self.taskData == nil or self.taskData.nScore == 0 then
return false
end
for _, v in ipairs(self.taskData.tbItems) do
if v.nItemId == nItemId and v.bFinish == false then
v.bFinish = true
break
end
end
local bFinish = true
for _, v in ipairs(self.taskData.tbItems) do
if v.bFinish == false then
bFinish = false
break
end
end
if bFinish then
self:AddScore(self.taskData.nScore)
self.nCompleteTaskCount = self.nCompleteTaskCount + 1
end
return bFinish
end
function GoldenSpyLevelData:GetCompleteTaskCount()
return self.nCompleteTaskCount
end
function GoldenSpyLevelData:GetBuffData()
return self.tbBuff
end
function GoldenSpyLevelData:AddBuff(nBuffId)
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", nBuffId)
if buffCfg == nil then
return
end
local buffEntity = {
buffId = nBuffId,
tbActiveFloor = {},
bActive = false
}
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
table.insert(buffEntity.tbActiveFloor, self.nCurFloor)
buffEntity.bActive = true
if buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddTimeInFloor then
buffEntity.bActive = false
end
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
table.insert(buffEntity.tbActiveFloor, self.nCurFloor + 1)
buffEntity.bActive = true
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
buffEntity.bActive = true
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
buffEntity.bActive = true
if buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddSkillUseCount then
self.tbSkillData[buffCfg.Params[1]] = (self.tbSkillData[buffCfg.Params[1]] or 0) + buffCfg.Params[2]
EventManager.Hit("GoldenSpy_UpdateSkillCount", buffCfg.Params[1], self.tbSkillData[buffCfg.Params[1]])
elseif buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddBuffRefreshCount then
self.nBuffRefreshCount = self.nBuffRefreshCount + buffCfg.Params[1]
end
end
table.insert(self.tbBuff, buffEntity)
if self.taskData ~= nil and 0 < self.taskData.nScore and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddExScoreFactor and self:CheckBuffActive(buffEntity) then
self.taskData.nScore = self.taskData.nScore * (1 + buffCfg.Params[1] / 100.0)
self.taskData.nScore = math.floor(self.taskData.nScore)
EventManager.Hit("GoldenSpy_UpdateTaskScore", self.taskData.nScore)
end
if buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore then
EventManager.Hit("GoldenSpy_ItemUpdateScore", self.tbBuff)
end
end
function GoldenSpyLevelData:CheckBuffActive(buffEntity)
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", buffEntity.buffId)
if buffCfg == nil then
return false
end
local bActive = false
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
if buffEntity.bActive and table.indexof(buffEntity.tbActiveFloor, self.nCurFloor) > 0 then
bActive = true
end
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
if buffEntity.bActive and table.indexof(buffEntity.tbActiveFloor, self.nCurFloor) > 0 then
bActive = true
end
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
if buffEntity.bActive then
bActive = true
end
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
end
return bActive
end
function GoldenSpyLevelData:GetRefreshCount()
return self.nBuffRefreshCount
end
function GoldenSpyLevelData:UseRefreshCount()
if self.nBuffRefreshCount <= 0 then
return false
end
self.nBuffRefreshCount = self.nBuffRefreshCount - 1
return true
end
function GoldenSpyLevelData:AddRefreshCount(nCount)
self.nBuffRefreshCount = self.nBuffRefreshCount + nCount
end
function GoldenSpyLevelData:GetSkillData()
return self.tbSkillData
end
function GoldenSpyLevelData:GetUsedSkillData()
return self.tbUsedSkill
end
function GoldenSpyLevelData:UseSkill(nSkillId)
if self.tbSkillData[nSkillId] == nil or self.tbSkillData[nSkillId] <= 0 then
return
end
self.tbSkillData[nSkillId] = self.tbSkillData[nSkillId] - 1
self.tbUsedSkill[nSkillId] = self.tbUsedSkill[nSkillId] + 1
end
function GoldenSpyLevelData:AddSkill(nSkillId, nCount)
if self.tbSkillData[nSkillId] == nil then
return
end
self.tbSkillData[nSkillId] = self.tbSkillData[nSkillId] + nCount
EventManager.Hit("GoldenSpy_UpdateSkillCount", nSkillId, self.tbSkillData[nSkillId])
end
return GoldenSpyLevelData