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:
SL1900
2026-04-18 00:15:00 +09:00
parent 35fe1f046d
commit e0549005e1
1150 changed files with 941124 additions and 19847 deletions
@@ -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