Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

446 lines
15 KiB
Lua

local EquipmentInfoCtrl = class("EquipmentInfoCtrl", BaseCtrl)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
EquipmentInfoCtrl._mapNodeConfig = {
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
btnCloseBg = {
sNodeName = "snapshot",
sComponentName = "Button",
callback = "OnBtnClick_Close"
},
txtWindowTitle = {sComponentName = "TMP_Text"},
window = {},
aniWindow = {sNodeName = "window", sComponentName = "Animator"},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnNext = {
sComponentName = "UIButton",
callback = "OnBtnClick_Next"
},
btnPre = {
sComponentName = "UIButton",
callback = "OnBtnClick_Pre"
},
btnNextLock = {
sComponentName = "UIButton",
callback = "OnBtnClick_NextLock"
},
btnPreLock = {
sComponentName = "UIButton",
callback = "OnBtnClick_PreLock"
},
txtEquipmentName = {nCount = 2, sComponentName = "TMP_Text"},
imgEquipmentUp = {nCount = 2},
goPoint = {},
trPoint = {sComponentName = "Transform"},
imgIcon = {nCount = 2, sComponentName = "Transform"},
txtEquiped = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Equipped"
},
imgEquiped = {},
txtLockSwitch = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Roll_LockRoll"
},
btnSwitch = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_Switch"
},
aniIconMask = {sNodeName = "IconMask", sComponentName = "Animator"},
goSwitch = {},
Info = {sNodeName = "--Info--"},
aniInfo = {sNodeName = "--Info--", sComponentName = "Animator"},
goProperty = {
nCount = 4,
sCtrlName = "Game.UI.TemplateEx.TemplateRandomPropertyCtrl"
},
btnEquip = {
sComponentName = "UIButton",
callback = "OnBtnClick_Equip"
},
btnRoll = {
sComponentName = "UIButton",
callback = "OnBtnClick_Roll"
},
btnUnload = {
sComponentName = "UIButton",
callback = "OnBtnClick_Unload"
},
btnUpgrade = {
sComponentName = "UIButton",
callback = "OnBtnClick_Upgrade"
},
txtBtnEquip = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Btn_Equip"
},
txtBtnRoll = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Btn_GotoRoll"
},
txtBtnUnload = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Btn_Unload"
},
txtBtnUpgrade = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Btn_Upgrade"
},
Active = {sNodeName = "--Active--"},
txtTitleMat = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Active_Material"
},
goMat = {
sCtrlName = "Game.UI.TemplateEx.TemplateMatCtrl"
},
btnAdd = {
sComponentName = "UIButton",
callback = "OnBtnClick_MatTip"
},
txtActiveTip = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Active_AttrTip"
},
btnActive = {
sComponentName = "UIButton",
callback = "OnBtnClick_Active"
},
txtBtnActive = {
sComponentName = "TMP_Text",
sLanguageId = "Equipment_Btn_Active"
},
FX = {sNodeName = "--FX--"}
}
EquipmentInfoCtrl._mapEventConfig = {}
function EquipmentInfoCtrl:Open()
self._mapNode.blur:SetActive(true)
self:PlayInAni()
self:Init()
self:Refresh()
self:RefreshPoint()
end
function EquipmentInfoCtrl:Init()
local nGemId = PlayerData.Equipment:GetGemIdBySlot(self.nCharId, self.nSlotId)
self.mapGemCfg = ConfigTable.GetData("CharGem", nGemId)
self.mapSlotCfg = ConfigTable.GetData("CharGemSlotControl", self.nSlotId)
self.nSubSelectIndex = 1
self.tbEquipmentIcon = {}
for i = 1, 2 do
local equipPrefab
local sPrefab = self.mapGemCfg.Icon .. ".prefab"
if GameResourceLoader.ExistsAsset(Settings.AB_ROOT_PATH .. sPrefab) == true then
equipPrefab = self:LoadAsset(sPrefab)
end
if equipPrefab then
delChildren(self._mapNode.imgIcon[i])
self.tbEquipmentIcon[i] = instantiate(equipPrefab, self._mapNode.imgIcon[i])
end
end
self.tbPoint = {}
delChildren(self._mapNode.trPoint)
for i = 1, self.mapSlotCfg.MaxAlterNum do
local obj = instantiate(self._mapNode.goPoint, self._mapNode.trPoint)
obj:SetActive(true)
table.insert(self.tbPoint, obj)
end
end
function EquipmentInfoCtrl:Refresh(bAfterActive)
local tbEquipment = PlayerData.Equipment:GetEquipmentBySlot(self.nCharId, self.nSlotId)
local mapEquipment = tbEquipment[self.nSelectGemIndex]
local bEmpty = mapEquipment == nil
self:RefreshTop()
self:RefreshSwitch(tbEquipment)
if bAfterActive then
self._mapNode.FX:SetActive(false)
self._mapNode.FX:SetActive(true)
local callback = function()
self._mapNode.Info:SetActive(not bEmpty)
self._mapNode.Active:SetActive(bEmpty)
self._mapNode.aniInfo:Play("EquipmentInfoPanel_Info")
WwiseAudioMgr:PostEvent("ui_charInfo_equipment_coagulate_ani")
end
self:AddTimer(1, 0.07, callback, true, true, true)
else
self._mapNode.Info:SetActive(not bEmpty)
self._mapNode.Active:SetActive(bEmpty)
end
if not bEmpty then
self:RefreshInfo(mapEquipment)
else
self:RefreshActive()
end
end
function EquipmentInfoCtrl:RefreshSwitch(tbEquipment)
local nCount = 0
for i = 1, self.mapSlotCfg.MaxAlterNum do
if tbEquipment[i] ~= nil then
nCount = nCount + 1
end
end
if nCount >= self.mapSlotCfg.MaxAlterNum - 1 then
self._mapNode.btnPre.gameObject:SetActive(true)
self._mapNode.btnPreLock.gameObject:SetActive(false)
self._mapNode.btnNext.gameObject:SetActive(true)
self._mapNode.btnNextLock.gameObject:SetActive(false)
return
end
local bCurEmpty = tbEquipment[self.nSelectGemIndex] == nil
local nNext = 0
if self.mapSlotCfg.MaxAlterNum == self.nSelectGemIndex then
nNext = 1
else
nNext = self.nSelectGemIndex + 1
end
local bNextEmpty = tbEquipment[nNext] == nil
self._mapNode.btnNext.gameObject:SetActive(not bCurEmpty or not bNextEmpty)
self._mapNode.btnNextLock.gameObject:SetActive(bCurEmpty and bNextEmpty)
self._mapNode.btnPre.gameObject:SetActive(1 < self.nSelectGemIndex)
self._mapNode.btnPreLock.gameObject:SetActive(self.nSelectGemIndex == 1)
end
function EquipmentInfoCtrl:RefreshTop()
local sRoman = ConfigTable.GetUIText("RomanNumeral_" .. self.nSelectGemIndex)
local sSuf = orderedFormat(ConfigTable.GetUIText("Equipment_NameIndexSuffix"), sRoman)
NovaAPI.SetTMPText(self._mapNode.txtEquipmentName[self.nSubSelectIndex], self.mapGemCfg.Title .. sSuf)
self._mapNode.imgEquiped:SetActive(self.nEquipedGemIndex == self.nSelectGemIndex)
local tbEquipment = PlayerData.Equipment:GetEquipmentBySlot(self.nCharId, self.nSlotId)
local mapEquipment = tbEquipment[self.nSelectGemIndex]
local bUpgrade = mapEquipment and mapEquipment:GetUpgradeCount() > 0
self._mapNode.imgEquipmentUp[self.nSubSelectIndex]:SetActive(bUpgrade)
if self.tbEquipmentIcon[self.nSubSelectIndex] then
self.tbEquipmentIcon[self.nSubSelectIndex].transform:Find("goFx").gameObject:SetActive(bUpgrade)
end
self:RefreshLock()
end
function EquipmentInfoCtrl:RefreshInfo(mapEquipment)
NovaAPI.SetTMPText(self._mapNode.txtWindowTitle, ConfigTable.GetUIText("Equipment_Title_Info"))
self._mapNode.btnEquip.gameObject:SetActive(self.nEquipedGemIndex ~= self.nSelectGemIndex)
self._mapNode.btnUnload.gameObject:SetActive(self.nEquipedGemIndex == self.nSelectGemIndex)
if self.nEquipedGemIndex == 0 then
NovaAPI.SetTMPText(self._mapNode.txtBtnEquip, ConfigTable.GetUIText("Equipment_Btn_Equip"))
else
NovaAPI.SetTMPText(self._mapNode.txtBtnEquip, ConfigTable.GetUIText("Equipment_Btn_Replace"))
end
for i = 1, 4 do
self._mapNode.goProperty[i]:SetProperty(mapEquipment.tbAffix[i], self.nCharId, false, mapEquipment.tbUpgradeCount[i])
end
end
function EquipmentInfoCtrl:RefreshActive()
NovaAPI.SetTMPText(self._mapNode.txtWindowTitle, ConfigTable.GetUIText("Equipment_Title_Active"))
self._mapNode.goMat:SetMat(self.mapGemCfg.GenerateCostTid, self.mapSlotCfg.GeneratenCostQty)
end
function EquipmentInfoCtrl:RefreshPoint()
local tbEquipment = PlayerData.Equipment:GetEquipmentBySlot(self.nCharId, self.nSlotId)
local bFirstEmpty = true
for i = 1, self.mapSlotCfg.MaxAlterNum do
local obj = self.tbPoint[i]
local on = obj.transform:Find("imgPointOn").gameObject
local off = obj.transform:Find("imgPointOff").gameObject
local lock = obj.transform:Find("imgPointLock").gameObject
local mapEquipment = tbEquipment[i]
local bEmpty = mapEquipment == nil
local bLock = not bFirstEmpty and bEmpty
if bFirstEmpty and bEmpty then
bFirstEmpty = false
end
on:SetActive(self.nSelectGemIndex == i)
off:SetActive(self.nSelectGemIndex ~= i and not bLock)
lock:SetActive(bLock)
end
end
function EquipmentInfoCtrl:RefreshSelectPoint(nBefore, nAfter)
local goBefore = self.tbPoint[nBefore]
goBefore.transform:Find("imgPointOn").gameObject:SetActive(false)
goBefore.transform:Find("imgPointOff").gameObject:SetActive(true)
local goCur = self.tbPoint[nAfter]
goCur.transform:Find("imgPointOn").gameObject:SetActive(true)
goCur.transform:Find("imgPointOff").gameObject:SetActive(false)
end
function EquipmentInfoCtrl:RefreshLock()
local tbEquipment = PlayerData.Equipment:GetEquipmentBySlot(self.nCharId, self.nSlotId)
local mapEquipment = tbEquipment[self.nSelectGemIndex]
local bEmpty = mapEquipment == nil
self._mapNode.goSwitch:SetActive(not bEmpty)
if not bEmpty then
self._mapNode.btnSwitch[1].gameObject:SetActive(not mapEquipment.bLock)
self._mapNode.btnSwitch[2].gameObject:SetActive(mapEquipment.bLock)
end
end
function EquipmentInfoCtrl:PlayInAni()
self._mapNode.window:SetActive(true)
self._mapNode.aniWindow:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function EquipmentInfoCtrl:PlayOutAni()
self._mapNode.aniWindow:Play("t_window_04_t_out")
self._mapNode.aniBlur:SetTrigger("tOut")
self:AddTimer(1, 0.2, "Close", true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
function EquipmentInfoCtrl:Close()
self._mapNode.window:SetActive(false)
EventManager.Hit(EventId.ClosePanel, PanelId.EquipmentInfo)
end
function EquipmentInfoCtrl:Awake()
self._mapNode.window:SetActive(false)
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.nCharId = tbParam[1]
self.nSlotId = tbParam[2]
self.nEquipedGemIndex = tbParam[3]
self.nSelectGemIndex = tbParam[4]
if self.nSelectGemIndex == nil then
self.nSelectGemIndex = self.nEquipedGemIndex == 0 and 1 or self.nEquipedGemIndex
end
PlayerData.Equipment:CacheEquipmentSelect(self.nSlotId, self.nSelectGemIndex, self.nCharId)
end
end
function EquipmentInfoCtrl:OnEnable()
self:Open()
end
function EquipmentInfoCtrl:OnDisable()
if self.timer ~= nil then
self.timer:Cancel()
end
end
function EquipmentInfoCtrl:OnDestroy()
end
function EquipmentInfoCtrl:OnBtnClick_Close()
self:PlayOutAni()
end
function EquipmentInfoCtrl:OnBtnClick_Next()
if self.timer ~= nil then
self.timer:Cancel()
end
local nBefore = self.nSelectGemIndex
if self.mapSlotCfg.MaxAlterNum == self.nSelectGemIndex then
self.nSelectGemIndex = 1
else
self.nSelectGemIndex = self.nSelectGemIndex + 1
end
PlayerData.Equipment:CacheEquipmentSelect(self.nSlotId, self.nSelectGemIndex, self.nCharId)
self.nSubSelectIndex = 2
self._mapNode.aniIconMask:Play("IconMaskSwitch_R")
self:RefreshSelectPoint(nBefore, self.nSelectGemIndex)
self:Refresh()
local callback = function()
self.nSubSelectIndex = 1
self:RefreshTop()
end
local nAnimTime = NovaAPI.GetAnimClipLength(self._mapNode.aniIconMask, {
"IconMaskSwitch_R"
})
self.timer = self:AddTimer(1, nAnimTime, callback, true, true, true)
end
function EquipmentInfoCtrl:OnBtnClick_Pre()
if self.timer ~= nil then
self.timer:Cancel()
end
local nBefore = self.nSelectGemIndex
if 1 == self.nSelectGemIndex then
self.nSelectGemIndex = self.mapSlotCfg.MaxAlterNum
else
self.nSelectGemIndex = self.nSelectGemIndex - 1
end
PlayerData.Equipment:CacheEquipmentSelect(self.nSlotId, self.nSelectGemIndex, self.nCharId)
self.nSubSelectIndex = 2
self._mapNode.aniIconMask:Play("IconMaskSwitch_L")
self:RefreshSelectPoint(nBefore, self.nSelectGemIndex)
self:Refresh()
local callback = function()
self.nSubSelectIndex = 1
self:RefreshTop()
end
local nAnimTime = NovaAPI.GetAnimClipLength(self._mapNode.aniIconMask, {
"IconMaskSwitch_L"
})
self.timer = self:AddTimer(1, nAnimTime, callback, true, true, true)
end
function EquipmentInfoCtrl:OnBtnClick_NextLock()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Equipment_SlotGemEmpty"))
end
function EquipmentInfoCtrl:OnBtnClick_PreLock()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Equipment_SlotGemEmpty"))
end
function EquipmentInfoCtrl:OnBtnClick_Equip()
local nSelectPreset = PlayerData.Equipment:GetSelectPreset(self.nCharId)
local callback = function()
self.nEquipedGemIndex = self.nSelectGemIndex
self:Refresh()
EventManager.Hit("EquipmentSlotChanged")
end
PlayerData.Equipment:SendCharGemEquipGemReq(self.nCharId, self.nSlotId, self.nSelectGemIndex, nSelectPreset, callback)
end
function EquipmentInfoCtrl:OnBtnClick_Roll()
EventManager.Hit(EventId.ClosePanel, PanelId.EquipmentInfo)
EventManager.Hit(EventId.OpenPanel, PanelId.EquipmentRoll, self.nCharId, self.nSlotId, self.nSelectGemIndex, self.nEquipedGemIndex)
end
function EquipmentInfoCtrl:OnBtnClick_Unload()
local nSelectPreset = PlayerData.Equipment:GetSelectPreset(self.nCharId)
local callback = function()
self.nEquipedGemIndex = 0
self:Refresh()
EventManager.Hit("EquipmentSlotChanged")
end
PlayerData.Equipment:SendCharGemEquipGemReq(self.nCharId, self.nSlotId, 0, nSelectPreset, callback)
end
function EquipmentInfoCtrl:OnBtnClick_Upgrade()
local tbEquipment = PlayerData.Equipment:GetEquipmentBySlot(self.nCharId, self.nSlotId)
local mapEquipment = tbEquipment[self.nSelectGemIndex]
if mapEquipment and mapEquipment.bLock then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Equipment_UpgradeAfterUnlock"))
return
end
self._mapNode.aniWindow:Play("t_window_04_t_out")
self._mapNode.aniBlur:SetTrigger("tOut")
self:AddTimer(1, 0.2, function()
PlayerData.Equipment:ClearEquipmentSelect()
EventManager.Hit(EventId.ClosePanel, PanelId.EquipmentInfo)
EventManager.Hit(EventId.OpenPanel, PanelId.EquipmentUpgrade, self.nCharId, self.nSlotId, self.nSelectGemIndex)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
function EquipmentInfoCtrl:OnBtnClick_MatTip(btn)
if self.mapGemCfg.GenerateCostTid > 0 then
local mapData = {
nTid = self.mapGemCfg.GenerateCostTid,
nNeedCount = self.mapSlotCfg.GeneratenCostQty,
bShowDepot = true,
bShowJumpto = true
}
EventManager.Hit(EventId.OpenPanel, PanelId.ItemTips, btn.transform, mapData)
end
end
function EquipmentInfoCtrl:OnBtnClick_Active()
local nHas = PlayerData.Item:GetItemCountByID(self.mapGemCfg.GenerateCostTid)
if nHas < self.mapSlotCfg.GeneratenCostQty then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Equipment_MatNotEnough_Active"))
self:OnBtnClick_MatTip(self._mapNode.btnAdd)
return
end
local callback = function()
self:RefreshPoint()
PlayerData.Equipment:CacheEquipmentSelect(self.nSlotId, self.nSelectGemIndex, self.nCharId)
self:Refresh(true)
end
PlayerData.Equipment:SendCharGemGenerateReq(self.nCharId, self.nSlotId, self.nSelectGemIndex, callback)
end
function EquipmentInfoCtrl:OnBtnClick_Switch(btn, nIndex)
local bLock = nIndex == 1
local callback = function()
self:RefreshLock()
end
PlayerData.Equipment:SendCharGemUpdateGemLockStatusReq(self.nCharId, self.nSlotId, self.nSelectGemIndex, bLock, callback)
end
return EquipmentInfoCtrl