Files
SL1900 46f967a584 Update - 1.6.0.84
EN: 1.6.0.84
CN: 1.6.0.87
JP: 1.6.0.88
KR: 1.6.0.91
2026-02-04 13:00:00 +09:00

1276 lines
47 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 BaseRoom = class("BaseRoom")
local TimerManager = require("GameCore.Timer.TimerManager")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
function BaseRoom:ctor(parentData, tbCases)
self.EnumCase = {
Battle = 1,
OpenDoor = 2,
PotentialSelect = 3,
FateCardSelect = 4,
NoteSelect = 5,
NpcEvent = 6,
SelectSpecialPotential = 7,
RecoveryHP = 8,
NpcRecoveryHP = 9,
Hawker = 10,
StrengthenMachine = 11,
DoorDanger = 12,
SyncHP = 13
}
self.EnumPopup = {
Reward = 1,
Potential = 2,
StrengthFx = 3,
Disc = 4,
Affinity = 5
}
self.curRoomType = 0
self.bBattleEnd = false
self.nCoinTemp = 0
self.tbEvent = {}
self._tbTimer = {}
self.roomData = {}
self.parent = parentData
self.mapCases = {}
self.bProcessing = true
self.nTaskType = 0
self.mapNpc = {}
self.initCases = tbCases
self.tbPopup = {}
self.blockNpcBtn = false
end
function BaseRoom:_BindEventCallback(mapEventConfig)
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
local callback1 = self.OnEvent_NpcSpawned
if type(callback1) == "function" then
EventManager.Add("LevelNpcSpawned", self, callback1)
end
local callback2 = self.OnEvent_DiscSkillActive
if type(callback2) == "function" then
EventManager.Add("DiscSkillActive", self, callback2)
end
local callback3 = self.OnEvent_RewardPopup
if type(callback3) == "function" then
EventManager.Add("StarTowerReward", self, callback3)
end
local callback4 = self.OnEvent_PotentialPopup
if type(callback4) == "function" then
EventManager.Add("PotentialLevelUp", self, callback4)
end
local callback5 = self.OnEvent_ShopStrengthFx
if type(callback5) == "function" then
EventManager.Add("ShopStrengthFx", self, callback5)
end
local callback6 = self.OnEvent_CloseLoadingView
if type(callback5) == "function" then
EventManager.Add(EventId.TransAnimOutClear, self, callback6)
end
end
function BaseRoom:_UnbindEventCallback(mapEventConfig)
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
local callback1 = self.OnEvent_NpcSpawned
EventManager.Remove("LevelNpcSpawned", self, callback1)
local callback2 = self.OnEvent_DiscSkillActive
EventManager.Remove("DiscSkillActive", self, callback2)
local callback3 = self.OnEvent_RewardPopup
EventManager.Remove("StarTowerReward", self, callback3)
local callback4 = self.OnEvent_PotentialPopup
EventManager.Remove("PotentialLevelUp", self, callback4)
local callback5 = self.OnEvent_ShopStrengthFx
EventManager.Remove("ShopStrengthFx", self, callback5)
local callback6 = self.OnEvent_CloseLoadingView
EventManager.Remove(EventId.TransAnimOutClear, self, callback6)
end
function BaseRoom:_RemoveAllTimer()
for i, timer in ipairs(self._tbTimer) do
if timer ~= nil then
TimerManager.Remove(timer, false)
end
end
end
function BaseRoom:AddTimer(nTargetCount, nInterval, sCallbackName, bAutoRun, bDestroyWhenComplete, nScaleType, tbParam)
local callback
if type(sCallbackName) == "function" then
callback = sCallbackName
else
callback = self[sCallbackName]
end
if type(callback) == "function" then
local timer = TimerManager.Add(nTargetCount, nInterval, self, callback, bAutoRun, bDestroyWhenComplete, nScaleType, tbParam)
if timer ~= nil then
table.insert(self._tbTimer, timer)
end
return timer
else
return nil
end
end
function BaseRoom:Enter()
self._EntryTime = CS.ClientManager.Instance.serverTimeStampWithTimeZone
self:_BindEventCallback(self._mapEventConfig)
local nLevel = self.parent.nCurLevel
local nTotalLevel = #self.parent.tbStarTowerAllLevel
local nType = self.parent.nRoomType
if self.parent.nTowerId ~= 999 then
EventManager.Hit("ShowStarTowerLevelTitle", nLevel, nTotalLevel, nType)
end
EventManager.Hit("StarTowerSetButtonEnable", true, true)
EventManager.Hit("InitStarTowerNote", self.parent._mapNote)
self:SaveCase(self.initCases)
self.initCases = nil
self.nTime = 0
if type(self.LevelStart) == "function" then
self:LevelStart()
end
EventManager.Hit("RefreshFateCard", clone(self.parent._mapFateCard))
if nType == GameEnum.starTowerRoomType.ShopRoom then
EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_ShopRoom")
local nVoiceDelay = ConfigTable.GetConfigNumber("StarTowerPlayerVoiceDelay")
self:AddTimer(1, nVoiceDelay, function()
EventManager.Hit("PlayEnterShopRoomCharVoice", nLevel, nType)
end, true, true)
end
end
function BaseRoom:Exit()
EventManager.Hit("ShowStarTowerRoomInfo", false)
EventManager.Hit("FRRoomEnd")
self:_RemoveAllTimer()
self:_UnbindEventCallback(self._mapEventConfig)
end
function BaseRoom:ActiveTeleport()
safe_call_cs_func(CS.AdventureModuleHelper.OpenActiveTeleporter)
if not self.bShowTeleport then
self.bShowTeleport = true
self:ShowTeleportIndicator()
end
end
function BaseRoom:ShowTeleportIndicator()
local mapMapData = ConfigTable.GetData("StarTowerMap", self.parent.curMapId)
if mapMapData ~= nil and mapMapData.OutPortHint then
local tbTeleports = CS.AdventureModuleHelper.GetLevelTeleporters()
if tbTeleports ~= nil then
for i = 0, tbTeleports.Count - 1 do
EventManager.Hit("SetIndicator", 2, tbTeleports[i], Vector3.zero, nil)
end
end
end
end
function BaseRoom:SaveCase(tbCases)
if tbCases == nil then
return
end
for _, mapCaseData in ipairs(tbCases) do
if mapCaseData.BattleCase ~= nil then
print("BattleCase")
if self.mapCases[self.EnumCase.Battle] ~= nil then
printError("战斗事件重复 可能导致房间事件处理无法结束")
end
self.mapCases[self.EnumCase.Battle] = {}
self.mapCases[self.EnumCase.Battle].Id = mapCaseData.Id
self.mapCases[self.EnumCase.Battle].Data = mapCaseData.BattleCase
self.mapCases[self.EnumCase.Battle].bFinish = false
elseif mapCaseData.DoorCase ~= nil then
if mapCaseData.DoorCase.Type == GameEnum.starTowerRoomType.DangerRoom then
print("DangerRoomCase")
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
local nNpcId = mapStarTower.DangerNpc
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
self.mapNpc[nNpcId] = mapCaseData.Id
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
if self.mapCases[self.EnumCase.DoorDanger] == nil then
self.mapCases[self.EnumCase.DoorDanger] = {}
end
self.mapCases[self.EnumCase.DoorDanger][mapCaseData.Id] = mapCaseData.DoorCase
self.mapCases[self.EnumCase.DoorDanger][mapCaseData.Id].bFinish = false
elseif mapCaseData.DoorCase.Type == GameEnum.starTowerRoomType.HorrorRoom then
print("HorrorRoomCase")
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
local nNpcId = mapStarTower.HorrorNpc
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
self.mapNpc[nNpcId] = mapCaseData.Id
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
if self.mapCases[self.EnumCase.DoorDanger] == nil then
self.mapCases[self.EnumCase.DoorDanger] = {}
end
self.mapCases[self.EnumCase.DoorDanger][mapCaseData.Id] = mapCaseData.DoorCase
self.mapCases[self.EnumCase.DoorDanger][mapCaseData.Id].bFinish = false
else
print("DoorCase")
if self.mapCases[self.EnumCase.OpenDoor] == nil then
self:ActiveTeleport()
self.mapCases[self.EnumCase.OpenDoor] = {
mapCaseData.Id,
mapCaseData.DoorCase.Type
}
end
end
elseif mapCaseData.SelectPotentialCase ~= nil then
print("SelectPotentialCase")
if self.mapCases[self.EnumCase.PotentialSelect] == nil then
self.mapCases[self.EnumCase.PotentialSelect] = {}
end
self.mapCases[self.EnumCase.PotentialSelect][mapCaseData.Id] = mapCaseData.SelectPotentialCase
self.mapCases[self.EnumCase.PotentialSelect][mapCaseData.Id].bFinish = false
elseif mapCaseData.SelectSpecialPotentialCase ~= nil then
print("SelectSpecialPotentialCase")
if self.mapCases[self.EnumCase.SelectSpecialPotential] == nil then
self.mapCases[self.EnumCase.SelectSpecialPotential] = {}
end
self.mapCases[self.EnumCase.SelectSpecialPotential][mapCaseData.Id] = mapCaseData.SelectSpecialPotentialCase
self.mapCases[self.EnumCase.SelectSpecialPotential][mapCaseData.Id].bFinish = false
elseif mapCaseData.SelectFateCardCase ~= nil then
print("SelectFateCardCase")
if self.mapCases[self.EnumCase.FateCardSelect] == nil then
self.mapCases[self.EnumCase.FateCardSelect] = {}
end
self.mapCases[self.EnumCase.FateCardSelect][mapCaseData.Id] = mapCaseData.SelectFateCardCase
self.mapCases[self.EnumCase.FateCardSelect][mapCaseData.Id].bFinish = false
elseif mapCaseData.SelectNoteCase ~= nil then
print("SelectNoteCase")
if self.mapCases[self.EnumCase.NoteSelect] == nil then
self.mapCases[self.EnumCase.NoteSelect] = {}
end
self.mapCases[self.EnumCase.NoteSelect][mapCaseData.Id] = mapCaseData.SelectNoteCase
self.mapCases[self.EnumCase.NoteSelect][mapCaseData.Id].bFinish = false
elseif mapCaseData.SelectOptionsEventCase ~= nil then
print("SelectOptionsEventCase")
if self.mapCases[self.EnumCase.NpcEvent] == nil then
self.mapCases[self.EnumCase.NpcEvent] = {}
end
local mapEventCfgData = ConfigTable.GetData("StarTowerEvent", mapCaseData.SelectOptionsEventCase.EvtId)
if mapEventCfgData ~= nil then
local nNpcId = mapCaseData.SelectOptionsEventCase.NPCId
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
if mapNpcCfgData ~= nil then
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
if self.mapNpc[nNpcId] ~= nil then
printError("NpcId重复" .. mapCaseData.SelectOptionsEventCase.EvtId)
end
self.mapNpc[nNpcId] = mapCaseData.Id
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
local nActionId = mapCaseData.SelectOptionsEventCase.EvtId * 10000 + nNpcId
if ConfigTable.GetData("StarTowerEventAction", nActionId) ~= nil then
mapCaseData.SelectOptionsEventCase.nActionId = nActionId
else
printError("该事件没有对应的action" .. mapCaseData.SelectOptionsEventCase.EvtId)
mapCaseData.SelectOptionsEventCase.nActionId = 0
end
else
printError("没有找到对应NPC配置 " .. nNpcId)
end
end
self.mapCases[self.EnumCase.NpcEvent][mapCaseData.Id] = mapCaseData.SelectOptionsEventCase
self.mapCases[self.EnumCase.NpcEvent][mapCaseData.Id].bFinish = mapCaseData.SelectOptionsEventCase.Done
self.mapCases[self.EnumCase.NpcEvent][mapCaseData.Id].bFirst = true
elseif mapCaseData.RecoveryHPCase ~= nil then
print("RecoveryHPCase")
if self.mapCases[self.EnumCase.RecoveryHP] == nil then
self.mapCases[self.EnumCase.RecoveryHP] = {}
end
self.mapCases[self.EnumCase.RecoveryHP][mapCaseData.Id] = mapCaseData.RecoveryHPCase
self.mapCases[self.EnumCase.RecoveryHP][mapCaseData.Id].bFinish = false
elseif mapCaseData.NpcRecoveryHPCase ~= nil then
print("NpcRecoveryHPCase")
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
local nNpcId = mapStarTower.ResqueNpc
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
self.mapNpc[nNpcId] = mapCaseData.Id
if self.mapCases[self.EnumCase.NpcRecoveryHP] == nil then
self.mapCases[self.EnumCase.NpcRecoveryHP] = {}
end
self.mapCases[self.EnumCase.NpcRecoveryHP][mapCaseData.Id] = mapCaseData.NpcRecoveryHPCase
self.mapCases[self.EnumCase.NpcRecoveryHP][mapCaseData.Id].bFinish = false
elseif mapCaseData.HawkerCase ~= nil then
print("HawkerCase")
local nType = self.parent.nRoomType
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
local nNpcId = mapStarTower.ShopNpc
if nType ~= GameEnum.starTowerRoomType.ShopRoom then
nNpcId = mapStarTower.StandShopNpc
end
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
self.mapNpc[nNpcId] = mapCaseData.Id
if self.mapCases[self.EnumCase.Hawker] == nil then
self.mapCases[self.EnumCase.Hawker] = {}
end
self.mapCases[self.EnumCase.Hawker][mapCaseData.Id] = mapCaseData.HawkerCase
self.mapCases[self.EnumCase.Hawker][mapCaseData.Id].bFinish = false
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
elseif mapCaseData.StrengthenMachineCase ~= nil then
print("StrengthenMachineCase")
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
local nNpcId = mapStarTower.UpgradeNpc
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
local nBoardNpcId = mapNpcCfgData.NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
self.mapNpc[nNpcId] = mapCaseData.Id
if self.mapCases[self.EnumCase.StrengthenMachine] == nil then
self.mapCases[self.EnumCase.StrengthenMachine] = {}
end
self.mapCases[self.EnumCase.StrengthenMachine][mapCaseData.Id] = mapCaseData.StrengthenMachineCase
self.mapCases[self.EnumCase.StrengthenMachine][mapCaseData.Id].bFinish = false
safe_call_cs_func(CS.AdventureModuleHelper.SpawnNPC, nNpcId, nSkinId)
elseif mapCaseData.SyncHPCase ~= nil then
self.mapCases[self.EnumCase.SyncHP] = mapCaseData.Id
end
end
end
function BaseRoom:SaveSelectResp(mapCaseData, nCaseId)
if not mapCaseData or not nCaseId then
return
end
if mapCaseData.SelectPotentialCase ~= nil then
self.mapCases[self.EnumCase.PotentialSelect][nCaseId] = mapCaseData.SelectPotentialCase
self.mapCases[self.EnumCase.PotentialSelect][nCaseId].bFinish = false
self.mapCases[self.EnumCase.PotentialSelect][nCaseId].bReRoll = true
elseif mapCaseData.SelectSpecialPotentialCase ~= nil then
self.mapCases[self.EnumCase.SelectSpecialPotential][nCaseId] = mapCaseData.SelectSpecialPotentialCase
self.mapCases[self.EnumCase.SelectSpecialPotential][nCaseId].bFinish = false
self.mapCases[self.EnumCase.SelectSpecialPotential][nCaseId].bReRoll = true
elseif mapCaseData.SelectFateCardCase ~= nil then
self.mapCases[self.EnumCase.FateCardSelect][nCaseId] = mapCaseData.SelectFateCardCase
self.mapCases[self.EnumCase.FateCardSelect][nCaseId].bFinish = false
self.mapCases[self.EnumCase.FateCardSelect][nCaseId].bReRoll = true
elseif mapCaseData.HawkerCase ~= nil then
self.mapCases[self.EnumCase.Hawker][nCaseId] = mapCaseData.HawkerCase
self.mapCases[self.EnumCase.Hawker][nCaseId].bFinish = false
self.mapCases[self.EnumCase.Hawker][nCaseId].bReRoll = true
end
end
function BaseRoom:HandleNpc(nNpcId, nNpcUid)
if self.blockNpcBtn then
return
end
local nCaseId = self.mapNpc[nNpcId]
if nCaseId == nil then
printError("Npc没有对应事件ID:" .. nNpcId)
return
end
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
if mapNpcCfgData == nil then
printError("Npc config missing:" .. nNpcId)
return
end
if mapNpcCfgData.type == GameEnum.npcNewType.Narrate then
local tbChat = ConfigTable.GetData("NPCConfig", nNpcId).Lines
local nTalkId = tbChat[math.random(1, #tbChat)]
if nTalkId == nil then
nTalkId = 0
end
local nBoardNpcId = ConfigTable.GetData("NPCConfig", nNpcId).NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.NpcOptionPanel, 0, 0, {}, nSkinId, 1, {}, {}, nTalkId, 0, true, false, nCoin, self.parent.nTowerId, self.parent._mapNote, self.parent.tbDisc)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Event then
self:OpenNpcOptionPanel(nCaseId, nNpcId)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Resque then
self:HandleNpcRecover(nCaseId, nNpcId)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Danger then
self:HandleNpcDangerRoom(nCaseId, nNpcId)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Horror then
self:HandleNpcDangerRoom(nCaseId, nNpcId)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Shop then
self:InteractiveShop(nCaseId, nNpcId)
return
elseif mapNpcCfgData.type == GameEnum.npcNewType.Upgrade then
self:InteractiveStrengthMachine(nCaseId, nNpcId)
return
else
printError("待处理事件")
end
printError("没有找到可交互的事件:" .. nNpcId)
end
function BaseRoom:GetBattleCase()
if self.mapCases[self.EnumCase.PotentialSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.PotentialSelect]) do
if mapData.bFinish ~= true then
return
end
end
end
return false
end
function BaseRoom:HandleCases()
local wait_case = function(callback)
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.BlockInput, false)
callback()
end
cs_coroutine.start(wait)
end
if self.tbPopup[self.EnumPopup.StrengthFx] ~= nil then
for _, mapData in ipairs(self.tbPopup[self.EnumPopup.StrengthFx]) do
if not mapData.bFinish then
self:HandleShopStrengthFx(mapData)
return
end
end
end
if self.tbPopup[self.EnumPopup.Potential] ~= nil then
for _, mapData in ipairs(self.tbPopup[self.EnumPopup.Potential]) do
if not mapData.bFinish then
wait_case(function()
self:HandlePopupPotential(mapData)
end)
return
end
end
end
if self.tbPopup[self.EnumPopup.Reward] ~= nil then
for _, mapData in ipairs(self.tbPopup[self.EnumPopup.Reward]) do
if not mapData.bFinish then
wait_case(function()
self:HandlePopupReward(mapData)
end)
return
end
end
end
if self.mapCases[self.EnumCase.RecoveryHP] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.RecoveryHP]) do
if mapData.bFinish ~= true then
self:HandleRecover(nId)
return
end
end
end
if self.mapCases[self.EnumCase.SelectSpecialPotential] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.SelectSpecialPotential]) do
if mapData.bFinish ~= true then
wait_case(function()
self:OpenSelectPotential(nId, true)
end)
return
end
end
end
if self.mapCases[self.EnumCase.PotentialSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.PotentialSelect]) do
if mapData.bFinish ~= true then
wait_case(function()
self:OpenSelectPotential(nId)
end)
return
end
end
end
if self.mapCases[self.EnumCase.NoteSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.NoteSelect]) do
if mapData.bFinish ~= true then
wait_case(function()
self:OpenSelectNote(nId)
end)
return
end
end
end
if self.mapCases[self.EnumCase.FateCardSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.FateCardSelect]) do
if mapData.bFinish ~= true then
wait_case(function()
self:OpenSelectFateCard(nId)
end)
return
end
end
end
if self.tbPopup[self.EnumPopup.Disc] ~= nil then
for _, mapData in ipairs(self.tbPopup[self.EnumPopup.Disc]) do
if not mapData.bFinish then
wait_case(function()
self:HandlePopupDisc(mapData)
end)
return
end
end
end
if self.tbPopup[self.EnumPopup.Affinity] ~= nil then
for _, mapData in ipairs(self.tbPopup[self.EnumPopup.Affinity]) do
EventManager.Hit("ShowNPCAffinity", mapData.NPCId, mapData.Increase)
end
self.tbPopup[self.EnumPopup.Affinity] = {}
end
self.blockNpcBtn = false
return false
end
function BaseRoom:OpenSelectPotential(nCaseId, bSpecial)
local ProcessSpecialPotentialData = function(nId)
local mapCaseData = self.mapCases[self.EnumCase.SelectSpecialPotential][nId]
local tbPotential = {}
local mapPotential = {}
for _, nPotentialId in ipairs(mapCaseData.Ids) do
table.insert(tbPotential, {Id = nPotentialId, Count = 1})
mapPotential[nPotentialId] = 0
local mapPotentialCfgData = ConfigTable.GetData("Potential", nPotentialId)
if mapPotentialCfgData == nil then
printError("PotentialCfgData Missing" .. nPotentialId)
return
end
local nCharId = mapPotentialCfgData.CharId
if self.parent._mapPotential[nCharId][nPotentialId] ~= nil then
mapPotential[nPotentialId] = self.parent._mapPotential[nCharId][nPotentialId]
end
end
local nType = 0
if 0 < mapCaseData.TeamLevel then
nType = 1
end
local mapRoll = {
CanReRoll = mapCaseData.CanReRoll,
ReRollPrice = mapCaseData.ReRollPrice
}
return tbPotential, mapPotential, nType, mapCaseData.TeamLevel, mapCaseData.NewIds, mapRoll
end
local ProcessPotentialData = function(nId)
local mapCaseData = self.mapCases[self.EnumCase.PotentialSelect][nId]
local tbPotential = {}
local mapPotential = {}
for _, mapPotentialInfo in ipairs(mapCaseData.Infos) do
table.insert(tbPotential, {
Id = mapPotentialInfo.Tid,
Count = mapPotentialInfo.Level
})
mapPotential[mapPotentialInfo.Tid] = 0
local mapPotentialCfgData = ConfigTable.GetData("Potential", mapPotentialInfo.Tid)
if mapPotentialCfgData == nil then
printError("PotentialCfgData Missing" .. mapPotentialInfo.Tid)
return
end
local nCharId = mapPotentialCfgData.CharId
if self.parent._mapPotential[nCharId][mapPotentialInfo.Tid] ~= nil then
mapPotential[mapPotentialInfo.Tid] = self.parent._mapPotential[nCharId][mapPotentialInfo.Tid]
end
end
local mapRoll = {
CanReRoll = mapCaseData.CanReRoll,
ReRollPrice = mapCaseData.ReRollPrice
}
return tbPotential, mapPotential, mapCaseData.Type, mapCaseData.TeamLevel, mapCaseData.NewIds, mapRoll, mapCaseData.LuckyIds
end
local GetUnfinishedSelect = function()
if self.mapCases[self.EnumCase.SelectSpecialPotential] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.SelectSpecialPotential]) do
if mapData.bFinish ~= true then
local tbPotential, mapPotential, nType, nLevel, tbNewIds, mapRoll = ProcessSpecialPotentialData(nId)
return nId, tbPotential, mapPotential, nType, nLevel, tbNewIds, mapRoll
end
end
end
if self.mapCases[self.EnumCase.PotentialSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.PotentialSelect]) do
if mapData.bFinish ~= true then
local tbPotential, mapPotential, nType, nLevel, tbNewIds, mapRoll, tbLuckyIds = ProcessPotentialData(nId)
return nId, tbPotential, mapPotential, nType, nLevel, tbNewIds, mapRoll, tbLuckyIds
end
end
end
return 0, {}, {}, 0
end
local SelectCallback = function(nIdx, nId, panelCallback, bReRoll)
if nId == -1 then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:HandleCases()
end
cs_coroutine.start(wait)
return
end
local msg = {}
msg.Id = nId
msg.SelectReq = {}
if bReRoll then
msg.SelectReq.ReRoll = true
else
msg.SelectReq.Index = nIdx - 1
end
local InteractiveCallback = function(callbackMsg)
local Id = callbackMsg.Id
if self.mapCases[self.EnumCase.SelectSpecialPotential] ~= nil and self.mapCases[self.EnumCase.SelectSpecialPotential][Id] ~= nil then
if self.mapCases[self.EnumCase.SelectSpecialPotential][nId].bReRoll then
self.mapCases[self.EnumCase.SelectSpecialPotential][nId].bReRoll = false
else
self.mapCases[self.EnumCase.SelectSpecialPotential][Id].bFinish = true
end
end
if self.mapCases[self.EnumCase.PotentialSelect] ~= nil and self.mapCases[self.EnumCase.PotentialSelect][Id] ~= nil then
if self.mapCases[self.EnumCase.PotentialSelect][nId].bReRoll then
self.mapCases[self.EnumCase.PotentialSelect][nId].bReRoll = false
else
self.mapCases[self.EnumCase.PotentialSelect][Id].bFinish = true
end
end
local caseId, tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, mapRoll, tbLuckyIds = GetUnfinishedSelect()
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
if panelCallback ~= nil and type(panelCallback) == "function" then
local tbRecommend = self.parent:GetRecommondPotential(tbPotential)
panelCallback(caseId, tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, mapRoll, nCoin, tbLuckyIds, tbRecommend)
end
end
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
local tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, mapRoll, tbLuckyIds
if bSpecial then
tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, mapRoll = ProcessSpecialPotentialData(nCaseId)
else
tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, mapRoll, tbLuckyIds = ProcessPotentialData(nCaseId)
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
local tbRecommend = self.parent:GetRecommondPotential(tbPotential)
EventManager.Hit("StarTowerPotentialSelect", nCaseId, tbPotential, mapPotential, nType, nTeamLevel, tbNewIds, SelectCallback, mapRoll, nCoin, tbLuckyIds, tbRecommend)
end
function BaseRoom:OpenSelectNote(nCaseId)
local ProcessNoteData = function(nId)
local mapCaseData = self.mapCases[self.EnumCase.NoteSelect][nId]
local tbNoteSelect = mapCaseData.Info
local mapNote = self.parent._mapNote
return tbNoteSelect, mapNote
end
local GetUnfinishedSelect = function()
if self.mapCases[self.EnumCase.NoteSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.NoteSelect]) do
if mapData.bFinish ~= true then
local tbPotential, mapPotential = ProcessNoteData(nId)
return nId, tbPotential, mapPotential
end
end
end
return 0, {}, {}
end
local SelectCallback = function(nIdx, nId, panelCallback)
if nIdx == -1 then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:HandleCases()
end
cs_coroutine.start(wait)
return
end
local msg = {}
msg.Id = nId
msg.SelectReq = {}
msg.SelectReq.Index = nIdx - 1
local InteractiveCallback = function(callbackMsg)
local Id = callbackMsg.Id
if self.mapCases[self.EnumCase.NoteSelect] ~= nil and self.mapCases[self.EnumCase.NoteSelect][Id] ~= nil then
self.mapCases[self.EnumCase.NoteSelect][Id].bFinish = true
end
local caseId, tbNoteSelect, mapNote = GetUnfinishedSelect()
if panelCallback ~= nil and type(panelCallback) == "function" then
panelCallback(caseId, tbNoteSelect, mapNote)
end
end
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
local tbNoteSelect, mapNote = ProcessNoteData(nCaseId)
EventManager.Hit("StarTowerSelectNote", nCaseId, mapNote, tbNoteSelect, SelectCallback)
end
function BaseRoom:OpenSelectFateCard(nCaseId)
local ProcessFateCard = function(nId)
local mapCaseData = self.mapCases[self.EnumCase.FateCardSelect][nId]
local tbFateCard = mapCaseData.Ids
local tbNewIds = mapCaseData.NewIds
local bReward = mapCaseData.Give
local mapRoll = {
CanReRoll = mapCaseData.CanReRoll,
ReRollPrice = mapCaseData.ReRollPrice
}
return tbFateCard, tbNewIds, mapRoll, bReward
end
local GetUnfinishedSelect = function()
if self.mapCases[self.EnumCase.FateCardSelect] ~= nil then
for nId, mapData in pairs(self.mapCases[self.EnumCase.FateCardSelect]) do
if mapData.bFinish ~= true then
local tbFateCard, tbNewIds, mapRoll, bReward = ProcessFateCard(nId)
return nId, tbFateCard, tbNewIds, mapRoll, bReward
end
end
end
return 0, {}, {}
end
local SelectCallback = function(nIdx, nId, panelCallback, bReRoll)
if nIdx == -1 then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:HandleCases()
end
cs_coroutine.start(wait)
return
end
local msg = {}
msg.Id = nId
msg.SelectReq = {}
if bReRoll then
msg.SelectReq.ReRoll = true
else
msg.SelectReq.Index = nIdx - 1
end
local InteractiveCallback = function(callbackMsg)
local Id = callbackMsg.Id
if self.mapCases[self.EnumCase.FateCardSelect] ~= nil and self.mapCases[self.EnumCase.FateCardSelect][nId] ~= nil then
if self.mapCases[self.EnumCase.FateCardSelect][nId].bReRoll then
self.mapCases[self.EnumCase.FateCardSelect][nId].bReRoll = false
else
self.mapCases[self.EnumCase.FateCardSelect][nId].bFinish = true
end
end
local caseId, tbFateCard, tbNewIds, mapRoll, bReward = GetUnfinishedSelect()
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
if panelCallback ~= nil and type(panelCallback) == "function" then
panelCallback(caseId, tbFateCard, tbNewIds, mapRoll, nCoin, bReward)
end
end
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
local tbFateCard, tbNewIds, mapRoll, bReward = ProcessFateCard(nCaseId)
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit("StarTowerSelectFateCard", nCaseId, tbFateCard, tbNewIds, SelectCallback, mapRoll, nCoin, bReward)
end
function BaseRoom:OpenNpcOptionPanel(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.NpcEvent] == nil then
printError("No NpcOptionCase!")
return
end
local mapCase = self.mapCases[self.EnumCase.NpcEvent][nCaseId]
if mapCase == nil then
printError("No NpcOptionCase! :" .. nCaseId)
return
end
local nBoardNpcId = ConfigTable.GetData("NPCConfig", nNpcConfigId).NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
local mapAffinity = {}
for _, mapInfo in ipairs(mapCase.Infos) do
mapAffinity[mapInfo.NPCId] = mapInfo.Affinity
end
if mapCase.bFinish then
local tbLines = ConfigTable.GetData("NPCConfig", nNpcConfigId).Lines
local tbChat = {}
for _, nTalkId in ipairs(tbLines) do
local mapTalkCfg = ConfigTable.GetData("StarTowerTalk", nTalkId)
if mapTalkCfg ~= nil and mapAffinity[mapTalkCfg.NPCId] ~= nil then
local nAffinity = mapAffinity[mapTalkCfg.NPCId]
if #mapTalkCfg.Affinity == 2 and nAffinity ~= nil and nAffinity >= mapTalkCfg.Affinity[1] and nAffinity <= mapTalkCfg.Affinity[2] then
table.insert(tbChat, nTalkId)
end
end
end
if #tbChat < 1 then
table.insert(tbChat, tbLines[1])
end
local nCount = #tbChat
local nTalkId = tbChat[1]
if 1 < nCount then
nTalkId = tbChat[math.random(1, #tbChat)]
end
if nTalkId == nil then
nTalkId = 0
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.NpcOptionPanel, 0, 0, {}, nSkinId, 1, {}, {}, nTalkId, 0, true, false, nCoin, self.parent.nTowerId, self.parent._mapNote, self.parent.tbDisc)
return
end
local tbOption = mapCase.Options
local tbUnabledOption = mapCase.FailedIdxes
local nTableEvtId = mapCase.EvtId
local nEventId = nCaseId
local callback = function(nIdx, nEvtId)
EventManager.Hit("InteractiveNpcFinish", nNpcConfigId)
local nOptionId = tbOption[nIdx]
local mapOptionData = ConfigTable.GetData("EventOptions", nOptionId)
local bJump = false
if mapOptionData ~= nil then
bJump = mapOptionData.IgnoreInterActive
else
printError("EventOptions Missing" .. nOptionId)
end
if bJump then
return
end
local msg = {}
msg.Id = nEvtId
msg.SelectReq = {}
msg.SelectReq.Index = nIdx - 1
local InteractiveCallback = function(callbackMsg, tbChangeFateCard, mapChangeNote, mapItemChange, nLevelChange, nExpChange, mapPotentialChange, mapChangeSecondarySkill)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:HandleCases()
end
local bSuccess = false
if callbackMsg.SelectResp ~= nil and callbackMsg.SelectResp.Resp ~= nil then
bSuccess = callbackMsg.SelectResp.Resp.OptionsResult
end
if bSuccess then
self.mapCases[self.EnumCase.NpcEvent][nCaseId].bFinish = true
local tbInfo = {}
if self.tbPopup[self.EnumPopup.Affinity] == nil then
self.tbPopup[self.EnumPopup.Affinity] = {}
end
for _, mapChange in ipairs(callbackMsg.SelectResp.Resp.AffinityChange) do
table.insert(tbInfo, {
NPCId = mapChange.NPCId,
Affinity = mapChange.Affinity
})
table.insert(self.tbPopup[self.EnumPopup.Affinity], {
NPCId = mapChange.NPCId,
Increase = mapChange.Increase
})
end
self.mapCases[self.EnumCase.NpcEvent][nCaseId].Infos = tbInfo
EventManager.Hit("StarTowerEventInteract", clone(mapChangeNote), clone(mapItemChange), clone(mapPotentialChange), clone(tbChangeFateCard), clone(mapChangeSecondarySkill))
cs_coroutine.start(wait)
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Startower_EventFailHint"))
table.insert(mapCase.FailedIdxes, nIdx - 1)
end
if callbackMsg.SelectResp ~= nil and callbackMsg.SelectResp.Resp ~= nil and callbackMsg.SelectResp.Resp.OptionsParamId ~= nil and callbackMsg.SelectResp.Resp.OptionsParamId ~= 0 then
local sTextId = "EventResult_" .. tostring(callbackMsg.SelectResp.Resp.OptionsParamId)
local sResultHint = ConfigTable.GetUIText(sTextId)
EventManager.Hit(EventId.OpenMessageBox, sResultHint)
end
end
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
local tbLines = ConfigTable.GetData("NPCConfig", nNpcConfigId).FirstLines
local tbChat = {}
for _, nTalkId in ipairs(tbLines) do
local mapTalkCfg = ConfigTable.GetData("StarTowerTalk", nTalkId)
if mapTalkCfg ~= nil and mapAffinity[mapTalkCfg.NPCId] ~= nil then
local nAffinity = mapAffinity[mapTalkCfg.NPCId]
if #mapTalkCfg.Affinity == 2 and nAffinity ~= nil and nAffinity >= mapTalkCfg.Affinity[1] and nAffinity <= mapTalkCfg.Affinity[2] then
table.insert(tbChat, nTalkId)
end
end
end
if #tbChat < 1 then
table.insert(tbChat, tbLines[1])
end
local nCount = #tbChat
local nTalkId = tbChat[1]
if 1 < nCount then
nTalkId = tbChat[math.random(1, #tbChat)]
end
if nTalkId == nil then
nTalkId = 0
end
mapCase.bFirst = false
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.NpcOptionPanel, 1, nEventId, tbOption, nSkinId, callback, tbUnabledOption, nTableEvtId, nTalkId, mapCase.nActionId, false, false, nCoin, self.parent.nTowerId, self.parent._mapNote, self.parent.tbDisc)
end
function BaseRoom:HandleRecover(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.RecoveryHP] == nil then
printError("No RecoveryHP!")
return
end
local mapCase = self.mapCases[self.EnumCase.RecoveryHP][nCaseId]
if mapCase == nil then
printError("No RecoveryHP! :" .. nCaseId)
return
end
if mapCase.bFinish then
printError("Event has finished! :" .. nCaseId)
return
end
local nEftId = mapCase.EffectId
local nHp = self.parent:RecoverHp(nEftId)
local msg = {}
msg.Id = nCaseId
msg.RecoveryHPReq = {}
msg.RecoveryHPReq.Hp = nHp
local callback = function(_, msgData)
self.mapCases[self.EnumCase.RecoveryHP][nCaseId].bFinish = true
self:HandleCases()
end
self.parent:StarTowerInteract(msg, callback)
end
function BaseRoom:HandleNpcRecover(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.NpcRecoveryHP] == nil then
printError("No NpcOptionCase!")
return
end
local mapCase = self.mapCases[self.EnumCase.NpcRecoveryHP][nCaseId]
if mapCase == nil then
printError("No NpcOptionCase! :" .. nCaseId)
return
end
if mapCase.bFinish then
local nBoardNpcId = ConfigTable.GetData("NPCConfig", nNpcConfigId).NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
local tbChat = ConfigTable.GetData("NPCConfig", nNpcConfigId).Lines
local nCount = #tbChat
local nTalkId = tbChat[1]
local tbSelectedChat = {}
local nAffinity = PlayerData.StarTower:GetNpcAffinityData(9172).nTotalExp
if 1 < nCount then
for _, nTalkId in ipairs(tbChat) do
local mapTalkCfg = ConfigTable.GetData("StarTowerTalk", nTalkId)
if mapTalkCfg ~= nil and nAffinity ~= nil and #mapTalkCfg.Affinity == 2 and nAffinity ~= nil and nAffinity >= mapTalkCfg.Affinity[1] and nAffinity <= mapTalkCfg.Affinity[2] then
table.insert(tbSelectedChat, nTalkId)
end
end
end
if 0 < #tbSelectedChat then
nTalkId = tbSelectedChat[math.random(1, #tbSelectedChat)]
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.NpcOptionPanel, 0, 0, {}, nSkinId, 1, {}, {}, nTalkId, 0, true, false, nCoin, self.parent.nTowerId, self.parent._mapNote, self.parent.tbDisc)
return
end
local nEftId = mapCase.EffectId
local nHp = self.parent:RecoverHp(nEftId)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
WwiseAudioMgr:PostEvent("ui_battle_cure")
local msg = {}
msg.Id = nCaseId
msg.RecoveryHPReq = {}
msg.RecoveryHPReq.Hp = nHp
local callback = function(_, msgData)
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("StarTower_NpcRecoverTips"))
EventManager.Hit("InteractiveNpcFinish", nNpcConfigId)
self.mapCases[self.EnumCase.NpcRecoveryHP][nCaseId].bFinish = true
end
self.parent:StarTowerInteract(msg, callback)
end
function BaseRoom:HandleNpcDangerRoom(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.DoorDanger] == nil then
printError("No NpcOptionCase!")
return
end
local mapCase = self.mapCases[self.EnumCase.DoorDanger][nCaseId]
if mapCase == nil then
printError("No NpcOptionCase! :" .. nCaseId)
return
end
local nRoomType = mapCase.Type
local nBoardNpcId = ConfigTable.GetData("NPCConfig", nNpcConfigId).NPCId
local nSkinId = PlayerData.Board:GetNPCUsingSkinId(nBoardNpcId)
local callback = function(nIdx, nEvtId)
EventManager.Hit("InteractiveNpcFinish", nNpcConfigId)
if nIdx == 1 then
self.parent:EnterRoom(nEvtId, nRoomType)
else
return
end
end
local tbChat = ConfigTable.GetData("NPCConfig", nNpcConfigId).Lines
local nTalkId = tbChat[math.random(1, #tbChat)]
if nTalkId == nil then
nTalkId = 0
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.NpcOptionPanel, 2, nCaseId, {}, nSkinId, callback, {}, 0, nTalkId, 0, false, false, nCoin, self.parent.nTowerId, self.parent._mapNote, self.parent.tbDisc)
end
function BaseRoom:HandlePopupDisc(mapData)
local callback = function()
mapData.bFinish = true
self:HandleCases()
end
EventManager.Hit("StarTowerShowDiscSkill", mapData.param, clone(self.parent._mapNote), callback)
end
function BaseRoom:HandlePopupReward(mapData)
local callback = function()
mapData.bFinish = true
self:HandleCases()
end
EventManager.Hit("StarTowerShowReward", mapData.param, callback)
end
function BaseRoom:HandlePopupPotential(mapData)
local callback = function()
mapData.bFinish = true
self:HandleCases()
end
EventManager.Hit("ShowPotentialLevelUp", mapData.param, callback)
end
function BaseRoom:HandleShopStrengthFx(mapData)
local callback = function()
mapData.bFinish = true
self:HandleCases()
end
EventManager.Hit("ShowShopStrengthFx", mapData.param, callback)
end
function BaseRoom:InteractiveShop(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.Hawker] == nil then
printError("No Hawker Case!")
return
end
local mapCase = self.mapCases[self.EnumCase.Hawker][nCaseId]
if mapCase == nil then
printError("No Hawker Case! :" .. nCaseId)
return
end
local BuildRollData = function(case)
return {
CanReRoll = case.CanReRoll,
ReRollPrice = case.ReRollPrice,
ReRollTimes = case.ReRollTimes
}
end
local BuildShopData = function(case)
local tbShopData = {}
for index, mapGood in ipairs(case.List) do
tbShopData[index] = {
Idx = mapGood.Idx,
bSoldOut = table.indexof(case.Purchase, mapGood.Sid) > 0,
Price = mapGood.Price,
nDiscount = mapGood.Discount,
nCharId = 0 < mapGood.CharPos and self.parent.tbTeam[mapGood.CharPos] or 0,
nSid = mapGood.Sid,
nType = mapGood.Type,
nGoodsId = mapGood.GoodsId
}
end
return tbShopData
end
local BuyCallback = function(nEvtId, nSid, callback, bReRoll)
local msg = {}
msg.Id = nEvtId
msg.HawkerReq = {}
if bReRoll then
msg.HawkerReq.ReRoll = true
else
msg.HawkerReq.Sid = nSid
end
local InteractiveCallback = function(callbackMsg, tbChangeFateCard, mapChangeNote, mapItemChange, nLevelChange, nExpChange, mapPotentialChange)
if callback ~= nil and type(callback) == "function" then
local nBagCount = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
local mapInteractiveCase = self.mapCases[self.EnumCase.Hawker][nEvtId]
if mapInteractiveCase.bReRoll then
self.mapCases[self.EnumCase.Hawker][nEvtId].bReRoll = false
local mapRoll = BuildRollData(mapInteractiveCase)
local tbShopData = BuildShopData(mapInteractiveCase)
callback(nBagCount, tbShopData, mapRoll)
else
table.insert(mapInteractiveCase.Purchase, nSid)
callback(nBagCount)
end
end
EventManager.Hit("StarTowerShopInteract", mapChangeNote)
self:HandleCases()
end
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
local mapRoll = BuildRollData(mapCase)
local tbShopData = BuildShopData(mapCase)
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency] or 0
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerShop, tbShopData, nCoin, BuyCallback, nCaseId, mapRoll, self.parent.tbDisc, self.parent._mapNote, self.parent.nTowerId, self.parent.nCurLevel)
WwiseAudioMgr:SetState("combat", "shopIn")
WwiseAudioMgr:StopDiscMusic(true, function()
NovaAPI.UnLoadBankByEventName("music_outfit_stop")
end)
end
function BaseRoom:InteractiveStrengthMachine(nCaseId, nNpcConfigId)
if self.mapCases[self.EnumCase.StrengthenMachine] == nil then
printError("No StrengthMachine Case!")
return
end
local mapCase = self.mapCases[self.EnumCase.StrengthenMachine][nCaseId]
if mapCase == nil then
printError("No StrengthMachine Case! :" .. nCaseId)
return
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency]
if nCoin == nil then
nCoin = 0
end
local nDiscount = mapCase.Discount
local bFirstFree = mapCase.FirstFree
local nCost = self.parent.tbStrengthMachineCost[mapCase.Times + 1]
if nCost == nil then
nCost = self.parent.tbStrengthMachineCost[#self.parent.tbStrengthMachineCost]
end
nCost = nCost - nDiscount
if bFirstFree then
nCost = 0
end
if nCoin < nCost then
printError("Not Enough Coin!")
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("StarTower_NotEnoughCoin"))
return
end
local InteractiveCallback = function(netmsgData)
if netmsgData.StrengthenMachineResp ~= nil and not netmsgData.StrengthenMachineResp.BuySucceed then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("StarTower_NoPotential"))
printError("没有可选的潜能")
return
end
if bFirstFree then
mapCase.FirstFree = false
else
mapCase.Times = mapCase.Times + 1
end
local nCoinAfter = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency]
if nCoinAfter == nil then
nCoinAfter = 0
end
local nCostAfter = self.parent.tbStrengthMachineCost[mapCase.Times + 1]
if nCostAfter == nil then
nCostAfter = self.parent.tbStrengthMachineCost[#self.parent.tbStrengthMachineCost]
end
nCostAfter = nCostAfter - nDiscount
EventManager.Hit("ShopStrengthFx", {nCost = nCost})
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
WwiseAudioMgr:PostEvent("ui_battle_buff_get")
self:HandleCases()
EventManager.Hit("InteractiveNpcFinish", nNpcConfigId, nCostAfter, nCoinAfter)
end
local msg = {}
msg.Id = nCaseId
self.parent:StarTowerInteract(msg, InteractiveCallback)
end
function BaseRoom:CheckBattleEnd()
if self.mapCases[self.EnumCase.Battle] == nil then
return true
end
return self.mapCases[self.EnumCase.Battle].bFinish
end
function BaseRoom:SyncHp()
local nSyncHpCaseId = self.mapCases[self.EnumCase.SyncHP]
if nSyncHpCaseId ~= nil and 0 < nSyncHpCaseId then
local mapCharHpInfo = self.parent.GetActorHp()
local nMainChar = self.parent.tbTeam[1]
local nHp = -1
if mapCharHpInfo[nMainChar] ~= nil then
nHp = mapCharHpInfo[nMainChar]
end
local mapCase = {
Id = nSyncHpCaseId,
RecoveryHPReq = {Hp = nHp}
}
local callback = function(_, mapNetData)
self.mapCases[self.EnumCase.SyncHP] = 0
self:SaveCase(mapNetData.Cases)
end
HttpNetHandler.SendMsg(NetMsgId.Id.star_tower_interact_req, mapCase, nil, callback)
end
end
function BaseRoom:OnEvent_NpcSpawned(nEntityId, nNpcId, trNpc)
local nCaseId = self.mapNpc[nNpcId]
local mapNpcCfgData = ConfigTable.GetData("NPCConfig", nNpcId)
if nCaseId == nil then
EventManager.Hit("NPCShow", true, nNpcId, nEntityId)
elseif mapNpcCfgData ~= nil and mapNpcCfgData.type == GameEnum.npcNewType.Upgrade then
if self.mapCases[self.EnumCase.StrengthenMachine] == nil then
EventManager.Hit("NPCShow", true, nNpcId, nEntityId)
return
else
local mapCase = self.mapCases[self.EnumCase.StrengthenMachine][nCaseId]
if mapCase == nil then
EventManager.Hit("NPCShow", true, nNpcId, nEntityId)
return
end
local nDiscount = mapCase.Discount or 0
local bFirstFree = mapCase.FirstFree
local nTime = mapCase.Times + 1
local nCost = self.parent.tbStrengthMachineCost[nTime]
if nCost == nil then
nCost = self.parent.tbStrengthMachineCost[#self.parent.tbStrengthMachineCost]
end
nCost = nCost - nDiscount
if bFirstFree then
nCost = 0
end
local nCoin = self.parent._mapItem[AllEnum.CoinItemId.FixedRogCurrency]
if nCoin == nil then
nCoin = 0
end
EventManager.Hit("NPCShow", true, nNpcId, nEntityId, nCost, nCoin)
end
else
EventManager.Hit("NPCShow", true, nNpcId, nEntityId)
end
EventManager.Hit("SetIndicator", 3, trNpc, Vector3.zero, mapNpcCfgData.HintIcon)
end
function BaseRoom:OnEvent_DiscSkillActive(tbParam)
if self.tbPopup[self.EnumPopup.Disc] == nil then
self.tbPopup[self.EnumPopup.Disc] = {}
end
table.insert(self.tbPopup[self.EnumPopup.Disc], {bFinish = false, param = tbParam})
end
function BaseRoom:OnEvent_RewardPopup(tbParam)
if self.tbPopup[self.EnumPopup.Reward] == nil then
self.tbPopup[self.EnumPopup.Reward] = {}
end
table.insert(self.tbPopup[self.EnumPopup.Reward], {bFinish = false, param = tbParam})
end
function BaseRoom:OnEvent_PotentialPopup(tbParam)
if self.tbPopup[self.EnumPopup.Potential] == nil then
self.tbPopup[self.EnumPopup.Potential] = {}
end
table.insert(self.tbPopup[self.EnumPopup.Potential], {bFinish = false, param = tbParam})
end
function BaseRoom:OnEvent_ShopStrengthFx(tbParam)
if self.tbPopup[self.EnumPopup.StrengthFx] == nil then
self.tbPopup[self.EnumPopup.StrengthFx] = {}
end
table.insert(self.tbPopup[self.EnumPopup.StrengthFx], {bFinish = false, param = tbParam})
end
function BaseRoom:OnEvent_CloseLoadingView()
self:HandleCases()
end
function BaseRoom:GetShopGoods()
local nType = self.parent.nRoomType
local mapStarTower = ConfigTable.GetData("StarTower", self.parent.nTowerId)
if not mapStarTower then
return
end
local nNpcId = mapStarTower.ShopNpc
if nType ~= GameEnum.starTowerRoomType.ShopRoom then
nNpcId = mapStarTower.StandShopNpc
end
if self.mapCases[self.EnumCase.Hawker] and self.mapNpc[nNpcId] then
return self.mapCases[self.EnumCase.Hawker][self.mapNpc[nNpcId]].List
end
end
function BaseRoom:GetCaseById(nId)
for nType, mapCase in pairs(self.mapCases) do
if type(mapCase) == "table" then
if mapCase.Id == nil then
for nCaseId, mapCaseData in pairs(mapCase) do
if nCaseId == nId then
return nType, mapCaseData
end
end
elseif mapCase.Id == nId then
return nType, mapCase
end
end
end
return nil
end
return BaseRoom