80af235e05
EN: 1.12.0.120 CN: 1.12.0.120 JP: 1.12.0.124 KR: 1.12.0.124
397 lines
11 KiB
Lua
397 lines
11 KiB
Lua
local GoldenSpyFloorCtrl = class("GoldenSpyFloorCtrl", BaseCtrl)
|
|
local LevelPrefabPath = "UI_Activity/_%s/LevelPrefab/"
|
|
GoldenSpyFloorCtrl._mapNodeConfig = {
|
|
HookCtrl = {
|
|
sNodeName = "HookRoot",
|
|
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyHookCtrl"
|
|
},
|
|
PrefabRoot = {
|
|
sNodeName = "PrefabRoot",
|
|
sComponentName = "RectTransform"
|
|
},
|
|
floorItemRoot = {
|
|
sNodeName = "floorItemRoot",
|
|
sComponentName = "RectTransform"
|
|
}
|
|
}
|
|
local itemCtrlPath = "Game.UI.Activity.GoldenSpy."
|
|
local ItemHitAreaType = {
|
|
[1] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[2] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[3] = AllEnum.GoldenSpyHitAreaType.Circle,
|
|
[4] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[5] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[6] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[7] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[8] = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
|
[9] = AllEnum.GoldenSpyHitAreaType.Circle,
|
|
[10] = AllEnum.GoldenSpyHitAreaType.Rectangle
|
|
}
|
|
function GoldenSpyFloorCtrl:Awake()
|
|
end
|
|
function GoldenSpyFloorCtrl:Init(levelId, floorId, levelCtrl)
|
|
self.levelId = levelId
|
|
self.floorId = floorId
|
|
self.levelCtrl = levelCtrl
|
|
if self.prefab ~= nil then
|
|
for i = #self.tbItem, 1, -1 do
|
|
self:UnbindCtrlByNode(self.tbItem[i].Ctrl)
|
|
end
|
|
for i = #self.tbTrap, 1, -1 do
|
|
self:UnbindCtrlByNode(self.tbTrap[i].Ctrl)
|
|
end
|
|
for i = #self.tbNeedRemoveItem, 1, -1 do
|
|
self:UnbindCtrlByNode(self.tbNeedRemoveItem[i].Ctrl)
|
|
end
|
|
destroy(self.prefab)
|
|
end
|
|
self.tbItem = {}
|
|
self.tbNeedRemoveItem = {}
|
|
self.tbTrap = {}
|
|
self.prefab = nil
|
|
local floorCfg = ConfigTable.GetData("GoldenSpyFloor", floorId)
|
|
if floorCfg == nil then
|
|
return
|
|
end
|
|
local nPrefabName = self.levelCtrl.GoldenSpyLevelData:GetLevelPrefabName()
|
|
local goLevelPerfab = self:LoadAsset(string.format(LevelPrefabPath, self.levelCtrl.nActId) .. nPrefabName .. ".prefab")
|
|
self.prefab = instantiate(goLevelPerfab, self._mapNode.floorItemRoot)
|
|
self.prefab.transform.localPosition = Vector3.zero
|
|
self.prefab.transform.localScale = Vector3.one
|
|
self.prefab.transform.localRotation = Quaternion.identity
|
|
self:InitItem()
|
|
self:InitRandomBuff()
|
|
self:InitTrap()
|
|
self.bInvincible = false
|
|
self._mapNode.HookCtrl:Init(self.levelId, self.floorId, self, self.levelCtrl.GoldenSpyLevelData, self.levelCtrl.GoldenSpyFloorData)
|
|
end
|
|
function GoldenSpyFloorCtrl:InitItem()
|
|
if self.prefab == nil then
|
|
return
|
|
end
|
|
local itemRoot = self.prefab.transform:Find("ItemRoot")
|
|
if itemRoot == nil then
|
|
return
|
|
end
|
|
local levelCfg = ConfigTable.GetData("GoldenSpyLevel", self.levelId)
|
|
local nChildCount = itemRoot.transform.childCount
|
|
for i = 1, nChildCount do
|
|
local child = itemRoot.transform:GetChild(i - 1)
|
|
local nItemId = tonumber(child.gameObject.name)
|
|
local itemCfg = ConfigTable.GetData("GoldenSpyItem", nItemId)
|
|
if itemCfg ~= nil then
|
|
local itemCtrl = self:BindCtrlByNode(child.gameObject, itemCtrlPath .. itemCfg.luaCtrl)
|
|
itemCtrl:Init()
|
|
itemCtrl:SetData({
|
|
nUid = #self.tbItem + i,
|
|
nItemId = nItemId,
|
|
nHitAreaType = ItemHitAreaType[itemCfg.ItemType]
|
|
}, self, levelCfg.ConfigId)
|
|
table.insert(self.tbItem, {Ctrl = itemCtrl})
|
|
self.levelCtrl.GoldenSpyFloorData:SetItem(nItemId)
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:InitRandomBuff()
|
|
local levelCfg = ConfigTable.GetData("GoldenSpyLevel", self.levelId)
|
|
if levelCfg == nil then
|
|
return
|
|
end
|
|
if levelCfg.LevelType ~= GameEnum.GoldenSpyLevelType.Random then
|
|
return
|
|
end
|
|
local floorCfg = ConfigTable.GetData("GoldenSpyFloor", self.floorId)
|
|
if floorCfg == nil then
|
|
return
|
|
end
|
|
local buffRandomRoot = self.prefab.transform:Find("BuffRandomRoot")
|
|
if buffRandomRoot == nil then
|
|
return
|
|
end
|
|
local randomCount = floorCfg.BuffCardCount
|
|
local nChildCount = buffRandomRoot.childCount
|
|
local tbAllBuffPrefab = {}
|
|
for i = 1, nChildCount do
|
|
local child = buffRandomRoot.transform:GetChild(i - 1)
|
|
table.insert(tbAllBuffPrefab, child)
|
|
child.gameObject:SetActive(false)
|
|
end
|
|
if randomCount > nChildCount then
|
|
return
|
|
end
|
|
local randomIndex = math.random(1, nChildCount)
|
|
for i = 1, randomCount do
|
|
local buff = tbAllBuffPrefab[randomIndex]
|
|
buff.gameObject:SetActive(true)
|
|
local nItemId = tonumber(buff.gameObject.name)
|
|
local itemCfg = ConfigTable.GetData("GoldenSpyItem", nItemId)
|
|
if itemCfg ~= nil then
|
|
local buffCtrl = self:BindCtrlByNode(buff.gameObject, itemCtrlPath .. itemCfg.luaCtrl)
|
|
buffCtrl:Init()
|
|
buffCtrl:SetData({
|
|
nUid = i,
|
|
nItemId = nItemId,
|
|
nHitAreaType = ItemHitAreaType[itemCfg.ItemType]
|
|
}, self, levelCfg.ConfigId)
|
|
table.insert(self.tbItem, {Ctrl = buffCtrl})
|
|
randomIndex = randomIndex % nChildCount + 1
|
|
self.levelCtrl.GoldenSpyFloorData:SetItem(nItemId)
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:InitTrap()
|
|
if self.prefab == nil then
|
|
return
|
|
end
|
|
local trapRoot = self.prefab.transform:Find("TrapRoot")
|
|
if trapRoot == nil then
|
|
return
|
|
end
|
|
local nChildCount = trapRoot.transform.childCount
|
|
for i = 1, nChildCount do
|
|
local child = trapRoot.transform:GetChild(i - 1)
|
|
local trapId = tonumber(child.gameObject.name)
|
|
local trapCfg = ConfigTable.GetData("GoldenSpyObstacle", trapId)
|
|
if trapCfg ~= nil then
|
|
local trapCtrl = self:BindCtrlByNode(child.gameObject, itemCtrlPath .. trapCfg.luaCtrl)
|
|
trapCtrl:Init()
|
|
trapCtrl:SetData({nTrapId = trapId}, self)
|
|
table.insert(self.tbTrap, {Ctrl = trapCtrl})
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:StartFloor()
|
|
self.bStartFloor = true
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
hookCtrl:StartSwing()
|
|
for _, v in ipairs(self.tbItem) do
|
|
v.Ctrl:StartFloor()
|
|
end
|
|
for _, v in ipairs(self.tbTrap) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:StartFloor()
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:FinishFloor()
|
|
self.bStartFloor = false
|
|
self:Exit()
|
|
end
|
|
function GoldenSpyFloorCtrl:GetHookEndPos()
|
|
return self._mapNode.HookCtrl:GetHookEndWorldPosition()
|
|
end
|
|
function GoldenSpyFloorCtrl:GetHookEndPosInRectLocal(targetRect)
|
|
if targetRect == nil or targetRect:IsNull() then
|
|
return nil
|
|
end
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
if hookCtrl == nil then
|
|
return nil
|
|
end
|
|
local hookPos = hookCtrl:GetHookEndWorldPosition()
|
|
local hookRootTr = hookCtrl.gameObject.transform
|
|
local posInCommon = hookRootTr:TransformPoint(hookPos)
|
|
return targetRect:InverseTransformPoint(posInCommon)
|
|
end
|
|
function GoldenSpyFloorCtrl:GetHookRadius()
|
|
return self.levelCtrl:GetHookRadius()
|
|
end
|
|
function GoldenSpyFloorCtrl:ResumeHookSwing()
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
if hookCtrl and hookCtrl.ResumeSwing then
|
|
hookCtrl:ResumeSwing(true)
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:Shoot(nSpeed, nRadius, nFactor, onRetractComplete, onCatched, onCatchedComplete)
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
if not hookCtrl or not hookCtrl:IsSwinging() then
|
|
return
|
|
end
|
|
hookCtrl:PauseSwing()
|
|
self.bInvincible = false
|
|
hookCtrl:StartExtend(nSpeed, nRadius, nFactor, function()
|
|
if onRetractComplete then
|
|
onRetractComplete()
|
|
end
|
|
end, function(itemCtrl)
|
|
if onCatched then
|
|
onCatched(itemCtrl)
|
|
end
|
|
if itemCtrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.Boom then
|
|
self:RemoveItem(itemCtrl)
|
|
return
|
|
end
|
|
self.catchedItem = itemCtrl
|
|
end, function(itemCtrl)
|
|
if itemCtrl == nil or itemCtrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.Boom then
|
|
return
|
|
end
|
|
for i = #self.tbItem, 1, -1 do
|
|
if self.tbItem[i].Ctrl == itemCtrl then
|
|
table.insert(self.tbNeedRemoveItem, self.tbItem[i])
|
|
table.remove(self.tbItem, i)
|
|
break
|
|
end
|
|
end
|
|
self.catchedItem = nil
|
|
self.bInvincible = false
|
|
if onCatchedComplete then
|
|
onCatchedComplete(itemCtrl)
|
|
end
|
|
end)
|
|
end
|
|
function GoldenSpyFloorCtrl:RemoveItem(itemCtrl, bForce)
|
|
local bDelSuccess = false
|
|
local itemId = itemCtrl:GetItemCfg().Id
|
|
for i = #self.tbItem, 1, -1 do
|
|
if self.tbItem[i].Ctrl == itemCtrl then
|
|
table.insert(self.tbNeedRemoveItem, self.tbItem[i])
|
|
table.remove(self.tbItem, i)
|
|
bDelSuccess = true
|
|
break
|
|
end
|
|
end
|
|
if bDelSuccess then
|
|
self.levelCtrl.GoldenSpyFloorData:DeleteItem(itemId, bForce)
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:DropItem()
|
|
if self.catchedItem == nil then
|
|
return
|
|
end
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
hookCtrl:DropItem()
|
|
self.levelCtrl:DropItem()
|
|
self.catchedItem.gameObject.transform.parent = self.catchedItem:GetParent()
|
|
self.catchedItem = nil
|
|
end
|
|
function GoldenSpyFloorCtrl:SetHookIsInvincible(bInvincible)
|
|
self.bInvincible = bInvincible
|
|
end
|
|
function GoldenSpyFloorCtrl:GetHookIsInvincible()
|
|
return self.bInvincible
|
|
end
|
|
function GoldenSpyFloorCtrl:GetHookHitArea()
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
if hookCtrl and hookCtrl.GetHookHitArea then
|
|
return hookCtrl:GetHookHitArea()
|
|
end
|
|
return nil
|
|
end
|
|
function GoldenSpyFloorCtrl:SubTime(nTime)
|
|
self.levelCtrl:SubTime(nTime)
|
|
end
|
|
function GoldenSpyFloorCtrl:DoStartRetract()
|
|
self.levelCtrl:StartRetract()
|
|
end
|
|
function GoldenSpyFloorCtrl:StartRetract(finishCallback)
|
|
local hookCtrl = self._mapNode.HookCtrl
|
|
if hookCtrl and hookCtrl.StartRetract then
|
|
hookCtrl:StartRetract(self.levelCtrl:GetHookBaseSpeed(), function()
|
|
self:ResumeHookSwing()
|
|
if finishCallback then
|
|
finishCallback()
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:StartBoom(useCallback, finishCallback)
|
|
if self.catchedItem == nil then
|
|
return false
|
|
end
|
|
if useCallback then
|
|
useCallback()
|
|
end
|
|
self.catchedItem:OnSkill_Boom(function()
|
|
self:RemoveItem(self.catchedItem)
|
|
self.catchedItem = nil
|
|
self._mapNode.HookCtrl:DropItem()
|
|
self:StartRetract(finishCallback)
|
|
end)
|
|
return true
|
|
end
|
|
function GoldenSpyFloorCtrl:CheckHasFrozenItem()
|
|
for _, v in ipairs(self.tbItem) do
|
|
local itemCfg = v.Ctrl:GetItemCfg()
|
|
if itemCfg.ItemType == GameEnum.GoldenSpyItem.Companion or itemCfg.ItemType == GameEnum.GoldenSpyItem.Patrol then
|
|
return true
|
|
end
|
|
end
|
|
if #self.tbTrap > 0 then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
function GoldenSpyFloorCtrl:StartFrozen()
|
|
for _, v in ipairs(self.tbItem) do
|
|
if v.Ctrl ~= nil and v.Ctrl ~= self.catchedItem then
|
|
v.Ctrl:OnSkill_Frozen()
|
|
end
|
|
end
|
|
for _, v in ipairs(self.tbTrap) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:OnSkill_Frozen()
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:StopFrozen()
|
|
for _, v in ipairs(self.tbItem) do
|
|
if v.Ctrl ~= nil and v.Ctrl ~= self.catchedItem then
|
|
v.Ctrl:OnSkill_Frozen_Resume()
|
|
end
|
|
end
|
|
for _, v in ipairs(self.tbTrap) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:OnSkill_Frozen_Resume()
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:Pause()
|
|
self._mapNode.HookCtrl:Pause()
|
|
for _, v in ipairs(self.tbItem) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:Pause()
|
|
end
|
|
end
|
|
for _, v in ipairs(self.tbTrap) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:Pause()
|
|
end
|
|
end
|
|
end
|
|
function GoldenSpyFloorCtrl:Exit()
|
|
if self.prefab ~= nil then
|
|
for i = #self.tbItem, 1, -1 do
|
|
self.tbItem[i].Ctrl:FinishFloor()
|
|
self:UnbindCtrlByNode(self.tbItem[i].Ctrl)
|
|
end
|
|
for i = #self.tbTrap, 1, -1 do
|
|
self.tbTrap[i].Ctrl:FinishFloor()
|
|
self:UnbindCtrlByNode(self.tbTrap[i].Ctrl)
|
|
end
|
|
for i = #self.tbNeedRemoveItem, 1, -1 do
|
|
self:UnbindCtrlByNode(self.tbNeedRemoveItem[i].Ctrl)
|
|
end
|
|
destroy(self.prefab)
|
|
end
|
|
self.tbItem = {}
|
|
self.tbTrap = {}
|
|
self.tbNeedRemoveItem = {}
|
|
self.prefab = nil
|
|
self._mapNode.HookCtrl:Exit()
|
|
end
|
|
function GoldenSpyFloorCtrl:Continue()
|
|
self._mapNode.HookCtrl:Continue()
|
|
for _, v in ipairs(self.tbItem) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:Resume()
|
|
end
|
|
end
|
|
for _, v in ipairs(self.tbTrap) do
|
|
if v.Ctrl ~= nil then
|
|
v.Ctrl:Resume()
|
|
end
|
|
end
|
|
end
|
|
return GoldenSpyFloorCtrl
|