Update - 1.9.0.103
EN: 1.9.0.103 CN: 1.9.0.104 JP: 1.9.0.106 KR: 1.9.0.108
This commit is contained in:
@@ -324,7 +324,9 @@ function NewTutorialsActCtrl:RefreshTeamFormation()
|
||||
local nReceivedCount, nTotalCount = 0, 0
|
||||
for i = 1, nAttrQuestCount do
|
||||
local bComplete = PlayerData.Quest:CheckTeamFormationAttributeCompleted(i)
|
||||
nReceivedCount, nTotalCount = PlayerData.Quest:GetTeamFormationAttributeProgress(i)
|
||||
local nThisReceivedCount, nThisTotalCount = PlayerData.Quest:GetTeamFormationAttributeProgress(i)
|
||||
nReceivedCount = nReceivedCount + nThisReceivedCount
|
||||
nTotalCount = nTotalCount + nThisTotalCount
|
||||
end
|
||||
if nTotalCount == nReceivedCount then
|
||||
self._mapNode.btn_GoTeamFormationPanel.gameObject:SetActive(false)
|
||||
|
||||
@@ -59,7 +59,7 @@ function BdConvertQuestCtrl:OnEnable()
|
||||
self._mapNode.animator:Play("t_window_04_t_in")
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
|
||||
end
|
||||
function BdConvertQuestCtrl:OnDestory()
|
||||
function BdConvertQuestCtrl:OnDestroy()
|
||||
if self.tbItemCtrl ~= nil then
|
||||
for _, ctrl in pairs(self.tbItemCtrl) do
|
||||
self:UnbindCtrlByNode(ctrl)
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
local GoldenSpyBaseItem = class("GoldenSpyBaseItem", BaseCtrl)
|
||||
GoldenSpyBaseItem._mapNodeConfig = {
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
flash = {}
|
||||
}
|
||||
GoldenSpyBaseItem._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyBaseItem._mapRedDotConfig = {}
|
||||
function GoldenSpyBaseItem:Awake()
|
||||
self._mapNode.flash:SetActive(false)
|
||||
end
|
||||
function GoldenSpyBaseItem:OnEnable()
|
||||
end
|
||||
function GoldenSpyBaseItem:OnDisable()
|
||||
end
|
||||
function GoldenSpyBaseItem:OnDestroy()
|
||||
end
|
||||
function GoldenSpyBaseItem:Init()
|
||||
self.nUid = nil
|
||||
self.nItemId = nil
|
||||
self.trParent = self.gameObject.transform.parent
|
||||
self.bFrozen = false
|
||||
end
|
||||
function GoldenSpyBaseItem:SetData(data, floorCtrl, commonConfigId)
|
||||
self.nUid = data.nUid
|
||||
self.nItemId = data.nItemId
|
||||
self.itemCfg = ConfigTable.GetData("GoldenSpyItem", self.nItemId)
|
||||
self.nHitAreaType = data.nHitAreaType
|
||||
self.floorCtrl = floorCtrl
|
||||
self.commonConfigId = commonConfigId
|
||||
self.commonCfg = ConfigTable.GetData("GoldenSpyConfig", self.commonConfigId)
|
||||
self:InitData()
|
||||
end
|
||||
function GoldenSpyBaseItem:InitData()
|
||||
end
|
||||
function GoldenSpyBaseItem:GetUid()
|
||||
return self.nUid
|
||||
end
|
||||
function GoldenSpyBaseItem:GetItemCfg()
|
||||
return self.itemCfg
|
||||
end
|
||||
function GoldenSpyBaseItem:GetWeight()
|
||||
return self.itemCfg.Weight
|
||||
end
|
||||
function GoldenSpyBaseItem:GetScore()
|
||||
return self.itemCfg.Score
|
||||
end
|
||||
function GoldenSpyBaseItem:GetHitArea()
|
||||
local hitArea = {}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpyBaseItem:GetParent()
|
||||
return self.trParent
|
||||
end
|
||||
function GoldenSpyBaseItem:StartFloor()
|
||||
end
|
||||
function GoldenSpyBaseItem:FinishFloor()
|
||||
end
|
||||
function GoldenSpyBaseItem:Pause()
|
||||
end
|
||||
function GoldenSpyBaseItem:Resume()
|
||||
end
|
||||
function GoldenSpyBaseItem:OnCapture(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseItem:OnSkill_InVision(callback)
|
||||
end
|
||||
function GoldenSpyBaseItem:OnSkill_Boom(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseItem:OnSkill_Frozen(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseItem:OnSkill_Frozen_Resume(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyBaseItem
|
||||
@@ -0,0 +1,61 @@
|
||||
local GoldenSpyBaseTrap = class("GoldenSpyBaseTrap", BaseCtrl)
|
||||
GoldenSpyBaseTrap._mapNodeConfig = {
|
||||
TriggerArea = {
|
||||
sNodeName = "TriggerArea",
|
||||
sComponentName = "RectTransform"
|
||||
}
|
||||
}
|
||||
GoldenSpyBaseTrap._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyBaseTrap._mapRedDotConfig = {}
|
||||
function GoldenSpyBaseTrap:Awake()
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnEnable()
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnDisable()
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnDestroy()
|
||||
end
|
||||
function GoldenSpyBaseTrap:Init()
|
||||
end
|
||||
function GoldenSpyBaseTrap:SetData(data, floorCtrl)
|
||||
self.nTrapId = data.nTrapId
|
||||
self.floorCtrl = floorCtrl
|
||||
self.trapCfg = ConfigTable.GetData("GoldenSpyObstacle", self.nTrapId)
|
||||
self:InitData()
|
||||
end
|
||||
function GoldenSpyBaseTrap:InitData()
|
||||
end
|
||||
function GoldenSpyBaseTrap:StartFloor()
|
||||
end
|
||||
function GoldenSpyBaseTrap:GetTriggerArea()
|
||||
local triggerArea = {}
|
||||
return triggerArea
|
||||
end
|
||||
function GoldenSpyBaseTrap:FinishFloor()
|
||||
end
|
||||
function GoldenSpyBaseTrap:Pause()
|
||||
end
|
||||
function GoldenSpyBaseTrap:Resume()
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnSkill_Frozen(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnSkill_Frozen_Resume(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBaseTrap:SetHookIsInvincible()
|
||||
self.floorCtrl:SetHookIsInvincible(true)
|
||||
end
|
||||
function GoldenSpyBaseTrap:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.TriggerArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyBaseTrap
|
||||
@@ -0,0 +1,126 @@
|
||||
local GoldenSpyBaseItem = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseItem")
|
||||
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
||||
local GoldenSpyBoomItem = class("GoldenSpyBoomItem", GoldenSpyBaseItem)
|
||||
GoldenSpyBoomItem._mapNodeConfig = {
|
||||
BoomArea = {
|
||||
sNodeName = "BoomArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
Icon = {},
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
Effect_Boom = {}
|
||||
}
|
||||
GoldenSpyBoomItem._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyBoomItem._mapRedDotConfig = {}
|
||||
function GoldenSpyBoomItem:Awake()
|
||||
self._mapNode.Effect_Boom.gameObject:SetActive(false)
|
||||
self.tbTimer = {}
|
||||
end
|
||||
function GoldenSpyBoomItem:OnEnable()
|
||||
end
|
||||
function GoldenSpyBoomItem:OnDisable()
|
||||
end
|
||||
function GoldenSpyBoomItem:OnDestroy()
|
||||
for _, v in ipairs(self.tbTimer) do
|
||||
if v ~= nil then
|
||||
v:Cancel()
|
||||
end
|
||||
end
|
||||
self.tbTimer = {}
|
||||
end
|
||||
function GoldenSpyBoomItem:GetHitArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local hitArea = {
|
||||
nType = self.nHitAreaType,
|
||||
center = self._mapNode.HitArea.anchoredPosition + tr.anchoredPosition,
|
||||
width = self._mapNode.HitArea.sizeDelta.x,
|
||||
height = self._mapNode.HitArea.sizeDelta.y
|
||||
}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpyBoomItem:GetBoomArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local boomArea = {
|
||||
center = self._mapNode.BoomArea.anchoredPosition + tr.anchoredPosition,
|
||||
radius = self._mapNode.BoomArea.sizeDelta.x * 0.5
|
||||
}
|
||||
return boomArea
|
||||
end
|
||||
function GoldenSpyBoomItem:Boom(callback)
|
||||
local boom = function()
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
local boomArea = self:GetBoomArea()
|
||||
local center = boomArea.center
|
||||
local radius = boomArea.radius
|
||||
local toHit = {}
|
||||
for _, v in ipairs(self.floorCtrl.tbItem) do
|
||||
if v.Ctrl and v.Ctrl ~= self then
|
||||
local hitArea = v.Ctrl:GetHitArea()
|
||||
if hitArea and hitArea.center then
|
||||
local offset = hitArea.center - center
|
||||
local dist = offset.x * offset.x + offset.y * offset.y
|
||||
if dist <= radius * radius then
|
||||
table.insert(toHit, v.Ctrl)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, ctrl in ipairs(toHit) do
|
||||
if ctrl.gameObject ~= nil and ctrl.gameObject.activeSelf ~= false then
|
||||
ctrl:OnSkill_Boom(function()
|
||||
if ctrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.Boom then
|
||||
return
|
||||
end
|
||||
self.floorCtrl:RemoveItem(ctrl)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
self._mapNode.Icon:SetActive(false)
|
||||
self._mapNode.Effect_Boom.gameObject:SetActive(true)
|
||||
local timer = self:AddTimer(1, 0.1, boom, true, true, true)
|
||||
table.insert(self.tbTimer, timer)
|
||||
local timer2 = self:AddTimer(1, 0.5, function()
|
||||
self.gameObject:SetActive(false)
|
||||
self.floorCtrl:RemoveItem(self)
|
||||
end, true, true, true)
|
||||
table.insert(self.tbTimer, timer2)
|
||||
WwiseAudioMgr:PostEvent("Mode_steal_boom_big")
|
||||
end
|
||||
function GoldenSpyBoomItem:OnSkill_Boom(callback)
|
||||
if callback then
|
||||
self:Boom()
|
||||
callback()
|
||||
end
|
||||
if self.gameObject then
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyBoomItem:OnSkill_Frozen(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBoomItem:OnSkill_Frozen_Resume(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyBoomItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
local boomImg = self._mapNode.BoomArea:GetComponent("Image")
|
||||
if boomImg then
|
||||
boomImg.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyBoomItem
|
||||
@@ -0,0 +1,57 @@
|
||||
local GoldenSpyBuffCellCtrl = class("GoldenSpyBuffCellCtrl", BaseCtrl)
|
||||
local BuffSpritePath = "UI_Activity/_400008/SpriteAtlas/Buff/"
|
||||
local buff_state_color = {
|
||||
[1] = Color(0.8549019607843137, 0.37254901960784315, 0.9137254901960784, 1),
|
||||
[2] = Color(0.42745098039215684, 0.4470588235294118, 0.8509803921568627, 1)
|
||||
}
|
||||
GoldenSpyBuffCellCtrl._mapNodeConfig = {
|
||||
btn_buff = {sComponentName = "UIButton"},
|
||||
img_selected = {},
|
||||
img_icon = {sComponentName = "Image"},
|
||||
img_state = {sComponentName = "Image"},
|
||||
txt_state = {sComponentName = "TMP_Text"}
|
||||
}
|
||||
GoldenSpyBuffCellCtrl._mapEventConfig = {
|
||||
GoldenSpyBuffTipsClose = "OnEvent_BuffTipsClose"
|
||||
}
|
||||
GoldenSpyBuffCellCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyBuffCellCtrl:Awake()
|
||||
self._mapNode.img_selected:SetActive(false)
|
||||
end
|
||||
function GoldenSpyBuffCellCtrl:SetData(data)
|
||||
self.data = data
|
||||
self.buffId = self.data.buffData.buffId
|
||||
self.buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", self.buffId)
|
||||
if self.buffCfg == nil then
|
||||
return
|
||||
end
|
||||
if self.data.nState == AllEnum.GoldenSpyBuffType.UnactiveBuff then
|
||||
self._mapNode.txt_state.gameObject:SetActive(false)
|
||||
self._mapNode.img_state.gameObject:SetActive(false)
|
||||
NovaAPI.SetImageColor(self._mapNode.img_icon, Color(1, 1, 1, 0.3))
|
||||
elseif self.data.nState == AllEnum.GoldenSpyBuffType.DelayBuff then
|
||||
self._mapNode.txt_state.gameObject:SetActive(true)
|
||||
self._mapNode.img_state.gameObject:SetActive(true)
|
||||
NovaAPI.SetTMPText(self._mapNode.txt_state, ConfigTable.GetUIText("GoldenSpyBuffState2"))
|
||||
NovaAPI.SetTMPColor(self._mapNode.txt_state, buff_state_color[self.data.nState])
|
||||
NovaAPI.SetImageColor(self._mapNode.img_state, buff_state_color[self.data.nState])
|
||||
NovaAPI.SetImageColor(self._mapNode.img_icon, Color(1, 1, 1, 1))
|
||||
elseif self.data.nState == AllEnum.GoldenSpyBuffType.ActiveBuff then
|
||||
self._mapNode.txt_state.gameObject:SetActive(true)
|
||||
self._mapNode.img_state.gameObject:SetActive(true)
|
||||
NovaAPI.SetTMPText(self._mapNode.txt_state, ConfigTable.GetUIText("GoldenSpyBuffState1"))
|
||||
NovaAPI.SetTMPColor(self._mapNode.txt_state, buff_state_color[self.data.nState])
|
||||
NovaAPI.SetImageColor(self._mapNode.img_state, buff_state_color[self.data.nState])
|
||||
NovaAPI.SetImageColor(self._mapNode.img_icon, Color(1, 1, 1, 1))
|
||||
end
|
||||
self._mapNode.btn_buff.onClick:RemoveAllListeners()
|
||||
self._mapNode.btn_buff.onClick:AddListener(function()
|
||||
self._mapNode.img_selected:SetActive(true)
|
||||
EventManager.Hit(EventId.OpenPanel, PanelId.GoldenSpyBuffTipsPanel, self._mapNode.btn_buff.transform, self.buffId)
|
||||
end)
|
||||
self:SetPngSprite(self._mapNode.img_icon, BuffSpritePath .. self.buffCfg.Icon .. "_s")
|
||||
end
|
||||
function GoldenSpyBuffCellCtrl:OnEvent_BuffTipsClose()
|
||||
self._mapNode.img_selected:SetActive(false)
|
||||
end
|
||||
return GoldenSpyBuffCellCtrl
|
||||
@@ -0,0 +1,271 @@
|
||||
local GoldenSpyBuffSelectCtrl = class("GoldenSpyBuffSelectCtrl", BaseCtrl)
|
||||
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
||||
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
||||
local BuffSpritePath = "UI_Activity/_400008/SpriteAtlas/Buff/"
|
||||
local ItemSpritePath = "UI_Activity/_400008/SpriteAtlas/Item/"
|
||||
local bg_buff = {
|
||||
[1] = "bg_goldenspy_game_buff_04",
|
||||
[2] = "bg_goldenspy_game_buff_02",
|
||||
[3] = "bg_goldenspy_game_buff_03",
|
||||
[4] = "bg_goldenspy_game_buff_01"
|
||||
}
|
||||
local bg_type = {
|
||||
[1] = "db_goldenspy_tips_buff_01",
|
||||
[2] = "db_goldenspy_tips_buff_02",
|
||||
[3] = "db_goldenspy_tips_buff_03",
|
||||
[4] = "db_goldenspy_tips_buff_04"
|
||||
}
|
||||
local buff_type_lang = {
|
||||
[1] = "GoldenSpyBuffType1",
|
||||
[2] = "GoldenSpyBuffType2",
|
||||
[3] = "GoldenSpyBuffType3",
|
||||
[4] = "GoldenSpyBuffType4"
|
||||
}
|
||||
GoldenSpyBuffSelectCtrl._mapNodeConfig = {
|
||||
root = {
|
||||
sNodeName = "----SafeAreaRoot----"
|
||||
},
|
||||
blur = {
|
||||
sNodeName = "t_fullscreen_blur_black"
|
||||
},
|
||||
animCtrl = {
|
||||
sComponentName = "Animator",
|
||||
sNodeName = "----SafeAreaRoot----"
|
||||
},
|
||||
btnBuff = {
|
||||
sComponentName = "NaviButton",
|
||||
nCount = 3,
|
||||
callback = "OnBtnClick_BuffItem"
|
||||
},
|
||||
rtBtnBuff = {
|
||||
sNodeName = "btnBuff",
|
||||
sComponentName = "RectTransform",
|
||||
nCount = 3
|
||||
},
|
||||
btnConfirm = {
|
||||
sComponentName = "NaviButton",
|
||||
nCount = 3,
|
||||
callback = "OnBtnClick_Confirm"
|
||||
},
|
||||
txtBtnConfirm = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "Potential_Select_Confirm",
|
||||
nCount = 3
|
||||
},
|
||||
rtBtnConfirm = {
|
||||
sNodeName = "btnConfirm",
|
||||
sComponentName = "RectTransform",
|
||||
nCount = 3
|
||||
},
|
||||
lsv_item = {
|
||||
sComponentName = "LoopScrollView"
|
||||
},
|
||||
lsv_buff = {
|
||||
sComponentName = "LoopScrollView"
|
||||
},
|
||||
txt_toolBox = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_ToolBox_Title"
|
||||
}
|
||||
}
|
||||
GoldenSpyBuffSelectCtrl._mapEventConfig = {}
|
||||
GoldenSpyBuffSelectCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyBuffSelectCtrl:Awake()
|
||||
self._mapNode.root:SetActive(false)
|
||||
self._mapNode.blur:SetActive(false)
|
||||
self.tbGamepadUINode = self:GetGamepadUINode()
|
||||
GamepadUIManager.AddGamepadUINode("GoldenSpyBuffSelect", self.tbGamepadUINode)
|
||||
local param = self:GetPanelParam()
|
||||
if type(param) == "table" then
|
||||
self.tbShowItem = param[1]
|
||||
self.tbBuff = param[2]
|
||||
self.tbSelectBuff = param[3]
|
||||
self.selectedCallback = param[4]
|
||||
end
|
||||
self.mapBuffCellCtrl = {}
|
||||
self:ShowBuffSelect(self.tbShowItem, self.tbBuff, self.tbSelectBuff, self.selectedCallback)
|
||||
self.bConfirmed = false
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnEnable()
|
||||
local wait = function()
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
self._mapNode.blur:SetActive(true)
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
self._mapNode.root:SetActive(true)
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
self.handler = {}
|
||||
for k, v in ipairs(self._mapNode.btnBuff) do
|
||||
self.handler[k] = ui_handler(self, self.OnBtnSelect_BuffItem, v, k)
|
||||
v.onSelect:AddListener(self.handler[k])
|
||||
end
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnDisable()
|
||||
for k, v in ipairs(self._mapNode.btnBuff) do
|
||||
v.onSelect:RemoveListener(self.handler[k])
|
||||
end
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnDestroy()
|
||||
for k, v in pairs(self.mapBuffCellCtrl) do
|
||||
self:UnbindCtrlByNode(v)
|
||||
self.mapBuffCellCtrl[k] = nil
|
||||
end
|
||||
self.mapBuffCellCtrl = {}
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:ShowBuffSelect(tbShowItem, tbBuff, tbSelectBuff, selectedCallback)
|
||||
self.selectedCallback = selectedCallback
|
||||
self:RefreshItemList(tbShowItem)
|
||||
self:RefreshBuffList(tbBuff)
|
||||
self:RefreshBuffSelectList(tbSelectBuff)
|
||||
self:ResetSelect(self._mapNode.btnBuff)
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnRefreshItemGrid(goGrid, gridIndex)
|
||||
local nIndex = gridIndex + 1
|
||||
local itemId = self.tbShowItem[nIndex].itemId
|
||||
local itemScore = self.tbShowItem[nIndex].score
|
||||
itemScore = math.floor(itemScore)
|
||||
local itemCfg = ConfigTable.GetData("GoldenSpyItem", itemId)
|
||||
if itemCfg == nil then
|
||||
return
|
||||
end
|
||||
local img_icon = goGrid.transform:Find("db/icon"):GetComponent("Image")
|
||||
local txt_score = goGrid.transform:Find("db/txt_score"):GetComponent("TMP_Text")
|
||||
self:SetPngSprite(img_icon, ItemSpritePath .. itemCfg.IconPath .. "_s")
|
||||
NovaAPI.SetTMPText(txt_score, itemScore)
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:RefreshBuffSelectList(tbSelectBuff)
|
||||
self.tbSelectBuff = tbSelectBuff
|
||||
for k, v in ipairs(self._mapNode.btnBuff) do
|
||||
v.gameObject:SetActive(false)
|
||||
end
|
||||
for i = 1, #self.tbSelectBuff do
|
||||
local buffId = self.tbSelectBuff[i]
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", buffId)
|
||||
if buffCfg ~= nil then
|
||||
local btn = self._mapNode.btnBuff[i]
|
||||
btn.gameObject:SetActive(true)
|
||||
local goSelect = btn.transform:Find("AnimRoot/CardRoot/go_select").gameObject
|
||||
local img_db = btn.transform:Find("AnimRoot/CardRoot/img_db"):GetComponent("Image")
|
||||
local img_icon = btn.transform:Find("AnimRoot/CardRoot/img_icon"):GetComponent("Image")
|
||||
local txt_name = btn.transform:Find("AnimRoot/CardRoot/txt_name"):GetComponent("TMP_Text")
|
||||
local txt_des = btn.transform:Find("AnimRoot/CardRoot/txt_des"):GetComponent("TMP_Text")
|
||||
local db_type = btn.transform:Find("AnimRoot/CardRoot/db_type"):GetComponent("Image")
|
||||
local txt_type = btn.transform:Find("AnimRoot/CardRoot/db_type/txt_type"):GetComponent("TMP_Text")
|
||||
self:SetSprite(img_db, "UI_Activity/_400008/SpriteAtlas/" .. bg_buff[buffCfg.BuffType])
|
||||
self:SetPngSprite(img_icon, BuffSpritePath .. buffCfg.Icon .. "_m")
|
||||
NovaAPI.SetTMPText(txt_name, buffCfg.Name)
|
||||
NovaAPI.SetTMPText(txt_des, buffCfg.Desc)
|
||||
self:SetPngSprite(db_type, "UI_Activity/_400008/SpriteAtlas/" .. bg_type[buffCfg.BuffType])
|
||||
NovaAPI.SetTMPText(txt_type, ConfigTable.GetUIText(buff_type_lang[buffCfg.BuffType]))
|
||||
goSelect:SetActive(false)
|
||||
local tbEffectItem = buffCfg.ConnectItems
|
||||
local tbItemGO = {}
|
||||
for i = 1, 3 do
|
||||
local goItem = btn.transform:Find("AnimRoot/CardRoot/EffectItem" .. i).gameObject
|
||||
goItem:SetActive(false)
|
||||
table.insert(tbItemGO, goItem)
|
||||
end
|
||||
for i = 1, #tbEffectItem do
|
||||
local goItem = tbItemGO[i]
|
||||
local itemCfg = ConfigTable.GetData("GoldenSpyItem", tbEffectItem[i])
|
||||
local img_icon = goItem.transform:Find("itemIcon"):GetComponent("Image")
|
||||
self:SetPngSprite(img_icon, ItemSpritePath .. itemCfg.IconPath .. "_s")
|
||||
goItem:SetActive(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:RefreshItemList(tbShowItem)
|
||||
self.tbShowItem = tbShowItem
|
||||
if self.tbShowItem == nil or #self.tbShowItem == 0 then
|
||||
self._mapNode.lsv_item.gameObject:SetActive(false)
|
||||
return
|
||||
end
|
||||
self._mapNode.lsv_item:Init(#self.tbShowItem, self, self.OnRefreshItemGrid)
|
||||
self._mapNode.lsv_item.gameObject:SetActive(true)
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:RefreshBuffList(tbBuff)
|
||||
self.tbBuff = tbBuff
|
||||
if self.tbBuff == nil or #self.tbBuff == 0 then
|
||||
self._mapNode.lsv_buff.gameObject:SetActive(false)
|
||||
return
|
||||
end
|
||||
self._mapNode.lsv_buff.gameObject:SetActive(true)
|
||||
self._mapNode.lsv_buff:Init(#self.tbBuff, self, self.OnRefreshBuffGrid)
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnRefreshBuffGrid(goGrid, gridIndex)
|
||||
local nIndex = gridIndex + 1
|
||||
local nInstanceId = goGrid:GetInstanceID()
|
||||
local objCtrl = self.mapBuffCellCtrl[nInstanceId]
|
||||
if objCtrl == nil then
|
||||
objCtrl = self:BindCtrlByNode(goGrid, "Game.UI.Activity.GoldenSpy.GoldenSpyBuffCellCtrl")
|
||||
self.mapBuffCellCtrl[nInstanceId] = objCtrl
|
||||
end
|
||||
objCtrl:SetData(self.tbBuff[nIndex])
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:ResetSelect(tbUI)
|
||||
self.nSelectIdx = 0
|
||||
GamepadUIManager.SetNavigation(tbUI)
|
||||
local nCardAnimTime = 0
|
||||
local nPanelAnimTime = 0
|
||||
local nAnimTime = nCardAnimTime > nPanelAnimTime and nCardAnimTime or nPanelAnimTime
|
||||
nAnimTime = nAnimTime + 0.4
|
||||
self:AddTimer(1, nAnimTime, function()
|
||||
if self.nSelectIdx == 0 then
|
||||
GamepadUIManager.ClearSelectedUI()
|
||||
GamepadUIManager.SetSelectedUI(self._mapNode.btnBuff[1].gameObject)
|
||||
if GamepadUIManager.GetCurUIType() == AllEnum.GamepadUIType.Mouse then
|
||||
self:OnBtnClick_BuffItem(self._mapNode.btnBuff[1].gameObject, 1)
|
||||
end
|
||||
end
|
||||
end, true, true, true)
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnBtnClick_BuffItem(btn, nIndex)
|
||||
if nil == self.tbSelectBuff[nIndex] or self.nSelectIdx == nIndex then
|
||||
return
|
||||
end
|
||||
for k, v in ipairs(self._mapNode.btnBuff) do
|
||||
local goSelect = v.transform:Find("AnimRoot/CardRoot/go_select").gameObject
|
||||
local animator = v.transform:Find("AnimRoot"):GetComponent("Animator")
|
||||
if k == nIndex then
|
||||
goSelect:SetActive(true)
|
||||
animator:Play("btnBuff_up")
|
||||
elseif k == self.nSelectIdx then
|
||||
goSelect:SetActive(false)
|
||||
animator:Play("btnBuff_down")
|
||||
end
|
||||
end
|
||||
self.nSelectIdx = nIndex
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnBtnSelect_BuffItem(btn, nIndex)
|
||||
local nUIType = GamepadUIManager.GetCurUIType()
|
||||
if nUIType ~= AllEnum.GamepadUIType.Other and nUIType ~= AllEnum.GamepadUIType.Mouse then
|
||||
self:OnBtnClick_BuffItem(btn, nIndex)
|
||||
end
|
||||
end
|
||||
function GoldenSpyBuffSelectCtrl:OnBtnClick_Confirm(btn, nIndex)
|
||||
if self.bConfirmed then
|
||||
return
|
||||
end
|
||||
if self.nSelectIdx ~= 0 and self.selectedCallback ~= nil then
|
||||
self.bConfirmed = true
|
||||
for k, v in ipairs(self._mapNode.btnBuff) do
|
||||
if k ~= self.nSelectIdx then
|
||||
v.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
local selectBtn = self._mapNode.btnBuff[self.nSelectIdx]
|
||||
local animator = selectBtn.transform:Find("AnimRoot"):GetComponent("Animator")
|
||||
animator:Play("btnBuff_get")
|
||||
self._mapNode.animCtrl:Play("GoldenSpyBuffSelectPanel_out")
|
||||
self:AddTimer(1, 0.6, function()
|
||||
self.selectedCallback(self.tbSelectBuff[self.nSelectIdx])
|
||||
local wait = function()
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.GoldenSpyBuffSelectPanel)
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
end, true, true, true, nil)
|
||||
end
|
||||
end
|
||||
return GoldenSpyBuffSelectCtrl
|
||||
@@ -0,0 +1,26 @@
|
||||
local GoldenSpyBuffSelectPanel = class("GoldenSpyBuffSelectPanel", BasePanel)
|
||||
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
||||
GoldenSpyBuffSelectPanel._bIsMainPanel = false
|
||||
GoldenSpyBuffSelectPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
|
||||
GoldenSpyBuffSelectPanel._sUIResRootPath = "UI_Activity/"
|
||||
GoldenSpyBuffSelectPanel._tbDefine = {
|
||||
{
|
||||
sPrefabPath = "_400008/GoldenSpyBuffSelectPanel.prefab",
|
||||
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyBuffSelectCtrl"
|
||||
}
|
||||
}
|
||||
function GoldenSpyBuffSelectPanel:Awake()
|
||||
GamepadUIManager.EnableGamepadUI("GoldenSpyBuffSelect", {})
|
||||
end
|
||||
function GoldenSpyBuffSelectPanel:OnEnable()
|
||||
end
|
||||
function GoldenSpyBuffSelectPanel:OnAfterEnter()
|
||||
end
|
||||
function GoldenSpyBuffSelectPanel:OnDisable()
|
||||
end
|
||||
function GoldenSpyBuffSelectPanel:OnDestroy()
|
||||
GamepadUIManager.DisableGamepadUI("GoldenSpyBuffSelect")
|
||||
end
|
||||
function GoldenSpyBuffSelectPanel:OnRelease()
|
||||
end
|
||||
return GoldenSpyBuffSelectPanel
|
||||
@@ -0,0 +1,101 @@
|
||||
local GoldenSpyBuffTipsCtrl = class("GoldenSpyBuffTipsCtrl", BaseCtrl)
|
||||
local nOffsetBottom = -85
|
||||
local nContentEdge = -20
|
||||
local nArrowOffect = 17
|
||||
local leftSafeEdge = 30
|
||||
GoldenSpyBuffTipsCtrl.minTipHeight = 87
|
||||
GoldenSpyBuffTipsCtrl.maxTipHeight = 557
|
||||
local titleHeight = 240
|
||||
local MoveUpHeight = 45
|
||||
GoldenSpyBuffTipsCtrl._mapNodeConfig = {
|
||||
btnCloseTips = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_ClosePanel"
|
||||
},
|
||||
TMPBuffName = {sComponentName = "TMP_Text"},
|
||||
TMPBuffDes = {sComponentName = "TMP_Text"},
|
||||
imgArrow = {
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
rtContent = {
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
safeAreaRoot = {
|
||||
sNodeName = "----SafeAreaRoot---",
|
||||
sComponentName = "RectTransform"
|
||||
}
|
||||
}
|
||||
GoldenSpyBuffTipsCtrl._mapEventConfig = {}
|
||||
GoldenSpyBuffTipsCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyBuffTipsCtrl:Awake()
|
||||
local tbParam = self:GetPanelParam()
|
||||
if type(tbParam) == "table" then
|
||||
self.rtTarget = tbParam[1]
|
||||
self.buffId = tbParam[2]
|
||||
end
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:OnEnable()
|
||||
self:SetTipsContent()
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:OnDisable()
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:OnDestroy()
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:SetTipsContent()
|
||||
NovaAPI.SetComponentEnableByName(self.rtTarget.gameObject, "TopGridCanvas", true)
|
||||
self.sortingOrder = NovaAPI.GetCanvasSortingOrder(self.gameObject:GetComponent("Canvas"))
|
||||
NovaAPI.SetTopGridCanvasSorting(self.rtTarget.gameObject, self.sortingOrder)
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", self.buffId)
|
||||
if buffCfg == nil then
|
||||
return
|
||||
end
|
||||
NovaAPI.SetTMPText(self._mapNode.TMPBuffName, buffCfg.Name)
|
||||
NovaAPI.SetTMPText(self._mapNode.TMPBuffDes, buffCfg.Desc)
|
||||
local wait = function()
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
self:SetTipsPosition(self.rtTarget, self._mapNode.rtContent, self._mapNode.safeAreaRoot)
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:SetTipsPosition(rtTarget, rtContent, safeAreaRoot)
|
||||
local rtTargetRect = rtTarget:GetComponent("RectTransform")
|
||||
local rtTipsContent = rtContent:Find("rtTipsPoint/imgTipsBg"):GetComponent("RectTransform")
|
||||
local rtArrow = rtContent:Find("rtTipsPoint/imgArrow"):GetComponent("RectTransform")
|
||||
local rtTipsPoint = rtContent:Find("rtTipsPoint"):GetComponent("RectTransform")
|
||||
local screenHeight = safeAreaRoot.rect.size.y
|
||||
local screenWidth = safeAreaRoot.rect.size.x
|
||||
local nTipHeight = rtTipsContent.sizeDelta.y
|
||||
local nTipWidth = rtTipsContent.sizeDelta.x
|
||||
local niconSize = rtTargetRect.sizeDelta.x
|
||||
local nIconScale = rtTargetRect.localScale.x
|
||||
local nFinalSize = niconSize * nIconScale
|
||||
rtContent.sizeDelta = Vector2(nFinalSize, nFinalSize)
|
||||
rtContent.position = rtTarget.transform.position
|
||||
local nFactor = -1
|
||||
if rtContent.anchoredPosition.x + nContentEdge - 0.5 * nFinalSize - nTipWidth - nArrowOffect - leftSafeEdge < -(0.5 * screenWidth) then
|
||||
nFactor = 1
|
||||
end
|
||||
local xPoint = 0.5 * nFinalSize * nFactor
|
||||
local xArrow = nArrowOffect * nFactor
|
||||
local xTip = 0.5 * nTipWidth * nFactor - nContentEdge * nFactor
|
||||
local nTipsContentYOffest = 0
|
||||
if rtContent.anchoredPosition.y + nOffsetBottom + nTipHeight > 0.5 * screenHeight - 30 then
|
||||
nTipsContentYOffest = rtContent.anchoredPosition.y + nOffsetBottom + nTipHeight - (0.5 * screenHeight - 30)
|
||||
elseif rtContent.anchoredPosition.y + nOffsetBottom < -0.5 * screenHeight + 30 then
|
||||
nTipsContentYOffest = rtContent.anchoredPosition.y + nOffsetBottom - (-0.5 * screenHeight + 30)
|
||||
end
|
||||
local yTip = nOffsetBottom - nTipsContentYOffest
|
||||
rtTipsPoint.anchoredPosition = Vector2(xPoint, 0)
|
||||
rtArrow.anchoredPosition = Vector2(xArrow, 0)
|
||||
rtTipsContent.anchoredPosition = Vector2(xTip, yTip)
|
||||
rtArrow.localScale = Vector3(nFactor, 1, 1)
|
||||
local cg = rtContent:GetComponent("CanvasGroup")
|
||||
NovaAPI.SetCanvasGroupAlpha(cg, 1)
|
||||
end
|
||||
function GoldenSpyBuffTipsCtrl:OnBtnClick_ClosePanel()
|
||||
NovaAPI.SetComponentEnableByName(self.rtTarget.gameObject, "TopGridCanvas", false)
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.GoldenSpyBuffTipsPanel)
|
||||
EventManager.Hit("GoldenSpyBuffTipsClose")
|
||||
end
|
||||
return GoldenSpyBuffTipsCtrl
|
||||
@@ -0,0 +1,24 @@
|
||||
local GoldenSpyBuffTipsPanel = class("GoldenSpyBuffTipsPanel", BasePanel)
|
||||
GoldenSpyBuffTipsPanel._bIsMainPanel = false
|
||||
GoldenSpyBuffTipsPanel._bAddToBackHistory = false
|
||||
GoldenSpyBuffTipsPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
|
||||
GoldenSpyBuffTipsPanel._sUIResRootPath = "UI_Activity/"
|
||||
GoldenSpyBuffTipsPanel._tbDefine = {
|
||||
{
|
||||
sPrefabPath = "_400008/GoldenSpyBuffTips.prefab",
|
||||
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyBuffTipsCtrl"
|
||||
}
|
||||
}
|
||||
function GoldenSpyBuffTipsPanel:Awake()
|
||||
end
|
||||
function GoldenSpyBuffTipsPanel:OnEnable()
|
||||
end
|
||||
function GoldenSpyBuffTipsPanel:OnAfterEnter()
|
||||
end
|
||||
function GoldenSpyBuffTipsPanel:OnDisable()
|
||||
end
|
||||
function GoldenSpyBuffTipsPanel:OnDestroy()
|
||||
end
|
||||
function GoldenSpyBuffTipsPanel:OnRelease()
|
||||
end
|
||||
return GoldenSpyBuffTipsPanel
|
||||
@@ -0,0 +1,448 @@
|
||||
local GoldenSpyBaseItem = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseItem")
|
||||
local GoldenSpyCompanionItem = class("GoldenSpyCompanionItem", GoldenSpyBaseItem)
|
||||
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
||||
local VisionAngle = 45
|
||||
local VisionRadius = 250
|
||||
GoldenSpyCompanionItem._mapNodeConfig = {
|
||||
trDrone = {
|
||||
sNodeName = "Drone",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
StartPoint = {
|
||||
sNodeName = "StartPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
EndPoint = {
|
||||
sNodeName = "EndPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
VisionPoint = {
|
||||
sNodeName = "VisionPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
animator = {sNodeName = "Icon", sComponentName = "Animator"},
|
||||
flash = {},
|
||||
imgIce = {},
|
||||
IceRoot = {
|
||||
sComponentName = "RectTransform"
|
||||
}
|
||||
}
|
||||
GoldenSpyCompanionItem._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyCompanionItem._mapRedDotConfig = {}
|
||||
function GoldenSpyCompanionItem:Awake()
|
||||
self._moveTweener = nil
|
||||
self._visionTweener = nil
|
||||
self._mapNode.flash:SetActive(false)
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnEnable()
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnDisable()
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnDestroy()
|
||||
self:StopMove()
|
||||
end
|
||||
function GoldenSpyCompanionItem:Init()
|
||||
self.nUid = nil
|
||||
self.nItemId = nil
|
||||
self.bDirection = true
|
||||
self.nBagItemPrice = 0
|
||||
local startPoint = self._mapNode.StartPoint.anchoredPosition
|
||||
self.vStartPoint = Vector3(startPoint.x, startPoint.y, 0)
|
||||
local endPoint = self._mapNode.EndPoint.anchoredPosition
|
||||
self.vEndPoint = Vector3(endPoint.x, endPoint.y, 0)
|
||||
local visionPoint = self._mapNode.VisionPoint.anchoredPosition
|
||||
self.vVisionPoint = Vector3(visionPoint.x, visionPoint.y, 0)
|
||||
self.bDirection = self.vEndPoint.x > self.vStartPoint.x
|
||||
self.bDestination = false
|
||||
end
|
||||
function GoldenSpyCompanionItem:InitData()
|
||||
self.nVisionAngle = self.itemCfg.Params[2] or VisionAngle
|
||||
self.nVisionRadius = self.itemCfg.Params[3] or VisionRadius
|
||||
end
|
||||
function GoldenSpyCompanionItem:GetHitArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local hitArea = {
|
||||
nType = self.nHitAreaType,
|
||||
center = self._mapNode.HitArea.anchoredPosition + tr.anchoredPosition + self._mapNode.trDrone.anchoredPosition,
|
||||
width = self._mapNode.HitArea.sizeDelta.x,
|
||||
height = self._mapNode.HitArea.sizeDelta.y
|
||||
}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpyCompanionItem:StartFloor()
|
||||
self:StartMove()
|
||||
end
|
||||
function GoldenSpyCompanionItem:FinishFloor()
|
||||
self:StopMove()
|
||||
end
|
||||
function GoldenSpyCompanionItem:GetBagItemPrice()
|
||||
return self.nBagItemPrice
|
||||
end
|
||||
function GoldenSpyCompanionItem:GetVisionArea()
|
||||
local visionArea = {
|
||||
center = self._mapNode.VisionPoint.anchoredPosition + self.gameObject.transform.anchoredPosition,
|
||||
radius = self._mapNode.VisionPoint.sizeDelta.x * 0.5,
|
||||
direction = self.bDirection
|
||||
}
|
||||
return visionArea
|
||||
end
|
||||
function GoldenSpyCompanionItem:Pause()
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Pause()
|
||||
end
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Pause(true)
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:Resume()
|
||||
if self.bFrozen then
|
||||
return
|
||||
end
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Play()
|
||||
end
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Pause(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:onCatch(callback)
|
||||
self:StopMove()
|
||||
self._mapNode.trDrone.anchoredPosition = Vector2.zero
|
||||
self._mapNode.animator:Play("Patrol_out")
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnSkill_Boom(callback)
|
||||
self:StopMove()
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
if self.gameObject then
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnSkill_Frozen(callback)
|
||||
self.bFrozen = true
|
||||
self._mapNode.imgIce:SetActive(true)
|
||||
self._mapNode.animator:Play("Patrol_out")
|
||||
self:Pause()
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnSkill_Frozen_Resume(callback)
|
||||
self.bFrozen = false
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self._mapNode.IceRoot:SetParent(self.gameObject.transform)
|
||||
self._mapNode.IceRoot.anchoredPosition = self._mapNode.trDrone.anchoredPosition
|
||||
self._mapNode.IceRoot.gameObject:SetActive(true)
|
||||
self._mapNode.animator:Play("Patrol_idle")
|
||||
self:Resume()
|
||||
self:AddTimer(1, 0.5, function()
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
self._mapNode.IceRoot:SetParent(self._mapNode.trDrone)
|
||||
end, true, true, true)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:StartMove()
|
||||
self:StopMove()
|
||||
self.bDirection = self.vEndPoint.x > self.vStartPoint.x
|
||||
self:_ApplyForwardRotation()
|
||||
self:_StartMoveTween()
|
||||
self:_StartVisionCheck()
|
||||
end
|
||||
function GoldenSpyCompanionItem:_StartMoveTween()
|
||||
local tr = self._mapNode.trDrone
|
||||
if tr == nil then
|
||||
return
|
||||
end
|
||||
local from = tr.anchoredPosition
|
||||
local to = self.bDestination and self.vStartPoint or self.vEndPoint
|
||||
local dist = to.x - from.x
|
||||
local duration = math.abs(dist / (self.itemCfg.Params[1] or 100))
|
||||
if duration <= 0 then
|
||||
self:_OnReachTarget()
|
||||
return
|
||||
end
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Kill(false)
|
||||
self._moveTweener = nil
|
||||
end
|
||||
self._moveTweener = tr:DOAnchorPosX(to.x, duration):SetEase(Ease.Linear):SetUpdate(true):OnUpdate(function()
|
||||
end):OnComplete(function()
|
||||
self:_OnReachTarget()
|
||||
end):OnKill(function()
|
||||
end)
|
||||
end
|
||||
function GoldenSpyCompanionItem:StopMove()
|
||||
self:_KillMoveTween()
|
||||
self:_StopVisionCheck()
|
||||
end
|
||||
function GoldenSpyCompanionItem:_OnReachTarget()
|
||||
self.bDirection = not self.bDirection
|
||||
self.bDestination = not self.bDestination
|
||||
self:_ApplyForwardRotation()
|
||||
self:_StartMoveTween()
|
||||
end
|
||||
function GoldenSpyCompanionItem:_ApplyForwardRotation()
|
||||
local tr = self._mapNode.trDrone
|
||||
if tr then
|
||||
if self.bDirection then
|
||||
tr.localEulerAngles = Vector3(0, 0, 0)
|
||||
else
|
||||
tr.localEulerAngles = Vector3(0, 180, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:_KillMoveTween()
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Kill(false)
|
||||
self._moveTweener = nil
|
||||
end
|
||||
if self._mapNode.trDrone ~= nil then
|
||||
self._mapNode.trDrone:DOKill(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:GetForwardAngle()
|
||||
if self.bDirection then
|
||||
return 0
|
||||
else
|
||||
return 180
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:_PointInSector(px, py, cx, cy, forwardAngle, visionAngle, radius)
|
||||
local dx, dy = px - cx, py - cy
|
||||
local dist2 = dx * dx + dy * dy
|
||||
if dist2 > radius * radius then
|
||||
return false
|
||||
end
|
||||
local angle = math.deg(math.atan(dy, dx))
|
||||
local lo = forwardAngle - visionAngle
|
||||
local hi = forwardAngle + visionAngle
|
||||
while angle < lo do
|
||||
angle = angle + 360
|
||||
end
|
||||
while angle > hi + 360 do
|
||||
angle = angle - 360
|
||||
end
|
||||
if lo <= angle and hi >= angle then
|
||||
return true
|
||||
end
|
||||
if angle >= lo - 360 and angle <= hi - 360 then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
function GoldenSpyCompanionItem:_HitAreaInSector(hitArea, vx, vy, forwardAngle, halfAngle, radius)
|
||||
if not (hitArea and vx) or not vy then
|
||||
return false
|
||||
end
|
||||
local shape = hitArea.nType
|
||||
local cx, cy = vx, vy
|
||||
local ix, iy
|
||||
if hitArea.center then
|
||||
ix, iy = hitArea.center.x, hitArea.center.y
|
||||
else
|
||||
return false
|
||||
end
|
||||
if shape == AllEnum.GoldenSpyHitAreaType.Rectangle then
|
||||
local w = (hitArea.width or 0) * 0.5
|
||||
local h = (hitArea.width or 0) * 0.5
|
||||
local corners = {
|
||||
{ix, iy},
|
||||
{
|
||||
ix + w,
|
||||
iy
|
||||
},
|
||||
{
|
||||
ix - w,
|
||||
iy
|
||||
},
|
||||
{
|
||||
ix,
|
||||
iy + h
|
||||
},
|
||||
{
|
||||
ix,
|
||||
iy - h
|
||||
},
|
||||
{
|
||||
ix + w,
|
||||
iy + h
|
||||
},
|
||||
{
|
||||
ix - w,
|
||||
iy - h
|
||||
},
|
||||
{
|
||||
ix + w,
|
||||
iy - h
|
||||
},
|
||||
{
|
||||
ix - w,
|
||||
iy + h
|
||||
}
|
||||
}
|
||||
for _, p in ipairs(corners) do
|
||||
if self:_PointInSector(p[1], p[2], cx, cy, forwardAngle, halfAngle, radius) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
local itemR = hitArea.radius or 0
|
||||
return self:_CircleSectorIntersect(ix, iy, itemR, cx, cy, forwardAngle, halfAngle, radius)
|
||||
end
|
||||
function GoldenSpyCompanionItem:_PointToSectorDist(px, py, cx, cy, forwardAngle, halfAngle, radius)
|
||||
local dx, dy = px - cx, py - cy
|
||||
local dist = math.sqrt(dx * dx + dy * dy)
|
||||
local angleDeg = math.deg(math.atan(dy, dx))
|
||||
local lo = forwardAngle - halfAngle
|
||||
local hi = forwardAngle + halfAngle
|
||||
while angleDeg < lo - 180 do
|
||||
angleDeg = angleDeg + 360
|
||||
end
|
||||
while angleDeg > hi + 180 do
|
||||
angleDeg = angleDeg - 360
|
||||
end
|
||||
if lo <= angleDeg and hi >= angleDeg and radius >= dist then
|
||||
return 0
|
||||
end
|
||||
local radLo = math.rad(lo)
|
||||
local radHi = math.rad(hi)
|
||||
local clampAngle = angleDeg
|
||||
if lo > clampAngle then
|
||||
clampAngle = lo
|
||||
end
|
||||
if hi < clampAngle then
|
||||
clampAngle = hi
|
||||
end
|
||||
local radClamp = math.rad(clampAngle)
|
||||
local ax = cx + radius * math.cos(radClamp)
|
||||
local ay = cy + radius * math.sin(radClamp)
|
||||
local dArc = math.sqrt((px - ax) ^ 2 + (py - ay) ^ 2)
|
||||
local distToRay = function(angleRay)
|
||||
local rad = math.rad(angleRay)
|
||||
local rx, ry = math.cos(rad), math.sin(rad)
|
||||
local t = dx * rx + dy * ry
|
||||
if t <= 0 then
|
||||
return math.sqrt(dx * dx + dy * dy)
|
||||
end
|
||||
if t >= radius then
|
||||
local ex = cx + radius * rx
|
||||
local ey = cy + radius * ry
|
||||
return math.sqrt((px - ex) ^ 2 + (py - ey) ^ 2)
|
||||
end
|
||||
local nx = cx + t * rx
|
||||
local ny = cy + t * ry
|
||||
return math.sqrt((px - nx) ^ 2 + (py - ny) ^ 2)
|
||||
end
|
||||
local dRay1 = distToRay(lo)
|
||||
local dRay2 = distToRay(hi)
|
||||
return math.min(dArc, dRay1, dRay2)
|
||||
end
|
||||
function GoldenSpyCompanionItem:_CircleSectorIntersect(circleCx, circleCy, circleR, sectorCx, sectorCy, sectorForward, sectorHalfAngle, sectorRadius)
|
||||
local dist = self:_PointToSectorDist(circleCx, circleCy, sectorCx, sectorCy, sectorForward, sectorHalfAngle, sectorRadius)
|
||||
return circleR >= dist
|
||||
end
|
||||
function GoldenSpyCompanionItem:_CheckVision()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local vp = self._mapNode.VisionPoint.anchoredPosition + tr.anchoredPosition + self._mapNode.trDrone.anchoredPosition
|
||||
if vp == nil then
|
||||
return
|
||||
end
|
||||
local vx, vy = vp.x, vp.y
|
||||
local forwardAngle = self:GetForwardAngle()
|
||||
local halfAngle = self.nVisionAngle
|
||||
local radius = self.nVisionRadius
|
||||
if not self.floorCtrl.tbItem then
|
||||
return
|
||||
end
|
||||
local tempItems = {}
|
||||
for _, item in ipairs(self.floorCtrl.tbItem) do
|
||||
table.insert(tempItems, item)
|
||||
end
|
||||
local tbRemoveItems = {}
|
||||
for _, item in ipairs(tempItems) do
|
||||
if item.Ctrl ~= self then
|
||||
local hitArea = item.Ctrl:GetHitArea()
|
||||
if hitArea and self:_HitAreaInSector(hitArea, vx, vy, forwardAngle, halfAngle, radius) then
|
||||
if item.Ctrl == self.floorCtrl.catchedItem then
|
||||
goto lbl_228
|
||||
end
|
||||
if item.Ctrl:GetItemCfg().ItemType == GameEnum.GoldenSpyItem.Boom then
|
||||
item.Ctrl:Boom(nil)
|
||||
else
|
||||
local itemCfg = item.Ctrl:GetItemCfg()
|
||||
local nScore = itemCfg.Score
|
||||
local tbHasBuff = self.floorCtrl.levelCtrl.GoldenSpyLevelData:GetBuffData()
|
||||
for _, v in ipairs(tbHasBuff) do
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
|
||||
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore and buffCfg.Params[1] == itemCfg.ItemType then
|
||||
local curFloor = self.floorCtrl.levelCtrl.GoldenSpyLevelData:GetCurFloor()
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, curFloor) > 0 then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, curFloor) > 0 then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if v.bActive then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
end
|
||||
end
|
||||
self._mapNode.animator:Play("Patrol_attack")
|
||||
item.Ctrl:OnSkill_InVision()
|
||||
self.nBagItemPrice = self.nBagItemPrice + nScore
|
||||
WwiseAudioMgr:PostEvent("Mode_steal_eat")
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local vPos = tr.anchoredPosition + self._mapNode.trDrone.anchoredPosition
|
||||
EventManager.Hit("GoldenSpy_CompanionAddScore", nScore, vPos)
|
||||
end
|
||||
table.insert(tbRemoveItems, item)
|
||||
else
|
||||
end
|
||||
for _, v in ipairs(tbRemoveItems) do
|
||||
self.floorCtrl:RemoveItem(v.Ctrl)
|
||||
end
|
||||
tbRemoveItems = {}
|
||||
end
|
||||
::lbl_228::
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:_StartVisionCheck()
|
||||
self:_StopVisionCheck()
|
||||
self._visionUpdateTimer = self:AddTimer(0, 0, "OnVisionUpdate", true, true, true)
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnVisionUpdate()
|
||||
self:_CheckVision()
|
||||
end
|
||||
function GoldenSpyCompanionItem:_StopVisionCheck()
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Cancel()
|
||||
self._visionUpdateTimer = nil
|
||||
end
|
||||
end
|
||||
function GoldenSpyCompanionItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyCompanionItem
|
||||
@@ -0,0 +1,395 @@
|
||||
local GoldenSpyFloorCtrl = class("GoldenSpyFloorCtrl", BaseCtrl)
|
||||
local LevelPrefabPath = "UI_Activity/_400008/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(LevelPrefabPath .. 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)
|
||||
local bDelSuccess = false
|
||||
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(itemCtrl:GetItemCfg().Id)
|
||||
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
|
||||
@@ -0,0 +1,53 @@
|
||||
local GoldenSpyFloorData = class("GoldenSpyFloorData")
|
||||
function GoldenSpyFloorData:ctor()
|
||||
end
|
||||
function GoldenSpyFloorData:InitData()
|
||||
self.tbItem = {}
|
||||
end
|
||||
function GoldenSpyFloorData:StartFloor(levelId, floorId)
|
||||
self.levelId = levelId
|
||||
self.floorId = floorId
|
||||
self.floorConfig = ConfigTable.GetData("GoldenSpyFloor", floorId)
|
||||
if self.floorConfig == nil then
|
||||
return
|
||||
end
|
||||
end
|
||||
function GoldenSpyFloorData:GetCurFloor()
|
||||
return self.floorId
|
||||
end
|
||||
function GoldenSpyFloorData:GetFloorConfig()
|
||||
return self.floorConfig
|
||||
end
|
||||
function GoldenSpyFloorData:SetItem(itemId)
|
||||
if self.tbItem[itemId] == nil then
|
||||
self.tbItem[itemId] = {itemId = itemId, itemCount = 0}
|
||||
end
|
||||
self.tbItem[itemId].itemCount = self.tbItem[itemId].itemCount + 1
|
||||
end
|
||||
function GoldenSpyFloorData:DeleteItem(itemId)
|
||||
if self.tbItem[itemId] == nil then
|
||||
return
|
||||
end
|
||||
self.tbItem[itemId].itemCount = self.tbItem[itemId].itemCount - 1
|
||||
if self.tbItem[itemId].itemCount <= 0 then
|
||||
self.tbItem[itemId] = nil
|
||||
end
|
||||
local itemCfg = ConfigTable.GetData("GoldenSpyItem", itemId)
|
||||
if itemCfg.ItemType == GameEnum.GoldenSpyItem.BuffItem then
|
||||
return
|
||||
end
|
||||
local nCount = 0
|
||||
for k, v in pairs(self.tbItem) do
|
||||
local itemCfg = ConfigTable.GetData("GoldenSpyItem", k)
|
||||
if itemCfg ~= nil and itemCfg.ItemType ~= GameEnum.GoldenSpyItem.Boom then
|
||||
nCount = nCount + v.itemCount
|
||||
end
|
||||
end
|
||||
if self.tbItem == nil or nCount <= 0 then
|
||||
EventManager.Hit("GoldenSpy_FinishFloor")
|
||||
end
|
||||
end
|
||||
function GoldenSpyFloorData:GetItems()
|
||||
return self.tbItem
|
||||
end
|
||||
return GoldenSpyFloorData
|
||||
@@ -0,0 +1,606 @@
|
||||
local GoldenSpyHookCtrl = class("GoldenSpyHookCtrl", BaseCtrl)
|
||||
local LoopType = CS.DG.Tweening.LoopType
|
||||
GoldenSpyHookCtrl._mapNodeConfig = {
|
||||
trHookPivot = {
|
||||
sNodeName = "HookPivot",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
trLine = {
|
||||
sNodeName = "hook_line",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
trHookEnd = {
|
||||
sNodeName = "hook",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
rtMaxLengthArea = {
|
||||
sNodeName = "MaxLengthArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
itemParent = {
|
||||
sNodeName = "itemParent",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
hook_open = {},
|
||||
hook_normal = {},
|
||||
hook_catched = {}
|
||||
}
|
||||
GoldenSpyHookCtrl.DefaultLineSize = 100
|
||||
GoldenSpyHookCtrl.DefaultHookPosY = -90
|
||||
GoldenSpyHookCtrl.HOOK_SWING_EASE = Ease.Linear
|
||||
GoldenSpyHookCtrl.HOOK_EXTEND_EASE = Ease.Linear
|
||||
GoldenSpyHookCtrl.HOOK_RETRACT_EASE = Ease.Linear
|
||||
local HookStage = {
|
||||
STATE_SWINGING = 1,
|
||||
STATE_EXTENDING = 2,
|
||||
STATE_RETRACTING = 3
|
||||
}
|
||||
function GoldenSpyHookCtrl:Init(levelId, floorId, floorCtrl, levelData, floorData)
|
||||
self.levelId = levelId
|
||||
self.floorId = floorId
|
||||
self.floorCtrl = floorCtrl
|
||||
self.levelData = levelData
|
||||
self.floorData = floorData
|
||||
self:DestroyItemInHook()
|
||||
local levelCfg = ConfigTable.GetData("GoldenSpyLevel", self.levelId)
|
||||
local configCfg = ConfigTable.GetData("GoldenSpyConfig", levelCfg.ConfigId)
|
||||
self.HOOK_SWING_LEFT_ANGLE = -configCfg.MaxAngle
|
||||
self.HOOK_SWING_RIGHT_ANGLE = configCfg.MaxAngle
|
||||
self.HOOK_SWING_DURATION = configCfg.AngleTime
|
||||
self._swingTweener = nil
|
||||
self._extendTweener = nil
|
||||
self._retractTweener = nil
|
||||
self._hookLength = 0
|
||||
self._hookState = 0
|
||||
self._onExtendComplete = nil
|
||||
self._onRetractComplete = nil
|
||||
self._swingGoingRight = true
|
||||
self._swingAtRight = false
|
||||
self.curCatchedItem = nil
|
||||
self._mapNode.trHookPivot.localEulerAngles = Vector3(0, 0, 0)
|
||||
self._mapNode.trHookEnd.localPosition = Vector3(0, self.DefaultHookPosY, 0)
|
||||
self:ApplyHookLength()
|
||||
self._mapNode.hook_open:SetActive(false)
|
||||
self._mapNode.hook_normal:SetActive(true)
|
||||
self._mapNode.hook_catched:SetActive(false)
|
||||
end
|
||||
function GoldenSpyHookCtrl:DestroyItemInHook()
|
||||
local itemParent = self._mapNode.itemParent
|
||||
if itemParent == nil then
|
||||
return
|
||||
end
|
||||
local nChildCount = itemParent.transform.childCount
|
||||
for i = 1, nChildCount do
|
||||
local child = itemParent.transform:GetChild(i - 1)
|
||||
destroy(child.gameObject)
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:ApplyHookLength()
|
||||
local tr = self._mapNode.trHookEnd
|
||||
if tr then
|
||||
tr.localPosition = Vector3(0, -self._hookLength + self.DefaultHookPosY, 0)
|
||||
end
|
||||
local rtLine = self._mapNode.trLine
|
||||
if rtLine and not rtLine:IsNull() then
|
||||
rtLine.sizeDelta = Vector2(rtLine.sizeDelta.x, self._hookLength + self.DefaultLineSize)
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:SetHookLength(length)
|
||||
self._hookLength = math.max(0, length)
|
||||
self:ApplyHookLength()
|
||||
end
|
||||
function GoldenSpyHookCtrl:_DoSwingPhase(fromAngle, toAngle, onPhaseComplete)
|
||||
local pivot = self._mapNode.trHookPivot
|
||||
if pivot == nil or onPhaseComplete == nil then
|
||||
return
|
||||
end
|
||||
self._mapNode.hook_open:SetActive(false)
|
||||
self._mapNode.hook_normal:SetActive(true)
|
||||
self._mapNode.hook_catched:SetActive(false)
|
||||
self._swingGoingRight = toAngle == self.HOOK_SWING_RIGHT_ANGLE
|
||||
pivot.localEulerAngles = Vector3(0, 0, fromAngle)
|
||||
local realAngle = math.abs(toAngle - fromAngle)
|
||||
local realDuration = realAngle / 1.0 / math.abs(self.HOOK_SWING_RIGHT_ANGLE * 2) * self.HOOK_SWING_DURATION
|
||||
if self._swingTweener ~= nil then
|
||||
self._swingTweener:Kill()
|
||||
self._swingTweener = nil
|
||||
end
|
||||
self._swingTweener = pivot:DOLocalRotate(Vector3(0, 0, toAngle), realDuration, RotateMode.Fast):SetEase(self.HOOK_SWING_EASE):SetUpdate(true):OnComplete(function()
|
||||
onPhaseComplete()
|
||||
end)
|
||||
end
|
||||
function GoldenSpyHookCtrl:_ChainSwing()
|
||||
local pivot = self._mapNode.trHookPivot
|
||||
if pivot == nil then
|
||||
return
|
||||
end
|
||||
local leftAngle = self.HOOK_SWING_LEFT_ANGLE
|
||||
local rightAngle = self.HOOK_SWING_RIGHT_ANGLE
|
||||
if self._swingAtRight then
|
||||
self._swingGoingRight = false
|
||||
self:_DoSwingPhase(rightAngle, leftAngle, function()
|
||||
self._swingAtRight = false
|
||||
self:_ChainSwing()
|
||||
end)
|
||||
else
|
||||
self._swingGoingRight = true
|
||||
self:_DoSwingPhase(leftAngle, rightAngle, function()
|
||||
self._swingAtRight = true
|
||||
self:_ChainSwing()
|
||||
end)
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:StartSwing(leftAngle, rightAngle)
|
||||
if self._hookState == HookStage.STATE_EXTENDING or self._hookState == HookStage.STATE_RETRACTING then
|
||||
return
|
||||
end
|
||||
self:StopSwing()
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
self._mapNode.hook_open:SetActive(false)
|
||||
self._mapNode.hook_normal:SetActive(true)
|
||||
self._mapNode.hook_catched:SetActive(false)
|
||||
local pivot = self._mapNode.trHookPivot
|
||||
if pivot == nil then
|
||||
return
|
||||
end
|
||||
self._hookLength = 0
|
||||
self:ApplyHookLength()
|
||||
self._hookState = HookStage.STATE_SWINGING
|
||||
leftAngle = leftAngle or self.HOOK_SWING_LEFT_ANGLE
|
||||
rightAngle = rightAngle or self.HOOK_SWING_RIGHT_ANGLE
|
||||
self._swingAtRight = false
|
||||
self._swingGoingRight = true
|
||||
self:_DoSwingPhase(0, rightAngle, function()
|
||||
self._swingAtRight = true
|
||||
self:_ChainSwing()
|
||||
end)
|
||||
EventManager.Hit("GoldenSpyHookResumeSwing")
|
||||
end
|
||||
function GoldenSpyHookCtrl:PauseSwing()
|
||||
self:StopSwing()
|
||||
if self._hookState == HookStage.STATE_SWINGING then
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:ResumeSwing(fromCurrent)
|
||||
local pivot = self._mapNode.trHookPivot
|
||||
if pivot == nil then
|
||||
return
|
||||
end
|
||||
local leftAngle = self.HOOK_SWING_LEFT_ANGLE
|
||||
local rightAngle = self.HOOK_SWING_RIGHT_ANGLE
|
||||
if fromCurrent then
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
self:StopSwing()
|
||||
local curZ = self:_NormalizeAngleZ(pivot.localEulerAngles.z)
|
||||
if self._swingGoingRight then
|
||||
self._swingAtRight = false
|
||||
self._swingGoingRight = true
|
||||
self:_DoSwingPhase(curZ, rightAngle, function()
|
||||
self._swingAtRight = true
|
||||
self:_ChainSwing()
|
||||
end)
|
||||
else
|
||||
self._swingAtRight = true
|
||||
self._swingGoingRight = false
|
||||
self:_DoSwingPhase(curZ, leftAngle, function()
|
||||
self._swingAtRight = false
|
||||
self:_ChainSwing()
|
||||
end)
|
||||
end
|
||||
else
|
||||
self:StartSwing()
|
||||
return
|
||||
end
|
||||
self._hookState = HookStage.STATE_SWINGING
|
||||
EventManager.Hit("GoldenSpyHookResumeSwing")
|
||||
end
|
||||
function GoldenSpyHookCtrl:_NormalizeAngleZ(z)
|
||||
while 180 < z do
|
||||
z = z - 360
|
||||
end
|
||||
while z < -180 do
|
||||
z = z + 360
|
||||
end
|
||||
return z
|
||||
end
|
||||
function GoldenSpyHookCtrl:StopSwing()
|
||||
if self._swingTweener ~= nil then
|
||||
self._swingTweener:Kill()
|
||||
self._swingTweener = nil
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:StartExtend(speed, radius, factor, onComplete, onCatched, onCatchedComplete)
|
||||
self:StopSwing()
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
EventManager.Hit("GoldenSpyHookStartExtend")
|
||||
local tr = self._mapNode.trHookEnd
|
||||
if tr == nil then
|
||||
return
|
||||
end
|
||||
local maxLength = self:GetCurrentMaxLength()
|
||||
self._onExtendComplete = onComplete
|
||||
self._hookState = HookStage.STATE_EXTENDING
|
||||
local fromLen = self._hookLength
|
||||
local duration = (maxLength - fromLen) / speed
|
||||
if duration <= 0 then
|
||||
self._hookLength = maxLength
|
||||
self:ApplyHookLength()
|
||||
self._hookState = 0
|
||||
if self._onExtendComplete then
|
||||
self._onExtendComplete()
|
||||
self._onExtendComplete = nil
|
||||
end
|
||||
return
|
||||
end
|
||||
self._mapNode.hook_open:SetActive(true)
|
||||
self._mapNode.hook_normal:SetActive(false)
|
||||
self._mapNode.hook_catched:SetActive(false)
|
||||
self._extendTweener = DOTween.To(function()
|
||||
return self._hookLength
|
||||
end, function(v)
|
||||
self._hookLength = v
|
||||
self:ApplyHookLength()
|
||||
local items = self.floorCtrl.tbItem
|
||||
for _, item in ipairs(items) do
|
||||
local worldPos = self:GetHookEndWorldPosition()
|
||||
if self:CheckCatchIntersect(worldPos, radius, item.Ctrl) then
|
||||
if onCatched then
|
||||
onCatched(item.Ctrl)
|
||||
end
|
||||
local itemCfg = item.Ctrl:GetItemCfg()
|
||||
if itemCfg.ItemType == GameEnum.GoldenSpyItem.Boom then
|
||||
item.Ctrl:Boom(nil)
|
||||
self:StartRetract(speed, function()
|
||||
self:ResumeSwing(true)
|
||||
if onCatchedComplete then
|
||||
onCatchedComplete(item.Ctrl)
|
||||
end
|
||||
end)
|
||||
return
|
||||
end
|
||||
self.curCatchedItem = item.Ctrl
|
||||
if itemCfg.ItemType == GameEnum.GoldenSpyItem.Companion or itemCfg.ItemType == GameEnum.GoldenSpyItem.Patrol then
|
||||
item.Ctrl:onCatch()
|
||||
end
|
||||
self.curCatchedItem.gameObject.transform:SetParent(self._mapNode.itemParent)
|
||||
self.curCatchedItem.gameObject.transform.localPosition = Vector3.zero
|
||||
local itemNormalWeight = item.Ctrl:GetWeight()
|
||||
for _, v in ipairs(self:GetBuffData()) do
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
|
||||
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.ReduceItemWeight then
|
||||
local curFloor = self.levelData:GetCurFloor()
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, curFloor) > 0 and itemCfg.ItemType == buffCfg.Params[1] then
|
||||
itemNormalWeight = itemNormalWeight - buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, curFloor) > 0 and itemCfg.ItemType == buffCfg.Params[1] then
|
||||
itemNormalWeight = itemNormalWeight - buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if v.bActive and itemCfg.ItemType == buffCfg.Params[1] then
|
||||
itemNormalWeight = itemNormalWeight - buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
end
|
||||
end
|
||||
itemNormalWeight = math.max(0, itemNormalWeight)
|
||||
local nbackSpeed = speed + factor * itemNormalWeight
|
||||
if NovaAPI.IsEditorPlatform() then
|
||||
print("GoldenSpyLevelCtrl:backSpeed=", nbackSpeed)
|
||||
end
|
||||
self:StartRetract(nbackSpeed, function()
|
||||
self._mapNode.hook_open:SetActive(false)
|
||||
self._mapNode.hook_normal:SetActive(true)
|
||||
self._mapNode.hook_catched:SetActive(false)
|
||||
if onCatchedComplete then
|
||||
onCatchedComplete(self.curCatchedItem)
|
||||
end
|
||||
self.curCatchedItem.gameObject:SetActive(false)
|
||||
self.curCatchedItem = nil
|
||||
end)
|
||||
self:StopExtend()
|
||||
break
|
||||
end
|
||||
end
|
||||
end, maxLength, duration):SetEase(self.HOOK_EXTEND_EASE):SetUpdate(true):OnComplete(function()
|
||||
self._extendTweener = nil
|
||||
self._hookState = 0
|
||||
self:StartRetract(speed, function()
|
||||
self:ResumeSwing(true)
|
||||
if onCatchedComplete then
|
||||
onCatchedComplete(self.curCatchedItem)
|
||||
end
|
||||
self.curCatchedItem = nil
|
||||
end)
|
||||
if self._onExtendComplete then
|
||||
self._onExtendComplete()
|
||||
self._onExtendComplete = nil
|
||||
end
|
||||
end)
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetHookEndWorldPosition()
|
||||
local rootTr = self.gameObject.transform
|
||||
local trEnd = self._mapNode.trHookEnd
|
||||
local localPt = rootTr:InverseTransformPoint(trEnd.position)
|
||||
return Vector3(localPt.x, localPt.y, 0)
|
||||
end
|
||||
function GoldenSpyHookCtrl:StopExtend()
|
||||
if self._extendTweener ~= nil then
|
||||
self._extendTweener:Kill()
|
||||
self._extendTweener = nil
|
||||
end
|
||||
if self._hookState == HookStage.STATE_EXTENDING then
|
||||
self._hookState = 0
|
||||
end
|
||||
self._onExtendComplete = nil
|
||||
end
|
||||
function GoldenSpyHookCtrl:PauseExtend()
|
||||
if self._extendTweener ~= nil then
|
||||
self._extendTweener:Pause()
|
||||
end
|
||||
if self._hookState == HookStage.STATE_EXTENDING then
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:ResumeExtend()
|
||||
if self._extendTweener ~= nil then
|
||||
self._extendTweener:Play()
|
||||
end
|
||||
if self._hookState == HookStage.STATE_EXTENDING then
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:StartRetract(speed, onComplete)
|
||||
self:StopSwing()
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
local tr = self._mapNode.trHookEnd
|
||||
if tr == nil then
|
||||
if onComplete then
|
||||
onComplete()
|
||||
end
|
||||
return
|
||||
end
|
||||
self._mapNode.hook_open:SetActive(false)
|
||||
self._mapNode.hook_normal:SetActive(false)
|
||||
self._mapNode.hook_catched:SetActive(true)
|
||||
self._onRetractComplete = onComplete
|
||||
self._hookState = HookStage.STATE_RETRACTING
|
||||
local fromLen = self._hookLength
|
||||
local duration = fromLen / speed
|
||||
if duration <= 0 then
|
||||
self._hookLength = 0
|
||||
self:ApplyHookLength()
|
||||
self._hookState = 0
|
||||
if self._onRetractComplete then
|
||||
self._onRetractComplete()
|
||||
self._onRetractComplete = nil
|
||||
end
|
||||
return
|
||||
end
|
||||
self._retractTweener = DOTween.To(function()
|
||||
return self._hookLength
|
||||
end, function(v)
|
||||
self._hookLength = v
|
||||
self:ApplyHookLength()
|
||||
end, 0, duration):SetEase(self.HOOK_RETRACT_EASE):SetUpdate(true):OnComplete(function()
|
||||
self._retractTweener = nil
|
||||
self._hookState = 0
|
||||
if self._onRetractComplete then
|
||||
self._onRetractComplete()
|
||||
self._onRetractComplete = nil
|
||||
end
|
||||
end):OnKill(function()
|
||||
self._retractTweener = nil
|
||||
if self._hookState == HookStage.STATE_RETRACTING then
|
||||
self._hookState = 0
|
||||
end
|
||||
end)
|
||||
end
|
||||
function GoldenSpyHookCtrl:StopRetract()
|
||||
if self._retractTweener ~= nil then
|
||||
self._retractTweener:Kill()
|
||||
self._retractTweener = nil
|
||||
end
|
||||
if self._hookState == HookStage.STATE_RETRACTING then
|
||||
self._hookState = 0
|
||||
end
|
||||
self._onRetractComplete = nil
|
||||
end
|
||||
function GoldenSpyHookCtrl:SetRetractSpeed(newSpeed)
|
||||
if not self:IsRetracting() then
|
||||
return
|
||||
end
|
||||
local onComplete = self._onRetractComplete
|
||||
self:StopRetract()
|
||||
self:StartRetract(newSpeed, onComplete)
|
||||
end
|
||||
function GoldenSpyHookCtrl:PauseRetract()
|
||||
if self._retractTweener ~= nil then
|
||||
self._retractTweener:Pause()
|
||||
end
|
||||
if self._hookState == HookStage.STATE_RETRACTING then
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:ResumeRetract()
|
||||
if self._retractTweener ~= nil then
|
||||
self._retractTweener:Play()
|
||||
end
|
||||
if self._hookState == HookStage.STATE_RETRACTING then
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetHookAngle()
|
||||
local pivot = self._mapNode.trHookPivot
|
||||
if pivot == nil then
|
||||
return 0
|
||||
end
|
||||
return pivot.localEulerAngles.z
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetMaxLengthForAngle(angleDeg)
|
||||
local rect = self._mapNode.rtMaxLengthArea
|
||||
local trLine = self._mapNode.trLine
|
||||
if rect == nil or rect:IsNull() or trLine == nil or trLine:IsNull() then
|
||||
return 0
|
||||
end
|
||||
local lineLocalPos = rect:InverseTransformPoint(trLine.position)
|
||||
local sx, sy = lineLocalPos.x, lineLocalPos.y
|
||||
local left = 0
|
||||
local bottom = 0
|
||||
local right = rect.sizeDelta.x
|
||||
local top = rect.sizeDelta.y
|
||||
local rad = math.rad(angleDeg)
|
||||
local worldDir = Vector3(math.sin(rad), -math.cos(rad), 0)
|
||||
local localDir = rect:InverseTransformDirection(worldDir)
|
||||
local dx, dy = localDir.x, localDir.y
|
||||
local lenSq = dx * dx + dy * dy
|
||||
if lenSq < 1.0E-12 then
|
||||
return 0
|
||||
end
|
||||
local invLen = 1 / math.sqrt(lenSq)
|
||||
dx, dy = dx * invLen, dy * invLen
|
||||
local tMin
|
||||
if math.abs(dx) > 1.0E-6 then
|
||||
local tL = (left - sx) / dx
|
||||
if 0 < tL then
|
||||
local y = sy + tL * dy
|
||||
if bottom <= y and top >= y then
|
||||
tMin = tMin == nil and tL or math.min(tMin, tL)
|
||||
end
|
||||
end
|
||||
local tR = (right - sx) / dx
|
||||
if 0 < tR then
|
||||
local y = sy + tR * dy
|
||||
if bottom <= y and top >= y then
|
||||
tMin = tMin == nil and tR or math.min(tMin, tR)
|
||||
end
|
||||
end
|
||||
end
|
||||
if math.abs(dy) > 1.0E-6 then
|
||||
local tB = (bottom - sy) / dy
|
||||
if 0 < tB then
|
||||
local x = sx + tB * dx
|
||||
if left <= x and right >= x then
|
||||
tMin = tMin == nil and tB or math.min(tMin, tB)
|
||||
end
|
||||
end
|
||||
local tT = (top - sy) / dy
|
||||
if 0 < tT then
|
||||
local x = sx + tT * dx
|
||||
if left <= x and right >= x then
|
||||
tMin = tMin == nil and tT or math.min(tMin, tT)
|
||||
end
|
||||
end
|
||||
end
|
||||
return math.max(0, tMin or 0)
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetCurrentMaxLength()
|
||||
return self:GetMaxLengthForAngle(self:GetHookAngle())
|
||||
end
|
||||
function GoldenSpyHookCtrl:_CircleCircleIntersect(hx, hy, hookR, ix, iy, itemR)
|
||||
local dx, dy = ix - hx, iy - hy
|
||||
local dist2 = dx * dx + dy * dy
|
||||
local sumR = hookR + (itemR or 0)
|
||||
return dist2 <= sumR * sumR
|
||||
end
|
||||
function GoldenSpyHookCtrl:_CircleRectIntersect(hx, hy, hookR, cx, cy, width, height)
|
||||
local hw = (width or 0) * 0.5
|
||||
local hh = (height or 0) * 0.5
|
||||
local px = hx
|
||||
if px < cx - hw then
|
||||
px = cx - hw
|
||||
elseif px > cx + hw then
|
||||
px = cx + hw
|
||||
end
|
||||
local py = hy
|
||||
if py < cy - hh then
|
||||
py = cy - hh
|
||||
elseif py > cy + hh then
|
||||
py = cy + hh
|
||||
end
|
||||
local dx, dy = hx - px, hy - py
|
||||
local dist2 = dx * dx + dy * dy
|
||||
return dist2 <= hookR * hookR
|
||||
end
|
||||
function GoldenSpyHookCtrl:CheckCatchIntersect(hookWorldPos, hookRadius, item)
|
||||
if hookWorldPos == nil or not item then
|
||||
return false
|
||||
end
|
||||
local hx, hy = hookWorldPos.x, hookWorldPos.y
|
||||
local hitArea = item:GetHitArea()
|
||||
local ix, iy = hitArea.center.x, hitArea.center.y
|
||||
if hitArea.nType == AllEnum.GoldenSpyHitAreaType.Circle then
|
||||
return self:_CircleCircleIntersect(hx, hy, hookRadius, ix, iy, (hitArea.width or 0) / 2)
|
||||
elseif hitArea.nType == AllEnum.GoldenSpyHitAreaType.Rectangle then
|
||||
return self:_CircleRectIntersect(hx, hy, hookRadius, ix, iy, hitArea.width or 0, hitArea.height or 0)
|
||||
end
|
||||
return self:_CircleCircleIntersect(hx, hy, hookRadius, ix, iy, item.radius or 0)
|
||||
end
|
||||
function GoldenSpyHookCtrl:CheckCatchInRadius(hookWorldPos, radius, items)
|
||||
if not (hookWorldPos ~= nil and items) or #items == 0 then
|
||||
return nil
|
||||
end
|
||||
for i = 1, #items do
|
||||
local item = items[i]
|
||||
if self:CheckCatchIntersect(hookWorldPos, radius, item) then
|
||||
return item
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetHookLength()
|
||||
return self._hookLength
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetState()
|
||||
return self._hookState
|
||||
end
|
||||
function GoldenSpyHookCtrl:IsSwinging()
|
||||
return self._hookState == HookStage.STATE_SWINGING
|
||||
end
|
||||
function GoldenSpyHookCtrl:IsExtending()
|
||||
return self._hookState == HookStage.STATE_EXTENDING
|
||||
end
|
||||
function GoldenSpyHookCtrl:IsRetracting()
|
||||
return self._hookState == HookStage.STATE_RETRACTING
|
||||
end
|
||||
function GoldenSpyHookCtrl:DropItem()
|
||||
self.curCatchedItem = nil
|
||||
end
|
||||
function GoldenSpyHookCtrl:OnDestroy()
|
||||
self:StopSwing()
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
end
|
||||
function GoldenSpyHookCtrl:GetBuffData()
|
||||
return self.levelData:GetBuffData()
|
||||
end
|
||||
function GoldenSpyHookCtrl:Pause()
|
||||
if self:IsSwinging() then
|
||||
self:PauseSwing()
|
||||
end
|
||||
if self:IsExtending() then
|
||||
self:PauseExtend()
|
||||
end
|
||||
if self:IsRetracting() then
|
||||
self:PauseRetract()
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:Continue()
|
||||
if self:IsSwinging() then
|
||||
self:ResumeSwing(true)
|
||||
end
|
||||
if self:IsExtending() then
|
||||
self:ResumeExtend()
|
||||
end
|
||||
if self:IsRetracting() then
|
||||
self:ResumeRetract()
|
||||
end
|
||||
end
|
||||
function GoldenSpyHookCtrl:Exit()
|
||||
self:StopSwing()
|
||||
self:StopExtend()
|
||||
self:StopRetract()
|
||||
end
|
||||
return GoldenSpyHookCtrl
|
||||
@@ -0,0 +1,236 @@
|
||||
local GoldenSpyBaseTrap = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseTrap")
|
||||
local GoldenSpyLaserTrap = class("GoldenSpyLaserTrap", GoldenSpyBaseTrap)
|
||||
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
||||
local LoopType = CS.DG.Tweening.LoopType
|
||||
local Ease = CS.DG.Tweening.Ease.Linear
|
||||
GoldenSpyLaserTrap._mapNodeConfig = {
|
||||
TriggerArea = {
|
||||
sNodeName = "TriggerArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
trRotatePivot = {
|
||||
sNodeName = "RotatePivot",
|
||||
sComponentName = "Transform"
|
||||
},
|
||||
imgIce = {},
|
||||
IceRoot = {
|
||||
sComponentName = "RectTransform"
|
||||
}
|
||||
}
|
||||
GoldenSpyLaserTrap._mapEventConfig = {
|
||||
GoldenSpyHookStartExtend = "OnEvent_GoldenSpyHookStartExtend",
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyLaserTrap._mapRedDotConfig = {}
|
||||
GoldenSpyLaserTrap.LASER_ROTATE_EASE = "Linear"
|
||||
GoldenSpyLaserTrap.TRIGGER_CHECK_INTERVAL = 0.03
|
||||
function GoldenSpyLaserTrap:Awake()
|
||||
self._rotateTweener = nil
|
||||
self._triggerTimer = nil
|
||||
self._lastLaserAngle = nil
|
||||
self._rotateHeadingToMax = nil
|
||||
self.bTrigger = true
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnEnable()
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnDisable()
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnDestroy()
|
||||
self:_StopRotate()
|
||||
self:_StopTriggerCheck()
|
||||
end
|
||||
function GoldenSpyLaserTrap:InitData()
|
||||
self.LASER_ANGLE_MIN = self.trapCfg.Params[1]
|
||||
self.LASER_ANGLE_MAX = self.trapCfg.Params[2]
|
||||
self.LASER_ROTATE_DURATION = self.trapCfg.Params[3]
|
||||
self.SUBTIME = self.trapCfg.Params[4]
|
||||
end
|
||||
function GoldenSpyLaserTrap:GetTriggerArea()
|
||||
local rt = self._mapNode.TriggerArea
|
||||
if rt == nil or rt:IsNull() then
|
||||
return {}
|
||||
end
|
||||
return {
|
||||
nType = AllEnum.GoldenSpyHitAreaType.Rectangle,
|
||||
center = rt.position,
|
||||
width = rt.sizeDelta.x,
|
||||
height = rt.sizeDelta.y
|
||||
}
|
||||
end
|
||||
function GoldenSpyLaserTrap:FinishFloor()
|
||||
self:_StopRotate()
|
||||
self:_StopTriggerCheck()
|
||||
end
|
||||
function GoldenSpyLaserTrap:_StartRotate()
|
||||
self:_StopRotate()
|
||||
local pivot = self._mapNode.trRotatePivot
|
||||
if pivot == nil or pivot:IsNull() then
|
||||
pivot = self.transform
|
||||
end
|
||||
if pivot == nil then
|
||||
return
|
||||
end
|
||||
local angleMin = self.LASER_ANGLE_MIN or -90
|
||||
local angleMax = self.LASER_ANGLE_MAX or 90
|
||||
local duration = self.LASER_ROTATE_DURATION or 3
|
||||
local fullRange = math.max(0.001, angleMax - angleMin)
|
||||
local tweenAngleMin = angleMin
|
||||
local tweenAngleMax = angleMax
|
||||
if 0.001 > math.abs(fullRange - 180) then
|
||||
tweenAngleMax = angleMax - 0.01
|
||||
end
|
||||
local currentZ = pivot.localEulerAngles.z
|
||||
if 180 < currentZ then
|
||||
currentZ = currentZ - 360
|
||||
end
|
||||
self._lastLaserAngle = currentZ
|
||||
local RotateMode = CS.DG.Tweening.RotateMode.Fast
|
||||
local headingToMax = self._rotateHeadingToMax ~= false
|
||||
if currentZ >= angleMax - 0.01 then
|
||||
self._rotateHeadingToMax = false
|
||||
self._rotateTweener = pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMin), duration, RotateMode):SetEase(Ease):SetLoops(-1, LoopType.Yoyo):SetUpdate(true)
|
||||
elseif currentZ <= angleMin + 0.01 then
|
||||
self._rotateHeadingToMax = true
|
||||
self._rotateTweener = pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMax), duration, RotateMode):SetEase(Ease):SetLoops(-1, LoopType.Yoyo):SetUpdate(true)
|
||||
elseif headingToMax then
|
||||
self._rotateHeadingToMax = true
|
||||
local ratio = math.abs(angleMax - currentZ) / fullRange
|
||||
local durationFirst = duration * math.max(0.01, ratio)
|
||||
local seq = DOTween.Sequence()
|
||||
seq:SetUpdate(true)
|
||||
seq:Append(pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMax), durationFirst, RotateMode):SetEase(Ease))
|
||||
seq:Append(pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMin), duration, RotateMode):SetEase(Ease):SetLoops(-1, LoopType.Yoyo))
|
||||
self._rotateTweener = seq
|
||||
else
|
||||
self._rotateHeadingToMax = false
|
||||
local ratio = math.abs(currentZ - angleMin) / fullRange
|
||||
local durationFirst = duration * math.max(0.01, ratio)
|
||||
local seq = DOTween.Sequence()
|
||||
seq:SetUpdate(true)
|
||||
seq:Append(pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMin), durationFirst, RotateMode):SetEase(Ease))
|
||||
seq:Append(pivot:DOLocalRotate(Vector3(0, 0, tweenAngleMax), duration, RotateMode):SetEase(Ease):SetLoops(-1, LoopType.Yoyo))
|
||||
self._rotateTweener = seq
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:_StopRotate()
|
||||
if self._rotateTweener ~= nil then
|
||||
self._rotateTweener:Kill()
|
||||
self._rotateTweener = nil
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:_IsHookInTriggerArea(hookPos, hookRadius)
|
||||
if hookPos == nil then
|
||||
return false
|
||||
end
|
||||
local rt = self._mapNode.TriggerArea
|
||||
if rt == nil or rt:IsNull() then
|
||||
return false
|
||||
end
|
||||
local radius = hookRadius ~= nil and hookRadius or self.HOOK_TRIGGER_RADIUS_DEFAULT or 0
|
||||
local w = rt.sizeDelta.x
|
||||
local h = rt.sizeDelta.y
|
||||
local hw = w * 0.5
|
||||
local hh = h * 0.5
|
||||
local x, y = hookPos.x, hookPos.y
|
||||
local dx = math.max(0, math.abs(x) - hw)
|
||||
local dy = math.max(0, math.abs(y) - hh)
|
||||
local distSq = dx * dx + dy * dy
|
||||
return distSq <= radius * radius
|
||||
end
|
||||
function GoldenSpyLaserTrap:_OnTriggerCheck()
|
||||
local pivot = self._mapNode.trRotatePivot
|
||||
if pivot == nil or pivot:IsNull() then
|
||||
pivot = self.transform
|
||||
end
|
||||
if pivot ~= nil then
|
||||
local z = pivot.localEulerAngles.z
|
||||
if 180 < z then
|
||||
z = z - 360
|
||||
end
|
||||
if self._lastLaserAngle ~= nil then
|
||||
if z > self._lastLaserAngle then
|
||||
self._rotateHeadingToMax = true
|
||||
elseif z < self._lastLaserAngle then
|
||||
self._rotateHeadingToMax = false
|
||||
end
|
||||
end
|
||||
self._lastLaserAngle = z
|
||||
end
|
||||
local bInvincible = self.floorCtrl:GetHookIsInvincible()
|
||||
if bInvincible then
|
||||
return
|
||||
end
|
||||
local hookPos = self.floorCtrl:GetHookEndPos()
|
||||
local localPos = self.floorCtrl:GetHookEndPosInRectLocal(self._mapNode.TriggerArea)
|
||||
local hookRadius = self.floorCtrl:GetHookRadius()
|
||||
if self:_IsHookInTriggerArea(localPos, hookRadius) and self.bTrigger then
|
||||
self.floorCtrl:DropItem()
|
||||
WwiseAudioMgr:PostEvent("Mode_steal_error")
|
||||
self.floorCtrl:DoStartRetract()
|
||||
self.floorCtrl:SubTime(self.SUBTIME)
|
||||
self.bTrigger = false
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:_StartTriggerCheck()
|
||||
self:_StopTriggerCheck()
|
||||
local interval = self.TRIGGER_CHECK_INTERVAL or 0.03
|
||||
self._triggerTimer = self:AddTimer(0, interval, function()
|
||||
self:_OnTriggerCheck()
|
||||
end, true, true, true)
|
||||
end
|
||||
function GoldenSpyLaserTrap:_StopTriggerCheck()
|
||||
if self._triggerTimer ~= nil then
|
||||
self._triggerTimer:Cancel()
|
||||
self._triggerTimer = nil
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:StartFloor()
|
||||
self:_StartRotate()
|
||||
self:_StartTriggerCheck()
|
||||
end
|
||||
function GoldenSpyLaserTrap:Pause()
|
||||
self:_StopRotate()
|
||||
self:_StopTriggerCheck()
|
||||
end
|
||||
function GoldenSpyLaserTrap:Resume()
|
||||
if self.bFrozen then
|
||||
return
|
||||
end
|
||||
self:_StartRotate()
|
||||
self:_StartTriggerCheck()
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnSkill_Frozen(callback)
|
||||
self.bFrozen = true
|
||||
self:_StopRotate()
|
||||
self:_StopTriggerCheck()
|
||||
self._mapNode.imgIce:SetActive(true)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnSkill_Frozen_Resume(callback)
|
||||
self.bFrozen = false
|
||||
self:_StartRotate()
|
||||
self:_StartTriggerCheck()
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self:AddTimer(1, 0.5, function()
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
end, true, true, true)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnBtnClick_AAA()
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnEvent_GoldenSpyHookStartExtend()
|
||||
self.bTrigger = true
|
||||
end
|
||||
function GoldenSpyLaserTrap:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.TriggerArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyLaserTrap
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,360 @@
|
||||
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.nLevelType = nil
|
||||
self.tbRandomPrefabName = {}
|
||||
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
|
||||
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)
|
||||
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 then
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, self.nCurFloor) > 0 then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if v.bActive and table.indexof(v.tbActiveFloor, self.nCurFloor) > 0 then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if v.bActive then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
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 then
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if v.bActive and 0 < table.indexof(v.tbActiveFloor, self.nCurFloor) then
|
||||
nExWeight = nExWeight + buffCfg.Params[1]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if v.bActive and 0 < table.indexof(v.tbActiveFloor, self.nCurFloor) then
|
||||
nExWeight = nExWeight + buffCfg.Params[1]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if v.bActive then
|
||||
nExWeight = nExWeight + buffCfg.Params[1]
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
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 then
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if v.bActive and 0 < table.indexof(v.tbActiveFloor, self.nCurFloor) then
|
||||
nScore = nScore * (1 + buffCfg.Params[1] / 100.0)
|
||||
nScore = math.floor(nScore)
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if v.bActive and 0 < table.indexof(v.tbActiveFloor, self.nCurFloor) then
|
||||
nScore = nScore * (1 + buffCfg.Params[1] / 100.0)
|
||||
nScore = math.floor(nScore)
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if v.bActive then
|
||||
nScore = nScore * (1 + buffCfg.Params[1] / 100.0)
|
||||
nScore = math.floor(nScore)
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
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]] + buffCfg.Params[2]
|
||||
EventManager.Hit("GoldenSpy_UpdateSkillCount", buffCfg.Params[1], self.tbSkillData[buffCfg.Params[1]])
|
||||
end
|
||||
end
|
||||
table.insert(self.tbBuff, buffEntity)
|
||||
if self.taskData ~= nil and self.taskData.nScore > 0 and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddExScoreFactor then
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if buffEntity.bActive and 0 < table.indexof(buffEntity.tbActiveFloor, self.nCurFloor) 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
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if buffEntity.bActive and 0 < table.indexof(buffEntity.tbActiveFloor, self.nCurFloor) 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
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if buffEntity.bActive 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
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
end
|
||||
if buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore then
|
||||
EventManager.Hit("GoldenSpy_ItemUpdateScore", self.tbBuff)
|
||||
end
|
||||
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
|
||||
@@ -0,0 +1,28 @@
|
||||
local GoldenSpyLevelPanel = class("GoldenSpyLevelPanel", BasePanel)
|
||||
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
||||
GoldenSpyLevelPanel._bIsMainPanel = true
|
||||
GoldenSpyLevelPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
|
||||
GoldenSpyLevelPanel._sUIResRootPath = "UI_Activity/"
|
||||
GoldenSpyLevelPanel._tbDefine = {
|
||||
{
|
||||
sPrefabPath = "_400008/GoldenSpyPanel.prefab",
|
||||
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyLevelCtrl"
|
||||
}
|
||||
}
|
||||
function GoldenSpyLevelPanel:Awake()
|
||||
PlayerData.Base:SetSkipNewDayWindow(true)
|
||||
self.bFirstInCtrl = true
|
||||
end
|
||||
function GoldenSpyLevelPanel:OnEnable()
|
||||
end
|
||||
function GoldenSpyLevelPanel:OnAfterEnter()
|
||||
end
|
||||
function GoldenSpyLevelPanel:OnDisable()
|
||||
end
|
||||
function GoldenSpyLevelPanel:OnDestroy()
|
||||
PlayerData.Base:SetSkipNewDayWindow(false)
|
||||
PlayerData.Base:OnBackToMainMenuModule()
|
||||
end
|
||||
function GoldenSpyLevelPanel:OnRelease()
|
||||
end
|
||||
return GoldenSpyLevelPanel
|
||||
@@ -0,0 +1,343 @@
|
||||
local GoldenSpyLevelSelectCtrl = class("GoldenSpyLevelSelectCtrl", BaseCtrl)
|
||||
local UIAssetPath = "UI_Activity/_400008/SpriteAtlas/"
|
||||
local PanelTab = {Group = 1, Level = 2}
|
||||
local GroupState = {
|
||||
Normal = 1,
|
||||
LockByTime = 2,
|
||||
LockByPreGroup = 3
|
||||
}
|
||||
GoldenSpyLevelSelectCtrl._mapNodeConfig = {
|
||||
TopBar = {
|
||||
sNodeName = "TopBarPanel",
|
||||
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
|
||||
},
|
||||
GroupSelectRoot = {},
|
||||
btn_task = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Task"
|
||||
},
|
||||
txt_task = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_QuestTitle"
|
||||
},
|
||||
reddot_task = {},
|
||||
btn_Group = {
|
||||
nCount = 4,
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Group"
|
||||
},
|
||||
LevelDetalRoot = {},
|
||||
reward = {
|
||||
nCount = 2,
|
||||
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
|
||||
},
|
||||
btn_go = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Go"
|
||||
},
|
||||
txt_go = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Go"
|
||||
},
|
||||
img_Pass = {},
|
||||
go_lockTips = {},
|
||||
txt_lockTips = {sComponentName = "TMP_Text"},
|
||||
btn_level = {
|
||||
nCount = 2,
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Level"
|
||||
},
|
||||
img_select = {nCount = 2}
|
||||
}
|
||||
GoldenSpyLevelSelectCtrl._mapEventConfig = {
|
||||
[EventId.UIBackConfirm] = "OnEvent_BackHome",
|
||||
[EventId.UIHomeConfirm] = "OnEvent_Home"
|
||||
}
|
||||
GoldenSpyLevelSelectCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyLevelSelectCtrl:Awake()
|
||||
local param = self:GetPanelParam()
|
||||
if type(param) == "table" then
|
||||
self.nActivityId = param[1]
|
||||
end
|
||||
EventManager.Add(EventId.TemporaryBlockInput, 1.5)
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnEnable()
|
||||
self.animator = self.gameObject:GetComponent("Animator")
|
||||
local mapActivityData = ConfigTable.GetData("Activity", self.nActivityId)
|
||||
if mapActivityData ~= nil then
|
||||
local nGroupId = mapActivityData.MidGroupId
|
||||
local mapGroupData = PlayerData.Activity:GetActivityGroupDataById(nGroupId)
|
||||
if mapGroupData ~= nil then
|
||||
local actData = mapGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task)
|
||||
if actData ~= nil then
|
||||
RedDotManager.RegisterNode(RedDotDefine.Activity_Group_Task_Group, {
|
||||
nGroupId,
|
||||
actData.ActivityId,
|
||||
mapActivityData.MiniGameRedDot
|
||||
}, self._mapNode.reddot_task)
|
||||
else
|
||||
self._mapNode.reddot_task:SetActive(false)
|
||||
end
|
||||
else
|
||||
self._mapNode.reddot_task:SetActive(false)
|
||||
end
|
||||
else
|
||||
self._mapNode.reddot_task:SetActive(false)
|
||||
end
|
||||
if self._panel.nPanelTab == PanelTab.Level then
|
||||
local groupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId)
|
||||
for _, v in ipairs(groupCfg.LevelList) do
|
||||
local levelData = self.GoldenSpyActData:GetLevelDataById(v)
|
||||
if levelData ~= nil and not levelData.bFirstComplete then
|
||||
self._panel.nSelectLevelId = v
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
self:SwitchPanelTab(self._panel.nPanelTab)
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:SwitchPanelTab(nTab)
|
||||
local oldTab = self._panel.nPanelTab
|
||||
self._panel.nPanelTab = nTab
|
||||
if nTab == PanelTab.Group then
|
||||
if oldTab == PanelTab.Level then
|
||||
self.animator:Play("GoldenSpyLevelSelectPanel_idle")
|
||||
end
|
||||
self:InitGroupData()
|
||||
self._mapNode.GroupSelectRoot.gameObject:SetActive(true)
|
||||
self._mapNode.LevelDetalRoot.gameObject:SetActive(false)
|
||||
elseif nTab == PanelTab.Level then
|
||||
self.animator:Play("GoldenSpyLevelSelectPanel_switch")
|
||||
EventManager.Add(EventId.TemporaryBlockInput, 1.2)
|
||||
for i = 1, 2 do
|
||||
local levelCount = #ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId).LevelList
|
||||
self._mapNode.btn_level[i].gameObject:SetActive(i <= levelCount)
|
||||
self._mapNode.img_select[i].gameObject:SetActive(self._panel.nSelectLevelId == ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId).LevelList[i])
|
||||
end
|
||||
self:InitLevelData()
|
||||
self._mapNode.GroupSelectRoot.gameObject:SetActive(false)
|
||||
self._mapNode.LevelDetalRoot.gameObject:SetActive(true)
|
||||
end
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:InitGroupData()
|
||||
self.tbGroupStateList = {}
|
||||
self.GoldenSpyActData = PlayerData.Activity:GetActivityDataById(self.nActivityId)
|
||||
if self.GoldenSpyActData == nil then
|
||||
return
|
||||
end
|
||||
self.tbGroupIdList = ConfigTable.GetData("GoldenSpyControl", self.nActivityId).LevelGroupList
|
||||
for i, v in ipairs(self.tbGroupIdList) do
|
||||
local groupData = self.GoldenSpyActData:GetLevelGroupDataById(v)
|
||||
if groupData ~= nil then
|
||||
local groupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", v)
|
||||
if groupCfg ~= nil then
|
||||
local btn = self._mapNode.btn_Group[i]
|
||||
local normalRoot = btn.transform:Find("AnimRoot/normalRoot")
|
||||
local lockByTimeRoot = btn.transform:Find("AnimRoot/lockByTimeRoot")
|
||||
local lockByPreGroupRoot = btn.transform:Find("AnimRoot/lockByPreGroupRoot")
|
||||
normalRoot.gameObject:SetActive(false)
|
||||
lockByTimeRoot.gameObject:SetActive(false)
|
||||
lockByPreGroupRoot.gameObject:SetActive(false)
|
||||
if CS.ClientManager.Instance.serverTimeStamp < groupData.nStartTime and groupData.nStartTime ~= 0 then
|
||||
lockByTimeRoot.gameObject:SetActive(true)
|
||||
table.insert(self.tbGroupStateList, GroupState.LockByTime)
|
||||
elseif not self.GoldenSpyActData:CheckPreGroupPassByGroupId(v) then
|
||||
lockByPreGroupRoot.gameObject:SetActive(true)
|
||||
table.insert(self.tbGroupStateList, GroupState.LockByPreGroup)
|
||||
else
|
||||
normalRoot.gameObject:SetActive(true)
|
||||
table.insert(self.tbGroupStateList, GroupState.Normal)
|
||||
end
|
||||
local reddot = normalRoot.transform:Find("bg_GroupName/go_new")
|
||||
local actGroupId = ConfigTable.GetData("Activity", self.nActivityId).MidGroupId
|
||||
RedDotManager.RegisterNode(RedDotDefine.Activity_GoldenSpy_Group, {actGroupId, v}, reddot.gameObject)
|
||||
local bg = normalRoot.transform:Find("bg"):GetComponent("Image")
|
||||
local txt_GroupName = normalRoot.transform:Find("bg_GroupName/txt_GroupName"):GetComponent("TMP_Text")
|
||||
local tbPointList = {}
|
||||
for i = 1, 3 do
|
||||
local point = normalRoot.transform:Find("GameObject/point" .. i)
|
||||
point.gameObject:SetActive(false)
|
||||
local img_pass = point.transform:Find("img_pass")
|
||||
img_pass.gameObject:SetActive(false)
|
||||
table.insert(tbPointList, point)
|
||||
end
|
||||
self:SetPngSprite(bg, UIAssetPath .. groupCfg.IconPath)
|
||||
NovaAPI.SetTMPText(txt_GroupName, groupCfg.GroupName)
|
||||
for m, n in ipairs(groupCfg.LevelList) do
|
||||
local levelData = self.GoldenSpyActData:GetLevelDataById(n)
|
||||
if levelData ~= nil then
|
||||
tbPointList[m].gameObject:SetActive(true)
|
||||
local levelCfg = ConfigTable.GetData("GoldenSpyLevel", n)
|
||||
if not (levelData.nMaxScore < levelCfg.Score) then
|
||||
local img_pass = tbPointList[m].transform:Find("img_pass")
|
||||
img_pass.gameObject:SetActive(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
local bg_lock = lockByPreGroupRoot.transform:Find("bg"):GetComponent("Image")
|
||||
local txt_GroupName_Lock = lockByPreGroupRoot.transform:Find("bg_GroupName/txt_GroupName"):GetComponent("TMP_Text")
|
||||
local txt_lock = lockByPreGroupRoot.transform:Find("txt_lock"):GetComponent("TMP_Text")
|
||||
self:SetPngSprite(bg_lock, UIAssetPath .. groupCfg.IconPath)
|
||||
NovaAPI.SetTMPText(txt_GroupName_Lock, groupCfg.GroupName)
|
||||
local nIndex = table.indexof(self.tbGroupIdList, v)
|
||||
if 1 < nIndex then
|
||||
local preGroupId = self.tbGroupIdList[nIndex - 1]
|
||||
local preGroupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", preGroupId)
|
||||
NovaAPI.SetTMPText(txt_lock, orderedFormat(ConfigTable.GetUIText("GoldenSpy_LevelGroup_Lock_PreGroup"), preGroupCfg.GroupName))
|
||||
end
|
||||
local txt_time = lockByTimeRoot.transform:Find("txt_time"):GetComponent("TMP_Text")
|
||||
local nStartTime = self.GoldenSpyActData:GetGroupStartTime(v)
|
||||
local curTime = CS.ClientManager.Instance.serverTimeStamp
|
||||
if 0 < nStartTime then
|
||||
local remainTime = nStartTime - CS.ClientManager.Instance.serverTimeStamp
|
||||
local sTimeStr = self:GetTimeText(remainTime)
|
||||
NovaAPI.SetTMPText(txt_time, orderedFormat(ConfigTable.GetUIText("GoldenSpy_TimeTips") or "", sTimeStr))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:InitLevelData()
|
||||
local groupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId)
|
||||
if groupCfg == nil then
|
||||
return
|
||||
end
|
||||
local levelCfg = ConfigTable.GetData("GoldenSpyLevel", self._panel.nSelectLevelId)
|
||||
if levelCfg == nil then
|
||||
return
|
||||
end
|
||||
local levelData = self.GoldenSpyActData:GetLevelDataById(self._panel.nSelectLevelId)
|
||||
local levelRoot = self._mapNode.LevelDetalRoot
|
||||
local txt_GroupName = levelRoot.transform:Find("bg_GroupName/txt_GroupName"):GetComponent("TMP_Text")
|
||||
local img_level = levelRoot.transform:Find("img_level"):GetComponent("Image")
|
||||
local txt_levelName = levelRoot.transform:Find("AnimRoot/GameObject/txt_levelName"):GetComponent("TMP_Text")
|
||||
local txt_floorCount = levelRoot.transform:Find("AnimRoot/GameObject/db_floor/txt_floorCount"):GetComponent("TMP_Text")
|
||||
local txt_levelDes = levelRoot.transform:Find("AnimRoot/txt_levelDes"):GetComponent("TMP_Text")
|
||||
local title_score = levelRoot.transform:Find("AnimRoot/Image/title_score"):GetComponent("TMP_Text")
|
||||
local txt_score = levelRoot.transform:Find("AnimRoot/Image/txt_score"):GetComponent("TMP_Text")
|
||||
local txt_target = levelRoot.transform:Find("AnimRoot/db_reward/txt_target"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_GroupName, groupCfg.GroupName)
|
||||
self:SetPngSprite(img_level, UIAssetPath .. levelCfg.IconPath)
|
||||
NovaAPI.SetTMPText(txt_levelName, levelCfg.LevelName)
|
||||
local nTotalFloor = #levelCfg.FloorList
|
||||
NovaAPI.SetTMPText(txt_floorCount, orderedFormat(ConfigTable.GetUIText("GoldenSpy_TotalFloor"), nTotalFloor))
|
||||
NovaAPI.SetTMPText(txt_levelDes, levelCfg.LevelDesc)
|
||||
NovaAPI.SetTMPText(title_score, ConfigTable.GetUIText("GoldenSpy_HighestScoreTitle"))
|
||||
NovaAPI.SetTMPText(txt_score, orderedFormat(ConfigTable.GetUIText("GoldenSpy_HighestScore"), levelData.nMaxScore))
|
||||
NovaAPI.SetTMPText(txt_target, levelCfg.WinCondDesc)
|
||||
for i = 1, 2 do
|
||||
self._mapNode.reward[i]:SetItem(levelCfg["Item" .. i .. "Id"], nil, levelCfg["Item" .. i .. "Count"], nil, levelData.bFirstComplete, nil, nil, false)
|
||||
local btn_reward = self._mapNode.reward[i].gameObject:GetComponent("UIButton")
|
||||
btn_reward.onClick:RemoveAllListeners()
|
||||
local clickCb = function()
|
||||
UTILS.ClickItemGridWithTips(levelCfg["Item" .. i .. "Id"], btn_reward.transform, true, false, false)
|
||||
end
|
||||
btn_reward.onClick:AddListener(clickCb)
|
||||
end
|
||||
local bPreLevelPass = self.GoldenSpyActData:CheckPreLevelPassById(self._panel.nSelectLevelId)
|
||||
if bPreLevelPass then
|
||||
self._mapNode.btn_go.gameObject:SetActive(true)
|
||||
self._mapNode.go_lockTips.gameObject:SetActive(false)
|
||||
else
|
||||
self._mapNode.btn_go.gameObject:SetActive(false)
|
||||
local preLevelData = self.GoldenSpyActData:GetLevelDataById(levelCfg.PreLevelId)
|
||||
if preLevelData ~= nil then
|
||||
local preLevelCfg = ConfigTable.GetData("GoldenSpyLevel", levelCfg.PreLevelId)
|
||||
NovaAPI.SetTMPText(self._mapNode.txt_lockTips, orderedFormat(ConfigTable.GetUIText("GoldenSpy_LockTips"), preLevelCfg.LevelName))
|
||||
self._mapNode.go_lockTips.gameObject:SetActive(true)
|
||||
end
|
||||
end
|
||||
self._mapNode.img_Pass.gameObject:SetActive(levelData.bFirstComplete)
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:GetTimeText(remainTime)
|
||||
local sTimeStr = ""
|
||||
if remainTime <= 60 then
|
||||
local sec = math.floor(remainTime)
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
|
||||
elseif 60 < remainTime and remainTime <= 3600 then
|
||||
local min = math.floor(remainTime / 60)
|
||||
local sec = math.floor(remainTime - min * 60)
|
||||
if sec == 0 then
|
||||
min = min - 1
|
||||
sec = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
|
||||
elseif 3600 < remainTime and remainTime <= 86400 then
|
||||
local hour = math.floor(remainTime / 3600)
|
||||
local min = math.floor((remainTime - hour * 3600) / 60)
|
||||
if min == 0 then
|
||||
hour = hour - 1
|
||||
min = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
|
||||
elseif 86400 < remainTime then
|
||||
local day = math.floor(remainTime / 86400)
|
||||
local hour = math.floor((remainTime - day * 86400) / 3600)
|
||||
if hour == 0 then
|
||||
day = day - 1
|
||||
hour = 24
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
|
||||
end
|
||||
return sTimeStr
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnBtnClick_Task()
|
||||
local mapActivityData = ConfigTable.GetData("Activity", self.nActivityId)
|
||||
if mapActivityData ~= nil then
|
||||
local nGroupId = mapActivityData.MidGroupId
|
||||
local mapGroupData = PlayerData.Activity:GetActivityGroupDataById(nGroupId)
|
||||
if mapGroupData ~= nil then
|
||||
local actData = mapGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task)
|
||||
if actData ~= nil then
|
||||
EventManager.Hit(EventId.OpenPanel, PanelId.Task_20102, actData.ActivityId, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnBtnClick_Group(btn, nIndex)
|
||||
local groupState = self.tbGroupStateList[nIndex]
|
||||
if groupState ~= GroupState.Normal then
|
||||
return
|
||||
end
|
||||
self._panel.nSelectGroupId = self.tbGroupIdList[nIndex]
|
||||
local groupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId)
|
||||
local tempLevelId = groupCfg.LevelList[1]
|
||||
for _, v in ipairs(groupCfg.LevelList) do
|
||||
local levelData = self.GoldenSpyActData:GetLevelDataById(v)
|
||||
if levelData ~= nil then
|
||||
tempLevelId = v
|
||||
if not levelData.bFirstComplete then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
self._panel.nSelectLevelId = tempLevelId
|
||||
self:SwitchPanelTab(PanelTab.Level)
|
||||
self.GoldenSpyActData:EnterGroupSelect(self._panel.nSelectGroupId)
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnBtnClick_Level(btn, nIndex)
|
||||
for i = 1, 2 do
|
||||
self._mapNode.img_select[i].gameObject:SetActive(i == nIndex)
|
||||
end
|
||||
local groupCfg = ConfigTable.GetData("GoldenSpyLevelGroup", self._panel.nSelectGroupId)
|
||||
self._panel.nSelectLevelId = groupCfg.LevelList[nIndex]
|
||||
self:InitLevelData()
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnBtnClick_Go()
|
||||
self.GoldenSpyActData:StartLevel(self._panel.nSelectGroupId, self._panel.nSelectLevelId)
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnEvent_BackHome(nPanelId)
|
||||
if nPanelId == PanelId.GoldenSpyLevelSelectPanel then
|
||||
if self._panel.nPanelTab == PanelTab.Group then
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.GoldenSpyLevelSelectPanel)
|
||||
elseif self._panel.nPanelTab == PanelTab.Level then
|
||||
self:SwitchPanelTab(PanelTab.Group)
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyLevelSelectCtrl:OnEvent_Home(nPanelId)
|
||||
if nPanelId == PanelId.GoldenSpyLevelSelectPanel then
|
||||
PanelManager.Home()
|
||||
end
|
||||
end
|
||||
return GoldenSpyLevelSelectCtrl
|
||||
@@ -0,0 +1,28 @@
|
||||
local GoldenSpyLevelSelectPanel = class("GoldenSpyLevelSelectPanel", BasePanel)
|
||||
GoldenSpyLevelSelectPanel._bIsMainPanel = true
|
||||
GoldenSpyLevelSelectPanel._bAddToBackHistory = true
|
||||
GoldenSpyLevelSelectPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
|
||||
GoldenSpyLevelSelectPanel._sUIResRootPath = "UI_Activity/"
|
||||
GoldenSpyLevelSelectPanel._tbDefine = {
|
||||
{
|
||||
sPrefabPath = "_400008/GoldenSpyLevelSelectPanel.prefab",
|
||||
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyLevelSelectCtrl"
|
||||
}
|
||||
}
|
||||
local PanelTab = {Group = 1, Level = 2}
|
||||
function GoldenSpyLevelSelectPanel:Awake()
|
||||
self.nPanelTab = PanelTab.Group
|
||||
self.nSelectGroupId = 0
|
||||
self.nSelectLevelId = 0
|
||||
end
|
||||
function GoldenSpyLevelSelectPanel:OnEnable()
|
||||
end
|
||||
function GoldenSpyLevelSelectPanel:OnAfterEnter()
|
||||
end
|
||||
function GoldenSpyLevelSelectPanel:OnDisable()
|
||||
end
|
||||
function GoldenSpyLevelSelectPanel:OnDestroy()
|
||||
end
|
||||
function GoldenSpyLevelSelectPanel:OnRelease()
|
||||
end
|
||||
return GoldenSpyLevelSelectPanel
|
||||
@@ -0,0 +1,100 @@
|
||||
local GoldenSpyBaseItem = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseItem")
|
||||
local GoldenSpyNormalItem = class("GoldenSpyNormalItem", GoldenSpyBaseItem)
|
||||
GoldenSpyNormalItem._mapNodeConfig = {
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
flash = {}
|
||||
}
|
||||
GoldenSpyNormalItem._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show",
|
||||
GoldenSpy_ItemUpdateScore = "OnEvent_GoldenSpy_ItemUpdateScore"
|
||||
}
|
||||
GoldenSpyNormalItem._mapRedDotConfig = {}
|
||||
function GoldenSpyNormalItem:InitData()
|
||||
local nScore = self.itemCfg.Score
|
||||
for _, v in ipairs(self.floorCtrl.levelCtrl.GoldenSpyLevelData:GetBuffData()) do
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
|
||||
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore and buffCfg.Params[1] == self.itemCfg.ItemType and self:IsBuffActive(v) then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
end
|
||||
self:InitFlash(nScore)
|
||||
end
|
||||
function GoldenSpyNormalItem:InitFlash(nScore)
|
||||
if self.itemCfg.NeedShowFlash == false then
|
||||
return
|
||||
end
|
||||
self._mapNode.flash:SetActive(nScore >= self.commonCfg.HighValueEffect)
|
||||
end
|
||||
function GoldenSpyNormalItem:GetHitArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local hitArea = {
|
||||
nType = self.nHitAreaType,
|
||||
center = self._mapNode.HitArea.anchoredPosition + tr.anchoredPosition,
|
||||
width = self._mapNode.HitArea.sizeDelta.x,
|
||||
height = self._mapNode.HitArea.sizeDelta.y
|
||||
}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpyNormalItem:IsBuffActive(buffData)
|
||||
local bResult = false
|
||||
local nCurFloor = self.floorCtrl.levelCtrl.GoldenSpyLevelData:GetCurFloor()
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", buffData.buffId)
|
||||
if buffCfg == nil then
|
||||
return false
|
||||
end
|
||||
if buffCfg.BuffType == GameEnum.GoldenSpyBuffType.TemporaryBuff then
|
||||
if buffData.bActive and table.indexof(buffData.tbActiveFloor, nCurFloor) > 0 then
|
||||
bResult = true
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.DelayBuff then
|
||||
if buffData.bActive and table.indexof(buffData.tbActiveFloor, nCurFloor) > 0 then
|
||||
bResult = true
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.PermanentBuff then
|
||||
if buffData.bActive then
|
||||
bResult = true
|
||||
end
|
||||
elseif buffCfg.BuffType == GameEnum.GoldenSpyBuffType.SkillCountBuff then
|
||||
end
|
||||
return bResult
|
||||
end
|
||||
function GoldenSpyNormalItem:OnSkill_InVision()
|
||||
self.floorCtrl:RemoveItem(self)
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyNormalItem:OnSkill_Boom(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
if self.gameObject then
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyNormalItem:OnSkill_Frozen(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyNormalItem:OnEvent_GoldenSpy_ItemUpdateScore(tbBuff)
|
||||
if self.gameObject.activeSelf == false then
|
||||
return
|
||||
end
|
||||
local nScore = self.itemCfg.Score
|
||||
for _, v in ipairs(tbBuff) do
|
||||
local buffCfg = ConfigTable.GetData("GoldenSpyBuffCard", v.buffId)
|
||||
if buffCfg ~= nil and buffCfg.EffectType == GameEnum.GoldenSpyBuffEffect.AddScore and buffCfg.Params[1] == self.itemCfg.ItemType and self:IsBuffActive(v) then
|
||||
nScore = nScore + buffCfg.Params[2]
|
||||
end
|
||||
end
|
||||
self:InitFlash(nScore)
|
||||
end
|
||||
function GoldenSpyNormalItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyNormalItem
|
||||
@@ -0,0 +1,383 @@
|
||||
local GoldenSpyBaseItem = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseItem")
|
||||
local GoldenSpyPatrolItem = class("GoldenSpyPatrolItem", GoldenSpyBaseItem)
|
||||
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
||||
local VisionAngle = 45
|
||||
local VisionRadius = 250
|
||||
GoldenSpyPatrolItem._mapNodeConfig = {
|
||||
trDrone = {
|
||||
sNodeName = "Drone",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
StartPoint = {
|
||||
sNodeName = "StartPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
EndPoint = {
|
||||
sNodeName = "EndPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
VisionPoint = {
|
||||
sNodeName = "VisionPoint",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
img_normal = {},
|
||||
img_warning = {},
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
animator = {sNodeName = "Icon", sComponentName = "Animator"},
|
||||
flash = {},
|
||||
imgIce = {},
|
||||
IceRoot = {
|
||||
sComponentName = "RectTransform"
|
||||
}
|
||||
}
|
||||
GoldenSpyPatrolItem._mapEventConfig = {
|
||||
GoldenSpyHookStartExtend = "OnEvent_GoldenSpyHookStartExtend",
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpyPatrolItem._mapRedDotConfig = {}
|
||||
function GoldenSpyPatrolItem:Awake()
|
||||
self._moveTweener = nil
|
||||
self._visionUpdateTimer = nil
|
||||
self._mapNode.img_normal:SetActive(true)
|
||||
self._mapNode.img_warning:SetActive(false)
|
||||
self.bTrigger = true
|
||||
self._mapNode.flash:SetActive(false)
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnEnable()
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnDisable()
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnDestroy()
|
||||
self:StopMove()
|
||||
end
|
||||
function GoldenSpyPatrolItem:Init()
|
||||
self.nUid = nil
|
||||
self.nItemId = nil
|
||||
self.bDirection = true
|
||||
self.nBagItemPrice = 0
|
||||
local startPoint = self._mapNode.StartPoint.anchoredPosition
|
||||
self.vStartPoint = Vector3(startPoint.x, startPoint.y, 0)
|
||||
local endPoint = self._mapNode.EndPoint.anchoredPosition
|
||||
self.vEndPoint = Vector3(endPoint.x, endPoint.y, 0)
|
||||
local visionPoint = self._mapNode.VisionPoint.anchoredPosition
|
||||
self.vVisionPoint = Vector3(visionPoint.x, visionPoint.y, 0)
|
||||
self.bDirection = self.vEndPoint.x > self.vStartPoint.x
|
||||
self.bDestination = false
|
||||
end
|
||||
function GoldenSpyPatrolItem:InitData()
|
||||
self.nVisionAngle = self.itemCfg.Params[3] or VisionAngle
|
||||
self.nVisionRadius = self.itemCfg.Params[4] or VisionRadius
|
||||
end
|
||||
function GoldenSpyPatrolItem:StartFloor()
|
||||
self:StartMove()
|
||||
end
|
||||
function GoldenSpyPatrolItem:FinishFloor()
|
||||
self:StopMove()
|
||||
end
|
||||
function GoldenSpyPatrolItem:GetHitArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local hitArea = {
|
||||
nType = self.nHitAreaType,
|
||||
center = self._mapNode.HitArea.anchoredPosition + tr.anchoredPosition + self._mapNode.trDrone.anchoredPosition,
|
||||
width = self._mapNode.HitArea.sizeDelta.x,
|
||||
height = self._mapNode.HitArea.sizeDelta.y
|
||||
}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpyPatrolItem:Boom(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyPatrolItem:GetVisionArea()
|
||||
local visionArea = {
|
||||
center = self._mapNode.VisionPoint.anchoredPosition + self.gameObject.transform.anchoredPosition,
|
||||
radius = self._mapNode.VisionPoint.sizeDelta.x * 0.5,
|
||||
direction = self.bDirection
|
||||
}
|
||||
return visionArea
|
||||
end
|
||||
function GoldenSpyPatrolItem:Pause()
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Pause()
|
||||
end
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Pause(true)
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:Resume()
|
||||
if self.bFrozen then
|
||||
return
|
||||
end
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Play()
|
||||
end
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Pause(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:onCatch(callback)
|
||||
self:StopMove()
|
||||
self._mapNode.trDrone.anchoredPosition = Vector2.zero
|
||||
self._mapNode.img_warning:SetActive(false)
|
||||
self._mapNode.img_normal:SetActive(false)
|
||||
self._mapNode.animator:Play("Companion_out")
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnSkill_Boom(callback)
|
||||
self:StopMove()
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
if self.gameObject then
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnSkill_Frozen(callback)
|
||||
self.bFrozen = true
|
||||
self._mapNode.imgIce:SetActive(true)
|
||||
self._mapNode.img_normal:SetActive(false)
|
||||
self._mapNode.img_warning:SetActive(false)
|
||||
self._mapNode.animator:Play("Companion_out")
|
||||
self:Pause()
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnSkill_Frozen_Resume(callback)
|
||||
self.bFrozen = false
|
||||
self._mapNode.imgIce:SetActive(false)
|
||||
self._mapNode.IceRoot:SetParent(self.gameObject.transform)
|
||||
self._mapNode.IceRoot.anchoredPosition = self._mapNode.trDrone.anchoredPosition
|
||||
self._mapNode.IceRoot.gameObject:SetActive(true)
|
||||
self._mapNode.img_normal:SetActive(true)
|
||||
self._mapNode.animator:Play("Companion_idle")
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Play()
|
||||
end
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Pause(false)
|
||||
end
|
||||
self:AddTimer(1, 0.5, function()
|
||||
self._mapNode.IceRoot.gameObject:SetActive(false)
|
||||
self._mapNode.IceRoot:SetParent(self._mapNode.trDrone)
|
||||
end, true, true, true)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:StartMove()
|
||||
self:StopMove()
|
||||
self.bDirection = self.vEndPoint.x > self.vStartPoint.x
|
||||
self:_ApplyForwardRotation()
|
||||
self:_StartMoveTween()
|
||||
self:_StartVisionCheck()
|
||||
end
|
||||
function GoldenSpyPatrolItem:_StartMoveTween()
|
||||
local tr = self._mapNode.trDrone
|
||||
if tr == nil then
|
||||
return
|
||||
end
|
||||
local from = tr.anchoredPosition
|
||||
local to = self.bDestination and self.vStartPoint or self.vEndPoint
|
||||
local dist = to.x - from.x
|
||||
local duration = math.abs(dist / (self.itemCfg.Params[1] or 100))
|
||||
if duration <= 0 then
|
||||
self:_OnReachTarget()
|
||||
return
|
||||
end
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Kill(false)
|
||||
self._moveTweener = nil
|
||||
end
|
||||
self._moveTweener = tr:DOAnchorPosX(to.x, duration):SetEase(Ease.Linear):SetUpdate(true):OnUpdate(function()
|
||||
end):OnComplete(function()
|
||||
self:_OnReachTarget()
|
||||
end):OnKill(function()
|
||||
end)
|
||||
end
|
||||
function GoldenSpyPatrolItem:StopMove()
|
||||
self:_KillMoveTween()
|
||||
self:_StopVisionCheck()
|
||||
end
|
||||
function GoldenSpyPatrolItem:_OnReachTarget()
|
||||
self.bDirection = not self.bDirection
|
||||
self.bDestination = not self.bDestination
|
||||
self:_ApplyForwardRotation()
|
||||
self:_StartMoveTween()
|
||||
end
|
||||
function GoldenSpyPatrolItem:_ApplyForwardRotation()
|
||||
local tr = self._mapNode.trDrone
|
||||
if tr then
|
||||
if self.bDirection then
|
||||
tr.localEulerAngles = Vector3(0, 0, 0)
|
||||
else
|
||||
tr.localEulerAngles = Vector3(0, 180, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:_KillMoveTween()
|
||||
if self._moveTweener ~= nil then
|
||||
self._moveTweener:Kill(false)
|
||||
self._moveTweener = nil
|
||||
end
|
||||
if self._mapNode.trDrone ~= nil then
|
||||
self._mapNode.trDrone:DOKill(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:GetForwardAngle()
|
||||
if self.bDirection then
|
||||
return 0
|
||||
else
|
||||
return 180
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:_PointInSector(px, py, cx, cy, forwardAngle, visionAngle, radius)
|
||||
local dx, dy = px - cx, py - cy
|
||||
local dist2 = dx * dx + dy * dy
|
||||
if dist2 > radius * radius then
|
||||
return false
|
||||
end
|
||||
local angle = math.deg(math.atan(dy, dx))
|
||||
local lo = forwardAngle - visionAngle
|
||||
local hi = forwardAngle + visionAngle
|
||||
while angle < lo do
|
||||
angle = angle + 360
|
||||
end
|
||||
while angle > hi + 360 do
|
||||
angle = angle - 360
|
||||
end
|
||||
if lo <= angle and hi >= angle then
|
||||
return true
|
||||
end
|
||||
if angle >= lo - 360 and angle <= hi - 360 then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
function GoldenSpyPatrolItem:_HitAreaInSector(hitArea, vx, vy, forwardAngle, halfAngle, radius)
|
||||
if not (hitArea and vx) or not vy then
|
||||
return false
|
||||
end
|
||||
local cx, cy = vx, vy
|
||||
local ix, iy
|
||||
if hitArea.position then
|
||||
ix, iy = hitArea.position.x, hitArea.position.y
|
||||
else
|
||||
return false
|
||||
end
|
||||
local itemR = hitArea.radius or 0
|
||||
return self:_CircleSectorIntersect(ix, iy, itemR, cx, cy, forwardAngle, halfAngle, radius)
|
||||
end
|
||||
function GoldenSpyPatrolItem:_PointToSectorDist(px, py, cx, cy, forwardAngle, halfAngle, radius)
|
||||
local dx, dy = px - cx, py - cy
|
||||
local dist = math.sqrt(dx * dx + dy * dy)
|
||||
local angleDeg = math.deg(math.atan(dy, dx))
|
||||
local lo = forwardAngle - halfAngle
|
||||
local hi = forwardAngle + halfAngle
|
||||
while angleDeg < lo - 180 do
|
||||
angleDeg = angleDeg + 360
|
||||
end
|
||||
while angleDeg > hi + 180 do
|
||||
angleDeg = angleDeg - 360
|
||||
end
|
||||
if lo <= angleDeg and hi >= angleDeg and radius >= dist then
|
||||
return 0
|
||||
end
|
||||
local radLo = math.rad(lo)
|
||||
local radHi = math.rad(hi)
|
||||
local clampAngle = angleDeg
|
||||
if lo > clampAngle then
|
||||
clampAngle = lo
|
||||
end
|
||||
if hi < clampAngle then
|
||||
clampAngle = hi
|
||||
end
|
||||
local radClamp = math.rad(clampAngle)
|
||||
local ax = cx + radius * math.cos(radClamp)
|
||||
local ay = cy + radius * math.sin(radClamp)
|
||||
local dArc = math.sqrt((px - ax) ^ 2 + (py - ay) ^ 2)
|
||||
local distToRay = function(angleRay)
|
||||
local rad = math.rad(angleRay)
|
||||
local rx, ry = math.cos(rad), math.sin(rad)
|
||||
local t = dx * rx + dy * ry
|
||||
if t <= 0 then
|
||||
return math.sqrt(dx * dx + dy * dy)
|
||||
end
|
||||
if t >= radius then
|
||||
local ex = cx + radius * rx
|
||||
local ey = cy + radius * ry
|
||||
return math.sqrt((px - ex) ^ 2 + (py - ey) ^ 2)
|
||||
end
|
||||
local nx = cx + t * rx
|
||||
local ny = cy + t * ry
|
||||
return math.sqrt((px - nx) ^ 2 + (py - ny) ^ 2)
|
||||
end
|
||||
local dRay1 = distToRay(lo)
|
||||
local dRay2 = distToRay(hi)
|
||||
return math.min(dArc, dRay1, dRay2)
|
||||
end
|
||||
function GoldenSpyPatrolItem:_CircleSectorIntersect(circleCx, circleCy, circleR, sectorCx, sectorCy, sectorForward, sectorHalfAngle, sectorRadius)
|
||||
local dist = self:_PointToSectorDist(circleCx, circleCy, sectorCx, sectorCy, sectorForward, sectorHalfAngle, sectorRadius)
|
||||
return circleR >= dist
|
||||
end
|
||||
function GoldenSpyPatrolItem:_CheckVision()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local vp = self._mapNode.VisionPoint.anchoredPosition + tr.anchoredPosition + self._mapNode.trDrone.anchoredPosition
|
||||
if vp == nil then
|
||||
return
|
||||
end
|
||||
local vx, vy = vp.x, vp.y
|
||||
local forwardAngle = self:GetForwardAngle()
|
||||
local halfAngle = self.nVisionAngle
|
||||
local radius = self.nVisionRadius
|
||||
local hitArea = {
|
||||
position = self.floorCtrl:GetHookEndPos(),
|
||||
radius = self.floorCtrl:GetHookRadius()
|
||||
}
|
||||
if hitArea and self:_HitAreaInSector(hitArea, vx, vy, forwardAngle, halfAngle, radius) and self.bTrigger then
|
||||
self.floorCtrl:DropItem()
|
||||
self.floorCtrl:DoStartRetract()
|
||||
WwiseAudioMgr:PostEvent("Mode_steal_error")
|
||||
self.floorCtrl:SubTime(self.itemCfg.Params[2])
|
||||
self._mapNode.img_normal:SetActive(false)
|
||||
self._mapNode.img_warning:SetActive(true)
|
||||
self:AddTimer(1, 0.5, function()
|
||||
self._mapNode.img_normal:SetActive(true)
|
||||
self._mapNode.img_warning:SetActive(false)
|
||||
end, true, true, true)
|
||||
self.bTrigger = false
|
||||
else
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:_StartVisionCheck()
|
||||
self:_StopVisionCheck()
|
||||
self._visionUpdateTimer = self:AddTimer(0, 0, "OnVisionUpdate", true, true, true)
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnVisionUpdate()
|
||||
self:_CheckVision()
|
||||
end
|
||||
function GoldenSpyPatrolItem:_StopVisionCheck()
|
||||
if self._visionUpdateTimer ~= nil then
|
||||
self._visionUpdateTimer:Cancel()
|
||||
self._visionUpdateTimer = nil
|
||||
end
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnEvent_GoldenSpyHookStartExtend()
|
||||
self.bTrigger = true
|
||||
end
|
||||
function GoldenSpyPatrolItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpyPatrolItem
|
||||
@@ -0,0 +1,76 @@
|
||||
local GoldenSpyPauseCtrl = class("GoldenSpyPauseCtrl", BaseCtrl)
|
||||
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
||||
GoldenSpyPauseCtrl._mapNodeConfig = {
|
||||
blur = {},
|
||||
txt_title = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "TowerDef_Text_Pause"
|
||||
},
|
||||
txt_exit = {
|
||||
nCount = 2,
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "TowerDef_Button_Leave"
|
||||
},
|
||||
txt_restart = {
|
||||
nCount = 2,
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "TowerDef_Button_Re"
|
||||
},
|
||||
txt_continue = {
|
||||
nCount = 2,
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "TowerDef_Button_Back"
|
||||
},
|
||||
txt_dic = {
|
||||
nCount = 2,
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "Tutorial_DicTitle"
|
||||
},
|
||||
btn_exit = {
|
||||
sComponentName = "NaviButton",
|
||||
callback = "OnBtnClick_Exit",
|
||||
sAction = "Giveup"
|
||||
},
|
||||
btn_restart = {
|
||||
sComponentName = "NaviButton",
|
||||
callback = "OnBtnClick_Restart",
|
||||
sAction = "Retry"
|
||||
},
|
||||
btn_continue = {
|
||||
sComponentName = "NaviButton",
|
||||
callback = "OnBtnClick_Continue",
|
||||
sAction = "Back"
|
||||
},
|
||||
btn_dic = {
|
||||
sComponentName = "NaviButton",
|
||||
callback = "OnBtnClick_OpenDic",
|
||||
sAction = "Depot"
|
||||
}
|
||||
}
|
||||
GoldenSpyPauseCtrl._mapEventConfig = {}
|
||||
GoldenSpyPauseCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyPauseCtrl:Awake()
|
||||
self.tbGamepadUINode = self:GetGamepadUINode()
|
||||
end
|
||||
function GoldenSpyPauseCtrl:Open(needShowDic)
|
||||
self.gameObject:SetActive(true)
|
||||
self._mapNode.btn_dic.gameObject:SetActive(needShowDic)
|
||||
GamepadUIManager.EnableGamepadUI("GoldenSpyPauseCtrl", self.tbGamepadUINode)
|
||||
end
|
||||
function GoldenSpyPauseCtrl:Close()
|
||||
GamepadUIManager.DisableGamepadUI("GoldenSpyPauseCtrl")
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpyPauseCtrl:OnBtnClick_Exit()
|
||||
EventManager.Hit("GoldenSpy_Exit_OnClick")
|
||||
end
|
||||
function GoldenSpyPauseCtrl:OnBtnClick_Restart()
|
||||
EventManager.Hit("GoldenSpy_Restart_OnClick")
|
||||
end
|
||||
function GoldenSpyPauseCtrl:OnBtnClick_Continue()
|
||||
EventManager.Hit("GoldenSpy_Continue_OnClick")
|
||||
end
|
||||
function GoldenSpyPauseCtrl:OnBtnClick_OpenDic()
|
||||
EventManager.Hit("GoldenSpy_OpenDic_OnClick")
|
||||
end
|
||||
return GoldenSpyPauseCtrl
|
||||
@@ -0,0 +1,155 @@
|
||||
local GoldenSpyResultCtrl = class("GoldenSpyResultCtrl", BaseCtrl)
|
||||
GoldenSpyResultCtrl._mapNodeConfig = {
|
||||
txt_title = {nCount = 2, sComponentName = "TMP_Text"},
|
||||
txt_titleShadow = {nCount = 2, sComponentName = "TMP_Text"},
|
||||
btn_finish1 = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Finish"
|
||||
},
|
||||
txt_finish1 = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Result_Finish"
|
||||
},
|
||||
btn_finish2 = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Finish"
|
||||
},
|
||||
txt_finish2 = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_LevelFinish"
|
||||
},
|
||||
GoNextRoot = {},
|
||||
txtTipShadow = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Result_Tip"
|
||||
},
|
||||
txtTip = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Result_Tip"
|
||||
},
|
||||
btn_goNext = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_GoNext"
|
||||
},
|
||||
txt_goNext = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Result_GoNext"
|
||||
},
|
||||
txt_ttTitle = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_Result_TotalTargetTitle"
|
||||
},
|
||||
txt_ttValue = {sComponentName = "TMP_Text"},
|
||||
img_finish = {},
|
||||
FinishRoot = {}
|
||||
}
|
||||
GoldenSpyResultCtrl._mapEventConfig = {}
|
||||
GoldenSpyResultCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyResultCtrl:Awake()
|
||||
local tbParam = self:GetPanelParam()
|
||||
if type(tbParam) == "table" then
|
||||
self.bResult = tbParam[1]
|
||||
self.nLevelId = tbParam[2]
|
||||
self.nCurFloorId = tbParam[3]
|
||||
self.nFloor = tbParam[4]
|
||||
self.nTotalFloor = tbParam[5]
|
||||
self.nCurScore = tbParam[6]
|
||||
self.finishCallback = tbParam[7]
|
||||
self.goNextCallback = tbParam[8]
|
||||
self.bSuccess = tbParam[9]
|
||||
end
|
||||
self.levelCfg = ConfigTable.GetData("GoldenSpyLevel", self.nLevelId)
|
||||
self.floorCfg = ConfigTable.GetData("GoldenSpyFloor", self.nCurFloorId)
|
||||
self._mapNode.GoNextRoot:SetActive(not self.bResult)
|
||||
self._mapNode.FinishRoot:SetActive(self.bResult)
|
||||
self:SetContent()
|
||||
if self.bSuccess then
|
||||
for i, v in ipairs(self._mapNode.txt_title) do
|
||||
NovaAPI.SetTMPText(v, ConfigTable.GetUIText("GoldenSpy_Result_Title"))
|
||||
end
|
||||
for i, v in ipairs(self._mapNode.txt_titleShadow) do
|
||||
NovaAPI.SetTMPText(v, ConfigTable.GetUIText("GoldenSpy_Result_Title"))
|
||||
end
|
||||
else
|
||||
for i, v in ipairs(self._mapNode.txt_title) do
|
||||
NovaAPI.SetTMPText(v, ConfigTable.GetUIText("GoldenSpy_Result_Failure"))
|
||||
end
|
||||
for i, v in ipairs(self._mapNode.txt_titleShadow) do
|
||||
NovaAPI.SetTMPText(v, ConfigTable.GetUIText("GoldenSpy_Result_Failure"))
|
||||
end
|
||||
end
|
||||
end
|
||||
function GoldenSpyResultCtrl:OnEnable()
|
||||
end
|
||||
function GoldenSpyResultCtrl:OnDisable()
|
||||
end
|
||||
function GoldenSpyResultCtrl:OnDestroy()
|
||||
end
|
||||
function GoldenSpyResultCtrl:SetContent()
|
||||
self:SetGoNextTarget()
|
||||
self:SetFinishTarget()
|
||||
end
|
||||
function GoldenSpyResultCtrl:SetGoNextTarget()
|
||||
NovaAPI.SetTMPText(self._mapNode.txt_ttValue, tostring(self.levelCfg.Score))
|
||||
self._mapNode.img_finish:SetActive(self.nCurScore >= self.levelCfg.Score)
|
||||
local goNext = self._mapNode.GoNextRoot
|
||||
local target1 = goNext.transform:Find("AnimRoot/target1")
|
||||
local txt_target1 = target1.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value1 = target1.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target1, ConfigTable.GetUIText("GoldenSpy_Result_GoNextTarget1"))
|
||||
NovaAPI.SetTMPText(txt_value1, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue2"), self.floorCfg.GoalScore))
|
||||
local target2 = goNext.transform:Find("AnimRoot/target2")
|
||||
local txt_target2 = target2.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value2 = target2.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target2, ConfigTable.GetUIText("GoldenSpy_Result_GoNextTarget2"))
|
||||
NovaAPI.SetTMPText(txt_value2, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue2"), self.nCurScore))
|
||||
end
|
||||
function GoldenSpyResultCtrl:SetFinishTarget()
|
||||
local finish = self._mapNode.FinishRoot
|
||||
local target1 = finish.transform:Find("AnimRoot/target1")
|
||||
local txt_target1 = target1.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value1 = target1.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target1, ConfigTable.GetUIText("GoldenSpy_Result_FinishTarget1"))
|
||||
NovaAPI.SetTMPText(txt_value1, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue1"), self.nTotalFloor))
|
||||
local target2 = finish.transform:Find("AnimRoot/target2")
|
||||
local txt_target2 = target2.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value2 = target2.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target2, ConfigTable.GetUIText("GoldenSpy_Result_FinishTarget2"))
|
||||
NovaAPI.SetTMPText(txt_value2, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue1"), self.nFloor))
|
||||
local target3 = finish.transform:Find("AnimRoot/target3")
|
||||
local txt_target3 = target3.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value3 = target3.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target3, ConfigTable.GetUIText("GoldenSpy_Result_FinishTarget3"))
|
||||
NovaAPI.SetTMPText(txt_value3, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue2"), self.levelCfg.Score))
|
||||
local target4 = finish.transform:Find("AnimRoot/target4")
|
||||
local txt_target4 = target4.transform:Find("txt_target"):GetComponent("TMP_Text")
|
||||
local txt_value4 = target4.transform:Find("txt_value"):GetComponent("TMP_Text")
|
||||
NovaAPI.SetTMPText(txt_target4, ConfigTable.GetUIText("GoldenSpy_Result_FinishTarget4"))
|
||||
NovaAPI.SetTMPText(txt_value4, orderedFormat(ConfigTable.GetUIText("GoldenSpy_Result_TargetValue2"), self.nCurScore))
|
||||
end
|
||||
function GoldenSpyResultCtrl:OnBtnClick_Finish()
|
||||
if self.bResult then
|
||||
local callback = function()
|
||||
local wait = function()
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.GoldenSpyResultPanel)
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
end
|
||||
if self.finishCallback ~= nil then
|
||||
self.finishCallback(callback)
|
||||
end
|
||||
else
|
||||
self.bResult = true
|
||||
self._mapNode.GoNextRoot:SetActive(not self.bResult)
|
||||
self._mapNode.FinishRoot:SetActive(self.bResult)
|
||||
end
|
||||
end
|
||||
function GoldenSpyResultCtrl:OnBtnClick_GoNext()
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.GoldenSpyResultPanel)
|
||||
if self.goNextCallback ~= nil then
|
||||
self.goNextCallback()
|
||||
end
|
||||
end
|
||||
return GoldenSpyResultCtrl
|
||||
@@ -0,0 +1,24 @@
|
||||
local GoldenSpyResultPanel = class("GoldenSpyResultPanel", BasePanel)
|
||||
GoldenSpyResultPanel._bIsMainPanel = true
|
||||
GoldenSpyResultPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
|
||||
GoldenSpyResultPanel._nSnapshotPrePanel = 1
|
||||
GoldenSpyResultPanel._sUIResRootPath = "UI_Activity/"
|
||||
GoldenSpyResultPanel._tbDefine = {
|
||||
{
|
||||
sPrefabPath = "_400008/GoldenSpyResultPanel.prefab",
|
||||
sCtrlName = "Game.UI.Activity.GoldenSpy.GoldenSpyResultCtrl"
|
||||
}
|
||||
}
|
||||
function GoldenSpyResultPanel:Awake()
|
||||
end
|
||||
function GoldenSpyResultPanel:OnEnable()
|
||||
end
|
||||
function GoldenSpyResultPanel:OnAfterEnter()
|
||||
end
|
||||
function GoldenSpyResultPanel:OnDisable()
|
||||
end
|
||||
function GoldenSpyResultPanel:OnDestroy()
|
||||
end
|
||||
function GoldenSpyResultPanel:OnRelease()
|
||||
end
|
||||
return GoldenSpyResultPanel
|
||||
@@ -0,0 +1,61 @@
|
||||
local GoldenSpyBaseItem = require("Game.UI.Activity.GoldenSpy.GoldenSpyBaseItem")
|
||||
local GoldenSpySafeBoxItem = class("GoldenSpySafeBoxItem", GoldenSpyBaseItem)
|
||||
GoldenSpySafeBoxItem._mapNodeConfig = {
|
||||
HitArea = {
|
||||
sNodeName = "HitArea",
|
||||
sComponentName = "RectTransform"
|
||||
},
|
||||
flash = {}
|
||||
}
|
||||
GoldenSpySafeBoxItem._mapEventConfig = {
|
||||
GM_GoldenSpy_Show = "OnEvent_GM_GoldenSpy_Show"
|
||||
}
|
||||
GoldenSpySafeBoxItem._mapRedDotConfig = {}
|
||||
function GoldenSpySafeBoxItem:InitData()
|
||||
local nWeightMin = self.itemCfg.Params[1]
|
||||
local nWeightMax = self.itemCfg.Params[2]
|
||||
local nScoreMin = self.itemCfg.Params[3]
|
||||
local nScoreMax = self.itemCfg.Params[4]
|
||||
self.nWeight = math.random(nWeightMin, nWeightMax)
|
||||
self.nScore = math.random(nScoreMin, nScoreMax)
|
||||
end
|
||||
function GoldenSpySafeBoxItem:GetWeight()
|
||||
return self.nWeight
|
||||
end
|
||||
function GoldenSpySafeBoxItem:GetScore()
|
||||
return self.nScore
|
||||
end
|
||||
function GoldenSpySafeBoxItem:GetHitArea()
|
||||
local tr = self.gameObject:GetComponent("RectTransform")
|
||||
local hitArea = {
|
||||
nType = self.nHitAreaType,
|
||||
center = self._mapNode.HitArea.anchoredPosition + tr.anchoredPosition,
|
||||
width = self._mapNode.HitArea.sizeDelta.x,
|
||||
height = self._mapNode.HitArea.sizeDelta.y
|
||||
}
|
||||
return hitArea
|
||||
end
|
||||
function GoldenSpySafeBoxItem:OnSkill_InVision()
|
||||
self.floorCtrl:RemoveItem(self)
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
function GoldenSpySafeBoxItem:OnSkill_Boom(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
if self.gameObject ~= nil then
|
||||
self.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
function GoldenSpySafeBoxItem:OnSkill_Frozen(callback)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end
|
||||
function GoldenSpySafeBoxItem:OnEvent_GM_GoldenSpy_Show()
|
||||
local img = self._mapNode.HitArea:GetComponent("Image")
|
||||
if img then
|
||||
img.enabled = true
|
||||
end
|
||||
end
|
||||
return GoldenSpySafeBoxItem
|
||||
@@ -0,0 +1,116 @@
|
||||
local GoldenSpyToolBoxCtrl = class("GoldenSpyToolBoxCtrl", BaseCtrl)
|
||||
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
||||
local BuffSpritePath = "UI_Activity/_400008/SpriteAtlas/Buff/"
|
||||
local ItemSpritePath = "UI_Activity/_400008/SpriteAtlas/Item/"
|
||||
GoldenSpyToolBoxCtrl._mapNodeConfig = {
|
||||
txt_toolBox = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpy_ToolBox_Title"
|
||||
},
|
||||
sv_item = {
|
||||
sComponentName = "LoopScrollView"
|
||||
},
|
||||
sv_buff = {
|
||||
sComponentName = "LoopScrollView"
|
||||
},
|
||||
btn_close = {
|
||||
nCount = 2,
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Close"
|
||||
},
|
||||
safeAreaRoot = {
|
||||
sNodeName = "----SafeAreaRoot----"
|
||||
},
|
||||
txt_None = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "GoldenSpyBoxEmpty"
|
||||
}
|
||||
}
|
||||
GoldenSpyToolBoxCtrl._mapEventConfig = {}
|
||||
GoldenSpyToolBoxCtrl._mapRedDotConfig = {}
|
||||
function GoldenSpyToolBoxCtrl:Awake()
|
||||
self.tbGamepadUINode = self:GetGamepadUINode()
|
||||
self.mapBuffCellCtrl = {}
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnEnable()
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnDisable()
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnDestroy()
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:Show(tbItem, tbBuff, callback)
|
||||
self.gameObject:SetActive(true)
|
||||
self._mapNode.safeAreaRoot:SetActive(false)
|
||||
self:RefreshBuffList(tbBuff)
|
||||
self:RefreshItemList(tbItem)
|
||||
self.callback = callback
|
||||
GamepadUIManager.EnableGamepadUI("GoldenSpyToolBoxCtrl", self.tbGamepadUINode)
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, 1)
|
||||
local wait = function()
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
self._mapNode.safeAreaRoot:SetActive(true)
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:RefreshBuffList(tbBuff)
|
||||
self.tbBuff = tbBuff
|
||||
if self.tbBuff == nil or #self.tbBuff == 0 then
|
||||
self._mapNode.sv_buff.gameObject:SetActive(false)
|
||||
self._mapNode.txt_None.gameObject:SetActive(true)
|
||||
return
|
||||
end
|
||||
self._mapNode.txt_None.gameObject:SetActive(false)
|
||||
self._mapNode.sv_buff.gameObject:SetActive(true)
|
||||
self._mapNode.sv_buff:Init(#self.tbBuff, self, self.OnRefreshBuffGrid)
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnRefreshBuffGrid(goGrid, gridIndex)
|
||||
local nIndex = gridIndex + 1
|
||||
local nInstanceId = goGrid:GetInstanceID()
|
||||
local objCtrl = self.mapBuffCellCtrl[nInstanceId]
|
||||
if objCtrl == nil then
|
||||
objCtrl = self:BindCtrlByNode(goGrid, "Game.UI.Activity.GoldenSpy.GoldenSpyBuffCellCtrl")
|
||||
self.mapBuffCellCtrl[nInstanceId] = objCtrl
|
||||
end
|
||||
objCtrl:SetData(self.tbBuff[nIndex])
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:RefreshItemList(tbItem)
|
||||
self.tbShowItem = tbItem
|
||||
if self.tbShowItem == nil or #self.tbShowItem == 0 then
|
||||
self._mapNode.sv_item.gameObject:SetActive(false)
|
||||
return
|
||||
end
|
||||
self._mapNode.sv_item:Init(#self.tbShowItem, self, self.OnRefreshItemGrid)
|
||||
self._mapNode.sv_item.gameObject:SetActive(true)
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnRefreshItemGrid(goGrid, gridIndex)
|
||||
local nIndex = gridIndex + 1
|
||||
local itemId = self.tbShowItem[nIndex].itemId
|
||||
local itemScore = self.tbShowItem[nIndex].score
|
||||
itemScore = math.floor(itemScore)
|
||||
local itemCfg = ConfigTable.GetData("GoldenSpyItem", itemId)
|
||||
if itemCfg == nil then
|
||||
return
|
||||
end
|
||||
local img_icon = goGrid.transform:Find("db/icon"):GetComponent("Image")
|
||||
local txt_score = goGrid.transform:Find("db/txt_score"):GetComponent("TMP_Text")
|
||||
self:SetPngSprite(img_icon, ItemSpritePath .. itemCfg.IconPath .. "_s")
|
||||
NovaAPI.SetTMPText(txt_score, itemScore)
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnBtnClick_Close()
|
||||
self._mapNode.safeAreaRoot:SetActive(false)
|
||||
self.gameObject:SetActive(false)
|
||||
for k, v in pairs(self.mapBuffCellCtrl) do
|
||||
self:UnbindCtrlByNode(v)
|
||||
self.mapBuffCellCtrl[k] = nil
|
||||
end
|
||||
self.mapBuffCellCtrl = {}
|
||||
if self.callback ~= nil then
|
||||
self.callback()
|
||||
end
|
||||
GamepadUIManager.DisableGamepadUI("GoldenSpyToolBoxCtrl")
|
||||
end
|
||||
function GoldenSpyToolBoxCtrl:OnEvent_AAA()
|
||||
end
|
||||
return GoldenSpyToolBoxCtrl
|
||||
@@ -0,0 +1,162 @@
|
||||
local LoginRewardPopUpCtrl_01 = class("LoginRewardPopUpCtrl_01", BaseCtrl)
|
||||
local ClientManager = CS.ClientManager.Instance
|
||||
local TimerManager = require("GameCore.Timer.TimerManager")
|
||||
local LocalSettingData = require("GameCore.Data.LocalSettingData")
|
||||
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
|
||||
LoginRewardPopUpCtrl_01._mapNodeConfig = {
|
||||
imgActivity = {sComponentName = "Image"},
|
||||
goActTime = {},
|
||||
txtActivityTime = {sComponentName = "TMP_Text"},
|
||||
btnActivity = {
|
||||
sComponentName = "Button",
|
||||
callback = "OnBtnClick_Activity"
|
||||
},
|
||||
txtTips = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "LoginReward_PopUp_Tip"
|
||||
},
|
||||
goRewardItem = {
|
||||
nCount = 7,
|
||||
sCtrlName = "Game.UI.Activity.LoginReward.LoginSpRewardItemCtrl"
|
||||
},
|
||||
imgActor = {nCount = 2, sComponentName = "Image"},
|
||||
trActor2D_PNG = {
|
||||
sNodeName = "----Actor2D_PNG----",
|
||||
sComponentName = "Transform"
|
||||
}
|
||||
}
|
||||
LoginRewardPopUpCtrl_01._mapEventConfig = {}
|
||||
LoginRewardPopUpCtrl_01._mapRedDotConfig = {}
|
||||
function LoginRewardPopUpCtrl_01:RefreshRemainTime()
|
||||
local endTime = self.actData:GetActEndTime()
|
||||
local curTime = ClientManager.serverTimeStamp
|
||||
local remainTime = endTime - curTime
|
||||
if remainTime < 0 then
|
||||
self._mapNode.goActTime.gameObject:SetActive(false)
|
||||
return
|
||||
end
|
||||
local sTimeStr = ""
|
||||
if remainTime <= 60 then
|
||||
local sec = math.floor(remainTime)
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
|
||||
elseif 60 < remainTime and remainTime <= 3600 then
|
||||
local min = math.floor(remainTime / 60)
|
||||
local sec = math.floor(remainTime - min * 60)
|
||||
if sec == 0 then
|
||||
min = min - 1
|
||||
sec = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
|
||||
elseif 3600 < remainTime and remainTime <= 86400 then
|
||||
local hour = math.floor(remainTime / 3600)
|
||||
local min = math.floor((remainTime - hour * 3600) / 60)
|
||||
if min == 0 then
|
||||
hour = hour - 1
|
||||
min = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
|
||||
elseif 86400 < remainTime then
|
||||
local day = math.floor(remainTime / 86400)
|
||||
local hour = math.floor((remainTime - day * 86400) / 3600)
|
||||
if hour == 0 then
|
||||
day = day - 1
|
||||
hour = 24
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
|
||||
end
|
||||
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:RefreshActData()
|
||||
self.nActId = self._panel.nActId
|
||||
self.actData = self._panel.actData
|
||||
self.remainTimer = nil
|
||||
self:RefreshRewardList()
|
||||
self:RefreshNPC2D()
|
||||
local actCfg = self.actData:GetActCfgData()
|
||||
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
|
||||
self._mapNode.goActTime.gameObject:SetActive(false)
|
||||
else
|
||||
self._mapNode.goActTime.gameObject:SetActive(true)
|
||||
self:RefreshRemainTime()
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:RefreshRewardList()
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
if nil ~= tbRewardList then
|
||||
local nReceiveDay = self.actData:GetCanReceive()
|
||||
self.nActual = self.actData:GetReceived()
|
||||
for k, v in ipairs(self._mapNode.goRewardItem) do
|
||||
local mapReward = tbRewardList[k]
|
||||
v.gameObject:SetActive(mapReward ~= nil)
|
||||
if mapReward ~= nil then
|
||||
v:SetRewardItem(k, mapReward, true, nReceiveDay == self.nActual and k == self.nActual + 1, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:RefreshNPC2D()
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
local nReceive = self.actData:GetCanReceive()
|
||||
local nNpcId = tbRewardList[nReceive].NpcId
|
||||
local sPath = "LoginNpc_" .. nNpcId
|
||||
self._mapNode.imgActor[1].gameObject:SetActive(true)
|
||||
self:SetActivityAtlasSprite(self._mapNode.imgActor[1], "_" .. self.nActId, sPath)
|
||||
NovaAPI.SetImageNativeSize(self._mapNode.imgActor[1])
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:PlayOutAnim()
|
||||
local nAnimLength = 0
|
||||
if self.animRoot ~= nil then
|
||||
nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
|
||||
"LoginReward_01_out"
|
||||
})
|
||||
self.animRoot:Play("LoginReward_01_out")
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
|
||||
end
|
||||
return nAnimLength
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:Awake()
|
||||
self.animRoot = self.gameObject:GetComponent("Animator")
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnEnable()
|
||||
if self.animRoot ~= nil then
|
||||
local nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
|
||||
"LoginReward_01_in"
|
||||
})
|
||||
self.animRoot:Play("LoginReward_01_in")
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnDisable()
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnDestroy()
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnBtnClick_Activity()
|
||||
local bOpen = self.actData:CheckActivityOpen()
|
||||
if not bOpen then
|
||||
local callback = function()
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
end
|
||||
EventManager.Hit(EventId.OpenMessageBox, {
|
||||
nType = AllEnum.MessageBox.Alert,
|
||||
sContent = ConfigTable.GetUIText("Activity_PopUp_Time_Out"),
|
||||
callbackConfirm = callback
|
||||
})
|
||||
return
|
||||
end
|
||||
local canReceive = self.actData:CheckCanReceive()
|
||||
if not canReceive then
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
return
|
||||
end
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
local nReceive = self.actData:GetCanReceive()
|
||||
local mapNpc = {
|
||||
nNpcId = tbRewardList[nReceive].NpcId,
|
||||
nVoiceId = tbRewardList[nReceive].VoiceId
|
||||
}
|
||||
local callback = function()
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
end
|
||||
PlayerData.Activity:SendReceiveLoginRewardMsg(self.nActId, callback, mapNpc)
|
||||
end
|
||||
return LoginRewardPopUpCtrl_01
|
||||
@@ -0,0 +1,28 @@
|
||||
local LoginSpRewardCtrl_01 = class("LoginSpRewardCtrl_01", BaseCtrl)
|
||||
LoginSpRewardCtrl_01._mapNodeConfig = {
|
||||
goCommon = {
|
||||
sNodeName = "---Common---"
|
||||
}
|
||||
}
|
||||
LoginSpRewardCtrl_01._mapEventConfig = {}
|
||||
function LoginSpRewardCtrl_01:UnbindCtrl()
|
||||
if self.activityCtrl ~= nil then
|
||||
self:UnbindCtrlByNode(self.activityCtrl)
|
||||
self.activityCtrl = nil
|
||||
end
|
||||
end
|
||||
function LoginSpRewardCtrl_01:InitActData(actData)
|
||||
if self.activityCtrl == nil then
|
||||
self.activityCtrl = self:BindCtrlByNode(self._mapNode.goCommon, "Game.UI.Activity.LoginReward.LoginSpRewardCtrl_List")
|
||||
end
|
||||
self.actData = actData
|
||||
self.nActId = actData:GetActId()
|
||||
self.activityCtrl:InitActData(actData)
|
||||
end
|
||||
function LoginSpRewardCtrl_01:ClearActivity()
|
||||
self:UnbindCtrl()
|
||||
end
|
||||
function LoginSpRewardCtrl_01:OnDisable()
|
||||
self:UnbindCtrl()
|
||||
end
|
||||
return LoginSpRewardCtrl_01
|
||||
@@ -0,0 +1,28 @@
|
||||
local LoginRewardCtrl_01 = class("LoginRewardCtrl_01", BaseCtrl)
|
||||
LoginRewardCtrl_01._mapNodeConfig = {
|
||||
goCommon = {
|
||||
sNodeName = "---Common---"
|
||||
}
|
||||
}
|
||||
LoginRewardCtrl_01._mapEventConfig = {}
|
||||
function LoginRewardCtrl_01:UnbindCtrl()
|
||||
if self.activityCtrl ~= nil then
|
||||
self:UnbindCtrlByNode(self.activityCtrl)
|
||||
self.activityCtrl = nil
|
||||
end
|
||||
end
|
||||
function LoginRewardCtrl_01:InitActData(actData)
|
||||
if self.activityCtrl == nil then
|
||||
self.activityCtrl = self:BindCtrlByNode(self._mapNode.goCommon, "Game.UI.Activity.LoginReward.LoginRewardCtrl_List")
|
||||
end
|
||||
self.actData = actData
|
||||
self.nActId = actData:GetActId()
|
||||
self.activityCtrl:InitActData(actData)
|
||||
end
|
||||
function LoginRewardCtrl_01:ClearActivity()
|
||||
self:UnbindCtrl()
|
||||
end
|
||||
function LoginRewardCtrl_01:OnDisable()
|
||||
self:UnbindCtrl()
|
||||
end
|
||||
return LoginRewardCtrl_01
|
||||
@@ -0,0 +1,143 @@
|
||||
local LoginRewardPopUpCtrl_01 = class("LoginRewardPopUpCtrl_01", BaseCtrl)
|
||||
local ClientManager = CS.ClientManager.Instance
|
||||
LoginRewardPopUpCtrl_01._mapNodeConfig = {
|
||||
imgActivity = {sComponentName = "Image"},
|
||||
goActTime = {},
|
||||
txtActivityTime = {sComponentName = "TMP_Text"},
|
||||
btnActivity = {
|
||||
sComponentName = "Button",
|
||||
callback = "OnBtnClick_Activity"
|
||||
},
|
||||
txtTips = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "LoginReward_PopUp_Tip"
|
||||
},
|
||||
goRewardItem = {
|
||||
nCount = 7,
|
||||
sCtrlName = "Game.UI.Activity.LoginReward.LoginRewardItemCtrl_01"
|
||||
},
|
||||
imgActor = {nCount = 2, sComponentName = "Image"}
|
||||
}
|
||||
LoginRewardPopUpCtrl_01._mapEventConfig = {}
|
||||
LoginRewardPopUpCtrl_01._mapRedDotConfig = {}
|
||||
function LoginRewardPopUpCtrl_01:RefreshRemainTime()
|
||||
local endTime = self.actData:GetActEndTime()
|
||||
local curTime = ClientManager.serverTimeStamp
|
||||
local remainTime = endTime - curTime
|
||||
if remainTime < 0 then
|
||||
self._mapNode.goActTime.gameObject:SetActive(false)
|
||||
return
|
||||
end
|
||||
local sTimeStr = ""
|
||||
if remainTime <= 60 then
|
||||
local sec = math.floor(remainTime)
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
|
||||
elseif 60 < remainTime and remainTime <= 3600 then
|
||||
local min = math.floor(remainTime / 60)
|
||||
local sec = math.floor(remainTime - min * 60)
|
||||
if sec == 0 then
|
||||
min = min - 1
|
||||
sec = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
|
||||
elseif 3600 < remainTime and remainTime <= 86400 then
|
||||
local hour = math.floor(remainTime / 3600)
|
||||
local min = math.floor((remainTime - hour * 3600) / 60)
|
||||
if min == 0 then
|
||||
hour = hour - 1
|
||||
min = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
|
||||
elseif 86400 < remainTime then
|
||||
local day = math.floor(remainTime / 86400)
|
||||
local hour = math.floor((remainTime - day * 86400) / 3600)
|
||||
if hour == 0 then
|
||||
day = day - 1
|
||||
hour = 24
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
|
||||
end
|
||||
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:RefreshActData()
|
||||
self.nActId = self._panel.nActId
|
||||
self.actData = self._panel.actData
|
||||
self.remainTimer = nil
|
||||
self:RefreshRewardList()
|
||||
local actCfg = self.actData:GetActCfgData()
|
||||
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
|
||||
self._mapNode.goActTime.gameObject:SetActive(false)
|
||||
else
|
||||
self._mapNode.goActTime.gameObject:SetActive(true)
|
||||
self:RefreshRemainTime()
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:RefreshRewardList()
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
if nil ~= tbRewardList then
|
||||
for k, v in ipairs(self._mapNode.goRewardItem) do
|
||||
local mapReward = tbRewardList[k]
|
||||
v.gameObject:SetActive(mapReward ~= nil)
|
||||
if mapReward ~= nil then
|
||||
v:SetRewardItem(k, mapReward)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:PlayOutAnim()
|
||||
local nAnimLength = 0
|
||||
if self.animRoot ~= nil then
|
||||
nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
|
||||
"LoginReward_01_out"
|
||||
})
|
||||
self.animRoot:Play("LoginReward_01_out")
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
|
||||
end
|
||||
return nAnimLength
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:Awake()
|
||||
self.animRoot = self.gameObject:GetComponent("Animator")
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnEnable()
|
||||
if self.animRoot ~= nil then
|
||||
local nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
|
||||
"LoginReward_01_in"
|
||||
})
|
||||
self.animRoot:Play("LoginReward_01_in")
|
||||
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
|
||||
end
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnDisable()
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnDestroy()
|
||||
end
|
||||
function LoginRewardPopUpCtrl_01:OnBtnClick_Activity()
|
||||
local bOpen = self.actData:CheckActivityOpen()
|
||||
if not bOpen then
|
||||
local callback = function()
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
end
|
||||
EventManager.Hit(EventId.OpenMessageBox, {
|
||||
nType = AllEnum.MessageBox.Alert,
|
||||
sContent = ConfigTable.GetUIText("Activity_PopUp_Time_Out"),
|
||||
callbackConfirm = callback
|
||||
})
|
||||
return
|
||||
end
|
||||
local canReceive = self.actData:CheckCanReceive()
|
||||
if not canReceive then
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
return
|
||||
end
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
local nReceive = self.actData:GetCanReceive()
|
||||
local mapNpc = {
|
||||
nNpcId = tbRewardList[nReceive].NpcId,
|
||||
nVoiceId = tbRewardList[nReceive].VoiceId
|
||||
}
|
||||
local callback = function()
|
||||
EventManager.Hit("RefreshLoginRewardPanel")
|
||||
end
|
||||
PlayerData.Activity:SendReceiveLoginRewardMsg(self.nActId, callback)
|
||||
end
|
||||
return LoginRewardPopUpCtrl_01
|
||||
@@ -0,0 +1,173 @@
|
||||
local LoginRewardCtrl_List = class("LoginRewardCtrl_List", BaseCtrl)
|
||||
local TimerManager = require("GameCore.Timer.TimerManager")
|
||||
local ClientManager = CS.ClientManager.Instance
|
||||
LoginRewardCtrl_List._mapNodeConfig = {
|
||||
btnDetail = {
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Detail"
|
||||
},
|
||||
txtDetail = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "Activity_Btn_Detail"
|
||||
},
|
||||
goActTime = {},
|
||||
txtActivityTime = {sComponentName = "TMP_Text"},
|
||||
goRewardItem = {
|
||||
nCount = 7,
|
||||
sCtrlName = "Game.UI.Activity.LoginReward.LoginRewardItemCtrl_01"
|
||||
},
|
||||
btnRewardItem = {
|
||||
nCount = 7,
|
||||
sComponentName = "UIButton",
|
||||
callback = "OnBtnClick_Item"
|
||||
},
|
||||
btnActivity = {
|
||||
sComponentName = "Button",
|
||||
callback = "OnBtnClick_Activity"
|
||||
}
|
||||
}
|
||||
LoginRewardCtrl_List._mapEventConfig = {
|
||||
ClickLoginRewardTips = "OnEvent_ClickLoginRewardTips"
|
||||
}
|
||||
function LoginRewardCtrl_List:RefreshRemainTime()
|
||||
local endTime = self.actData:GetActEndTime()
|
||||
local curTime = ClientManager.serverTimeStamp
|
||||
local remainTime = endTime - curTime
|
||||
if remainTime < 0 then
|
||||
TimerManager.Remove(self.remainTimer)
|
||||
self.remainTimer = nil
|
||||
EventManager.Hit(EventId.OpenMessageBox, {
|
||||
nType = AllEnum.MessageBox.Alert,
|
||||
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
|
||||
callbackConfirm = function()
|
||||
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
|
||||
end
|
||||
})
|
||||
return
|
||||
end
|
||||
local sTimeStr = ""
|
||||
if remainTime <= 60 then
|
||||
local sec = math.floor(remainTime)
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
|
||||
elseif 60 < remainTime and remainTime <= 3600 then
|
||||
local min = math.floor(remainTime / 60)
|
||||
local sec = math.floor(remainTime - min * 60)
|
||||
if sec == 0 then
|
||||
min = min - 1
|
||||
sec = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
|
||||
elseif 3600 < remainTime and remainTime <= 86400 then
|
||||
local hour = math.floor(remainTime / 3600)
|
||||
local min = math.floor((remainTime - hour * 3600) / 60)
|
||||
if min == 0 then
|
||||
hour = hour - 1
|
||||
min = 60
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
|
||||
elseif 86400 < remainTime then
|
||||
local day = math.floor(remainTime / 86400)
|
||||
local hour = math.floor((remainTime - day * 86400) / 3600)
|
||||
if hour == 0 then
|
||||
day = day - 1
|
||||
hour = 24
|
||||
end
|
||||
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
|
||||
end
|
||||
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
|
||||
end
|
||||
function LoginRewardCtrl_List:RefreshRewardList()
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
if nil ~= tbRewardList then
|
||||
local nReceiveDay = self.actData:GetCanReceive()
|
||||
self.nActual = self.actData:GetReceived()
|
||||
local canReceive = self.actData:CheckCanReceive()
|
||||
if canReceive then
|
||||
self.nSelectIndex = self.actData:GetCanReceive()
|
||||
else
|
||||
self.nSelectIndex = self.nActual
|
||||
end
|
||||
for k, v in ipairs(self._mapNode.goRewardItem) do
|
||||
local mapReward = tbRewardList[k]
|
||||
v.gameObject:SetActive(mapReward ~= nil)
|
||||
if mapReward ~= nil then
|
||||
v:SetRewardItem(k, mapReward, true, nReceiveDay == self.nActual and k == self.nActual + 1, true)
|
||||
v:SetSelect(self.nSelectIndex == k)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function LoginRewardCtrl_List:RefreshDetail()
|
||||
local mapActCfg = self.actData:GetLoginRewardControlCfg()
|
||||
local bEmpty = mapActCfg.DesText == ""
|
||||
self._mapNode.btnDetail.gameObject:SetActive(not bEmpty)
|
||||
end
|
||||
function LoginRewardCtrl_List:InitActData(actData)
|
||||
self.actData = actData
|
||||
self.nNpcId = nil
|
||||
self.bPlayVoice = false
|
||||
self:RefreshRewardList()
|
||||
self:RefreshDetail()
|
||||
local canReceive = self.actData:CheckCanReceive()
|
||||
self._mapNode.btnActivity.gameObject:SetActive(canReceive)
|
||||
local actCfg = self.actData:GetActCfgData()
|
||||
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
|
||||
self._mapNode.goActTime.gameObject:SetActive(false)
|
||||
else
|
||||
self._mapNode.goActTime.gameObject:SetActive(true)
|
||||
self:RefreshRemainTime()
|
||||
if nil == self.remainTimer then
|
||||
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
function LoginRewardCtrl_List:Awake()
|
||||
end
|
||||
function LoginRewardCtrl_List:OnEnable()
|
||||
end
|
||||
function LoginRewardCtrl_List:OnDisable()
|
||||
end
|
||||
function LoginRewardCtrl_List:OnDestroy()
|
||||
end
|
||||
function LoginRewardCtrl_List:OnBtnClick_Detail()
|
||||
local mapActCfg = self.actData:GetLoginRewardControlCfg()
|
||||
local msg = {
|
||||
nType = AllEnum.MessageBox.Desc,
|
||||
sContent = mapActCfg.DesText,
|
||||
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
|
||||
}
|
||||
EventManager.Hit(EventId.OpenMessageBox, msg)
|
||||
end
|
||||
function LoginRewardCtrl_List:OnBtnClick_Activity()
|
||||
local callback = function()
|
||||
self._mapNode.btnActivity.gameObject:SetActive(false)
|
||||
local actData = PlayerData.Activity:GetActivityDataById(self.actData:GetActId())
|
||||
self:InitActData(actData)
|
||||
end
|
||||
local canReceive = self.actData:CheckCanReceive()
|
||||
if not canReceive then
|
||||
callback()
|
||||
return
|
||||
end
|
||||
local tbRewardList = self.actData:GetActLoginRewardList()
|
||||
local nReceive = self.actData:GetCanReceive()
|
||||
local mapNpc = {
|
||||
nNpcId = tbRewardList[nReceive].NpcId,
|
||||
nVoiceId = tbRewardList[nReceive].VoiceId
|
||||
}
|
||||
PlayerData.Activity:SendReceiveLoginRewardMsg(self.actData:GetActId(), callback, mapNpc)
|
||||
end
|
||||
function LoginRewardCtrl_List:OnEvent_ClickLoginRewardTips(callback, index)
|
||||
callback()
|
||||
end
|
||||
function LoginRewardCtrl_List:OnBtnClick_Item(btn, nIndex)
|
||||
if nIndex > self.nActual then
|
||||
return
|
||||
end
|
||||
if self.nSelectIndex then
|
||||
self._mapNode.goRewardItem[self.nSelectIndex]:SetSelect(false)
|
||||
end
|
||||
self._mapNode.goRewardItem[nIndex]:SetSelect(true)
|
||||
self.nSelectIndex = nIndex
|
||||
end
|
||||
return LoginRewardCtrl_List
|
||||
@@ -0,0 +1,108 @@
|
||||
local LoginRewardItemCtrl_01 = class("LoginRewardItemCtrl_01", BaseCtrl)
|
||||
LoginRewardItemCtrl_01._mapNodeConfig = {
|
||||
imgCanReceiveBg = {},
|
||||
imgBg = {},
|
||||
imgPlusBg = {},
|
||||
imgDay = {nCount = 2, sComponentName = "Image"},
|
||||
item = {
|
||||
nCount = 2,
|
||||
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
|
||||
},
|
||||
btnItem = {nCount = 2, sComponentName = "UIButton"},
|
||||
txtItemName = {sComponentName = "TMP_Text"},
|
||||
goReceived = {},
|
||||
Select = {},
|
||||
imgCanReceive = {},
|
||||
txtCanReceive = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "LoginReward_Can_Receive"
|
||||
},
|
||||
imgNextReceive = {},
|
||||
txtNextReceive = {
|
||||
sComponentName = "TMP_Text",
|
||||
sLanguageId = "LoginReward_Next_Receive"
|
||||
},
|
||||
goParticle = {sNodeName = "UIParticle"}
|
||||
}
|
||||
LoginRewardItemCtrl_01._mapEventConfig = {}
|
||||
LoginRewardItemCtrl_01._mapRedDotConfig = {}
|
||||
function LoginRewardItemCtrl_01:SetRewardItem(nDay, mapReward, bEnableSelect, bNextDay, bClickTips)
|
||||
self.nDay = nDay
|
||||
self._mapNode.imgCanReceiveBg.gameObject:SetActive(mapReward.Status == 1)
|
||||
self._mapNode.imgBg.gameObject:SetActive(not mapReward.DisRare)
|
||||
self._mapNode.imgPlusBg.gameObject:SetActive(mapReward.DisRare)
|
||||
for _, v in ipairs(self._mapNode.imgDay) do
|
||||
self:SetAtlasSprite(v, "05_number", "zs_activity_02_num_" .. nDay)
|
||||
end
|
||||
self._mapNode.btnItem[1].gameObject:SetActive(mapReward.RewardId1 > 0)
|
||||
if mapReward.RewardId1 > 0 then
|
||||
self._mapNode.item[1]:SetItem(mapReward.RewardId1, nil, mapReward.Qty1, nil, mapReward.Status == 2)
|
||||
end
|
||||
self._mapNode.btnItem[2].gameObject:SetActive(0 < mapReward.RewardId2)
|
||||
if 0 < mapReward.RewardId2 then
|
||||
self._mapNode.item[2]:SetItem(mapReward.RewardId2, nil, mapReward.Qty2, nil, mapReward.Status == 2)
|
||||
end
|
||||
NovaAPI.SetTMPText(self._mapNode.txtItemName, mapReward.RewardDesc)
|
||||
self._mapNode.imgCanReceive.gameObject:SetActive(mapReward.Status == 1)
|
||||
self._mapNode.goReceived.gameObject:SetActive(mapReward.Status == 2)
|
||||
self._mapNode.imgNextReceive.gameObject:SetActive(bNextDay)
|
||||
self._mapNode.goParticle.gameObject:SetActive(mapReward.DisRare and mapReward.Status ~= 2)
|
||||
self:SetItemFxSate(mapReward.DisRare and mapReward.Status ~= 2)
|
||||
self:SetImgPlaySate(mapReward.Status == 2 and bEnableSelect)
|
||||
self:SetSelect(false)
|
||||
self.tbRewardList = {}
|
||||
for i = 1, 3 do
|
||||
local nTid = mapReward["RewardId" .. i]
|
||||
local nCount = mapReward["Qty" .. i]
|
||||
if nTid ~= 0 then
|
||||
table.insert(self.tbRewardList, {nTid = nTid, nCount = nCount})
|
||||
end
|
||||
end
|
||||
if bClickTips then
|
||||
if self.handler then
|
||||
self:UnBindHandler()
|
||||
end
|
||||
self:BindHandler()
|
||||
end
|
||||
end
|
||||
function LoginRewardItemCtrl_01:SetSelect(bEnable)
|
||||
self._mapNode.Select.gameObject:SetActive(bEnable)
|
||||
end
|
||||
function LoginRewardItemCtrl_01:BindHandler()
|
||||
self.handler = {}
|
||||
for i = 1, 2 do
|
||||
local comp = self._mapNode.btnItem[i]
|
||||
self.handler[i] = ui_handler(self, self.OnBtnClick_Item, comp, i)
|
||||
comp.onClick:AddListener(self.handler[i])
|
||||
end
|
||||
end
|
||||
function LoginRewardItemCtrl_01:UnBindHandler()
|
||||
for i = 1, 2 do
|
||||
local comp = self._mapNode.btnItem[i]
|
||||
comp.onClick:RemoveListener(self.handler[i])
|
||||
end
|
||||
self.handler = nil
|
||||
end
|
||||
function LoginRewardItemCtrl_01:OnBtnClick_Item(btn, index)
|
||||
local callback = function()
|
||||
UTILS.ClickItemGridWithTips(self.tbRewardList[index].nTid, btn.transform, true, true, false)
|
||||
end
|
||||
EventManager.Hit("ClickLoginRewardTips", callback, self.nDay)
|
||||
end
|
||||
function LoginRewardItemCtrl_01:SetItemFxSate(bShowFx)
|
||||
local FX = self.gameObject.transform:Find("FX")
|
||||
if FX then
|
||||
FX.gameObject:SetActive(bShowFx)
|
||||
else
|
||||
return
|
||||
end
|
||||
end
|
||||
function LoginRewardItemCtrl_01:SetImgPlaySate(bShowImgPlay)
|
||||
local ImgPlay = self.gameObject.transform:Find("imgPlay")
|
||||
if ImgPlay then
|
||||
ImgPlay.gameObject:SetActive(bShowImgPlay)
|
||||
else
|
||||
return
|
||||
end
|
||||
end
|
||||
return LoginRewardItemCtrl_01
|
||||
@@ -56,7 +56,8 @@ LoginSpRewardCtrl_List._mapNodeConfig = {
|
||||
LoginSpRewardCtrl_List._mapEventConfig = {
|
||||
ClickLoginRewardTips = "OnEvent_ClickLoginRewardTips",
|
||||
[EventId.ShowBubbleVoiceText] = "OnEvent_ShowBubbleVoiceText",
|
||||
ActivityListChangeTab = "OnEvent_ActivityListChangeTab"
|
||||
ActivityListChangeTab = "OnEvent_ActivityListChangeTab",
|
||||
[EventId.ClosePanel] = "OnEvent_ClosePanel"
|
||||
}
|
||||
function LoginSpRewardCtrl_List:RefreshRemainTime()
|
||||
local endTime = self.actData:GetActEndTime()
|
||||
@@ -284,4 +285,10 @@ function LoginSpRewardCtrl_List:OnEvent_ActivityListChangeTab(nId)
|
||||
PlayerVoiceData:StopCharVoice()
|
||||
end
|
||||
end
|
||||
function LoginSpRewardCtrl_List:OnEvent_ClosePanel(nPanelId)
|
||||
if nPanelId == PanelId.DiscSample then
|
||||
self.bPlayVoice = false
|
||||
self:PlayVoice()
|
||||
end
|
||||
end
|
||||
return LoginSpRewardCtrl_List
|
||||
|
||||
@@ -48,6 +48,7 @@ function LoginSpRewardItemCtrl:SetRewardItem(nDay, mapReward, bEnableSelect, bNe
|
||||
self._mapNode.goReceived.gameObject:SetActive(mapReward.Status == 2)
|
||||
self._mapNode.imgNextReceive.gameObject:SetActive(bNextDay)
|
||||
self._mapNode.goParticle.gameObject:SetActive(mapReward.DisRare and mapReward.Status ~= 2)
|
||||
self:SetItemFxSate(mapReward.DisRare and mapReward.Status ~= 2)
|
||||
self._mapNode.imgPlay.gameObject:SetActive(mapReward.Status == 2 and bEnableSelect)
|
||||
self:SetSelect(false)
|
||||
self.tbRewardList = {}
|
||||
@@ -89,4 +90,12 @@ function LoginSpRewardItemCtrl:OnBtnClick_Item(btn, index)
|
||||
end
|
||||
EventManager.Hit("ClickLoginRewardTips", callback, self.nDay)
|
||||
end
|
||||
function LoginSpRewardItemCtrl:SetItemFxSate(bShowFx)
|
||||
local FX = self.gameObject.transform:Find("FX")
|
||||
if FX then
|
||||
FX.gameObject:SetActive(bShowFx)
|
||||
else
|
||||
return
|
||||
end
|
||||
end
|
||||
return LoginSpRewardItemCtrl
|
||||
|
||||
@@ -8,7 +8,7 @@ ActivityMiningCtrl._mapNodeConfig = {
|
||||
callback = "OnBtnClick_Go"
|
||||
}
|
||||
}
|
||||
function ActivityMiningCtrl:OnDestory(...)
|
||||
function ActivityMiningCtrl:OnDestroy(...)
|
||||
self:UnInit()
|
||||
end
|
||||
function ActivityMiningCtrl:InitActData(actData)
|
||||
|
||||
@@ -47,13 +47,7 @@ function ThrowGiftItemSelectCtrl:OnDestroy()
|
||||
end
|
||||
function ThrowGiftItemSelectCtrl:OnRelease()
|
||||
end
|
||||
function ThrowGiftItemSelectCtrl:OpenPanel(tbItem, callback, curIdx)
|
||||
GamepadUIManager.EnableGamepadUI("ThrowGiftItemSelectCtrl", self.tbGamepadUINode)
|
||||
self.curPosIdx = curIdx
|
||||
self.gameObject:SetActive(true)
|
||||
self.callback = callback
|
||||
self.bSelected = false
|
||||
self.curIdx = 0
|
||||
function ThrowGiftItemSelectCtrl:Refresh(tbItem)
|
||||
self._mapNode.btnItemSelectCtrl[1]:Refresh(tbItem[1])
|
||||
self._mapNode.btnItemSelectCtrl[2]:Refresh(tbItem[2])
|
||||
self._mapNode.btnItemSelectCtrl[1]:SetSelect(false)
|
||||
@@ -67,6 +61,18 @@ function ThrowGiftItemSelectCtrl:OpenPanel(tbItem, callback, curIdx)
|
||||
WwiseAudioMgr:PostEvent("Mode_Present_intensify")
|
||||
self:ResetSelect(self._mapNode.btnItemSelect)
|
||||
end
|
||||
function ThrowGiftItemSelectCtrl:OpenPanel(tbItem, callback, curIdx)
|
||||
GamepadUIManager.EnableGamepadUI("ThrowGiftItemSelectCtrl", self.tbGamepadUINode)
|
||||
self.curPosIdx = curIdx
|
||||
self.gameObject:SetActive(true)
|
||||
self.callback = callback
|
||||
self.bSelected = false
|
||||
self.curIdx = 0
|
||||
self.tbItems = tbItem
|
||||
self.nCurItemsIdx = 1
|
||||
self.tbResultIdx = {}
|
||||
self:Refresh(self.tbItems[self.nCurItemsIdx])
|
||||
end
|
||||
function ThrowGiftItemSelectCtrl:ResetSelect(tbUI)
|
||||
self.curIdx = 0
|
||||
GamepadUIManager.SetNavigation(tbUI)
|
||||
@@ -109,34 +115,48 @@ function ThrowGiftItemSelectCtrl:OnEvent_ThrowGiftItemSelectConfirmClick()
|
||||
end
|
||||
self.bSelected = true
|
||||
self._mapNode.btnItemSelectCtrl[self.curIdx]:PlaySelectAnim()
|
||||
WwiseAudioMgr:PostEvent("Mode_Present_intensify_ok")
|
||||
local endPos = self._mapNode.rtPos[self.curPosIdx].transform.position
|
||||
local beginPos = self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.position
|
||||
local controlPos = Vector3(3, 5, 0)
|
||||
for i = 1, 2 do
|
||||
self._mapNode.btnItemSelectCtrl[i].gameObject:SetActive(i == self.curIdx)
|
||||
end
|
||||
local wait = function()
|
||||
local totalMoveTime = 0.3
|
||||
local moveTime = 0
|
||||
local normalizedTime = 0
|
||||
while normalizedTime < 1 do
|
||||
moveTime = moveTime + CS.UnityEngine.Time.unscaledDeltaTime
|
||||
normalizedTime = moveTime / totalMoveTime
|
||||
normalizedTime = normalizedTime <= 1 and normalizedTime or 1
|
||||
local x, y, z = UTILS.GetBezierPointByT(beginPos, controlPos, endPos, normalizedTime)
|
||||
local angleZ = -180 * normalizedTime
|
||||
self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.localEulerAngles = Vector3(0, 0, angleZ)
|
||||
self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.position = Vector3(x, y, z)
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
table.insert(self.tbResultIdx, self.curIdx)
|
||||
if self.nCurItemsIdx < #self.tbItems then
|
||||
self.nCurItemsIdx = self.nCurItemsIdx + 1
|
||||
self:Refresh(self.tbItems[self.nCurItemsIdx])
|
||||
else
|
||||
WwiseAudioMgr:PostEvent("Mode_Present_intensify_ok")
|
||||
local endPos = self._mapNode.rtPos[self.curPosIdx].transform.position
|
||||
local beginPos = self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.position
|
||||
local controlPos = Vector3(3, 5, 0)
|
||||
for i = 1, 2 do
|
||||
self._mapNode.btnItemSelectCtrl[i].gameObject:SetActive(i == self.curIdx)
|
||||
end
|
||||
if self.callback ~= nil and type(self.callback) == "function" then
|
||||
self.callback(self.curIdx)
|
||||
local wait = function()
|
||||
local totalMoveTime = 0.3
|
||||
local moveTime = 0
|
||||
local normalizedTime = 0
|
||||
while normalizedTime < 1 do
|
||||
moveTime = moveTime + CS.UnityEngine.Time.unscaledDeltaTime
|
||||
normalizedTime = moveTime / totalMoveTime
|
||||
normalizedTime = normalizedTime <= 1 and normalizedTime or 1
|
||||
local x, y, z = UTILS.GetBezierPointByT(beginPos, controlPos, endPos, normalizedTime)
|
||||
local angleZ = -180 * normalizedTime
|
||||
self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.localEulerAngles = Vector3(0, 0, angleZ)
|
||||
self._mapNode.btnItemSelectCtrl[self.curIdx].gameObject.transform.position = Vector3(x, y, z)
|
||||
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
||||
end
|
||||
if self.callback ~= nil and type(self.callback) == "function" then
|
||||
self.callback(self.tbResultIdx)
|
||||
end
|
||||
self.gameObject:SetActive(false)
|
||||
GamepadUIManager.DisableGamepadUI("ThrowGiftItemSelectCtrl")
|
||||
end
|
||||
if #self.tbResultIdx <= 1 then
|
||||
cs_coroutine.start(wait)
|
||||
else
|
||||
if self.callback ~= nil and type(self.callback) == "function" then
|
||||
self.callback(self.tbResultIdx)
|
||||
end
|
||||
self.gameObject:SetActive(false)
|
||||
GamepadUIManager.DisableGamepadUI("ThrowGiftItemSelectCtrl")
|
||||
end
|
||||
self.gameObject:SetActive(false)
|
||||
GamepadUIManager.DisableGamepadUI("ThrowGiftItemSelectCtrl")
|
||||
end
|
||||
cs_coroutine.start(wait)
|
||||
end
|
||||
function ThrowGiftItemSelectCtrl:OnEvent_GamepadUIChange(sName, nBeforeType, nAfterType)
|
||||
if sName ~= "ThrowGiftItemSelectCtrl" then
|
||||
|
||||
@@ -201,7 +201,7 @@ end
|
||||
function ThrowGiftCtrl:SetTarget(nCur)
|
||||
NovaAPI.SetTMPText(self._mapNode.TMPTarget, string.format(self.mapLevelCfgData.ThrowGiftLevelCondDesc .. " (<color=#08d3d4>%d</color>/%d)", nCur, self.mapLevelCfgData.throwGiftLevelParams))
|
||||
end
|
||||
function ThrowGiftCtrl:OpenItemSelect(tbItem, selectCallback)
|
||||
function ThrowGiftCtrl:OpenItemSelect(tbItems, selectCallback)
|
||||
local pos = 1
|
||||
if self.nCurItem[1] == 0 or self.nCurItem[1] == nil then
|
||||
pos = 1
|
||||
@@ -210,14 +210,23 @@ function ThrowGiftCtrl:OpenItemSelect(tbItem, selectCallback)
|
||||
elseif self.tbItemIdx[1] > self.tbItemIdx[2] then
|
||||
pos = 2
|
||||
end
|
||||
local callback = function(nIdx)
|
||||
local callback = function(tbIdx)
|
||||
if selectCallback ~= nil and type(selectCallback) == "function" then
|
||||
selectCallback(nIdx)
|
||||
selectCallback(tbIdx)
|
||||
end
|
||||
if #tbItems <= 1 then
|
||||
self.nCurItem[pos] = tbItems[1][tbIdx[1]]
|
||||
self.tbItemIdx[pos] = math.max(self.tbItemIdx[1], self.tbItemIdx[2]) + 1
|
||||
self._mapNode.rtItem[pos]:SetItem(tbItems[1][tbIdx[1]])
|
||||
self._mapNode.rtItem[pos]:PlayAnim(3)
|
||||
else
|
||||
self.tbItemIdx[1] = self.tbItemIdx[1] + 1
|
||||
self.tbItemIdx[2] = self.tbItemIdx[2] + 1
|
||||
self._mapNode.rtItem[1]:SetItem(tbItems[1][tbIdx[1]])
|
||||
self._mapNode.rtItem[1]:PlayAnim(3)
|
||||
self._mapNode.rtItem[2]:SetItem(tbItems[2][tbIdx[2]])
|
||||
self._mapNode.rtItem[2]:PlayAnim(3)
|
||||
end
|
||||
self.nCurItem[pos] = tbItem[nIdx]
|
||||
self.tbItemIdx[pos] = math.max(self.tbItemIdx[1], self.tbItemIdx[2]) + 1
|
||||
self._mapNode.rtItem[pos]:SetItem(tbItem[nIdx])
|
||||
self._mapNode.rtItem[pos]:PlayAnim(3)
|
||||
end
|
||||
self._mapNode.rtItemSelect:OpenPanel(tbItem, callback, pos)
|
||||
end
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user