Files
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

251 lines
7.7 KiB
Lua

local CharTalentDetailTrialCtrl = class("CharTalentDetailTrialCtrl", BaseCtrl)
CharTalentDetailTrialCtrl._mapNodeConfig = {
Info = {
sNodeName = "--Info--",
sCtrlName = "Game.UI.CharacterInfoTrial.CharTalentInfoTrialCtrl"
},
animInfo = {sNodeName = "--Info--", sComponentName = "Animator"},
goKeyReady = {},
imgKeyOff = {},
imgKeyOn = {},
goKeySelect = {},
btnKey = {
sComponentName = "UIButton",
callback = "OnBtnClick_Key"
},
Node = {
nCount = 10,
sCtrlName = "Game.UI.CharacterInfoEx.TalentNodeCtrl"
},
btnNode = {
nCount = 10,
sComponentName = "UIButton",
callback = "OnBtnClick_Node"
},
btnBack = {
sComponentName = "UIButton",
callback = "OnBtnClick_Back"
}
}
CharTalentDetailTrialCtrl._mapEventConfig = {
ActiveTalent = "OnEvent_ActiveTalent"
}
function CharTalentDetailTrialCtrl:Refresh(nSelectGroupIndex, nSelectGroupId, bSkipIn)
self.gameObject:SetActive(true)
if bSkipIn then
self._mapNode.animInfo:Play("CharTalent_info_in", 0, 0.7)
else
self._mapNode.animInfo:Play("CharTalent_info_in")
end
self.nCharId = self._panel.nCharId
self.nSelectGroupIndex = nSelectGroupIndex
self.nSelectGroupId = nSelectGroupId
self:RefreshData()
self:RefreshNode()
self:DefaultSelect()
end
function CharTalentDetailTrialCtrl:RefreshData()
local tbTalent, tbGroup = PlayerData.Talent:CreateNewTalentData(self.nCharId)
local nFirstGroup = tbTalent.nFirstGroup
local mapCurGroup = tbGroup[nFirstGroup]
self.tbGroup = {}
while mapCurGroup do
table.insert(self.tbGroup, mapCurGroup)
mapCurGroup = tbGroup[mapCurGroup.nNext]
end
self.mapTalent = tbTalent
self.nGroupNodeLimit = 0
local mapGroupCfg = ConfigTable.GetData("TalentGroup", self.nSelectGroupId)
if mapGroupCfg then
self.nGroupNodeLimit = mapGroupCfg.NodeLimit
end
self.nFragmentsId = 0
self.nPerFragmentsQty, self.nGeneralFragmentId = 0, 0
local mapCharCfg = ConfigTable.GetData_Character(self.nCharId)
if mapCharCfg then
self.nFragmentsId = mapCharCfg.FragmentsId
local mapGradeCfg = ConfigTable.GetData("CharGrade", mapCharCfg.Grade)
if mapGradeCfg then
self.nPerFragmentsQty = mapGradeCfg.FragmentsQty
self.nGeneralFragmentId = mapGradeCfg.GeneralFragmentId
end
end
end
function CharTalentDetailTrialCtrl:RefreshNode()
local tbTalent = CacheTable.GetData("_Talent", self.nSelectGroupId)
if not tbTalent then
return
end
local mapGroup = self.tbGroup[self.nSelectGroupIndex]
local bMax = mapGroup.nNormalCount >= self.nGroupNodeLimit
local nFragmentCount = PlayerData.Item:GetItemCountByID(self.nFragmentsId)
local bUnable = nFragmentCount < self.nPerFragmentsQty
self.tbTalent = {}
for _, v in pairs(tbTalent) do
if v.Type == GameEnum.talentType.OrdinaryNode then
local nIndex = v.Sort
local nState = 1
if self.mapTalent.tbActiveTalent[v.Id] then
nState = 3
elseif mapGroup.bLock or bMax or bUnable then
nState = 1
elseif not mapGroup.bLock and not bMax then
nState = 2
end
self._mapNode.Node[nIndex]:Refresh(nState)
self.tbTalent[nIndex] = v.Id
end
end
if not bMax then
self._mapNode.imgKeyOn:SetActive(false)
self._mapNode.imgKeyOff:SetActive(true)
else
self._mapNode.imgKeyOn:SetActive(true)
self._mapNode.imgKeyOff:SetActive(false)
end
end
function CharTalentDetailTrialCtrl:DefaultSelect()
if self.mapSelectNode ~= nil then
if self.mapSelectNode.bKey then
self._mapNode.goKeySelect:SetActive(false)
else
self._mapNode.Node[self.mapSelectNode.nIndex]:SetSelect(false)
end
end
local select_key = function()
self.mapSelectNode = {bKey = true, nIndex = 0}
self._mapNode.goKeySelect:SetActive(true)
self._mapNode.Info:RefreshKey(self.tbGroup[self.nSelectGroupIndex], self.mapTalent)
end
local select_normal = function()
local nIndex = 1
for i, v in ipairs(self.tbTalent) do
local bReady = self._mapNode.Node[i]:CheckReady()
if bReady then
nIndex = i
break
end
end
self.mapSelectNode = {bKey = false, nIndex = nIndex}
self._mapNode.Node[nIndex]:SetSelect(true)
self._mapNode.Info:RefreshNormal(self.tbTalent[nIndex], self.tbGroup[self.nSelectGroupIndex], self.mapTalent)
end
local mapGroup = self.tbGroup[self.nSelectGroupIndex]
local bMax = mapGroup.nNormalCount >= self.nGroupNodeLimit
if mapGroup.bLock or bMax then
select_key()
return
end
local nLeft = self.nGroupNodeLimit - mapGroup.nNormalCount
local nGeneralCount = PlayerData.Item:GetItemCountByID(self.nGeneralFragmentId)
local nFragmentCount = PlayerData.Item:GetItemCountByID(self.nFragmentsId)
local nUse = self.nPerFragmentsQty * nLeft
if nUse <= nFragmentCount + nGeneralCount or nFragmentCount < self.nPerFragmentsQty then
select_key()
else
select_normal()
end
end
function CharTalentDetailTrialCtrl:PlayOpenAnim()
end
function CharTalentDetailTrialCtrl:Awake()
self.gameObject:SetActive(false)
self.ani = self.gameObject.transform:GetComponent("Animator")
end
function CharTalentDetailTrialCtrl:OnEnable()
end
function CharTalentDetailTrialCtrl:OnDisable()
end
function CharTalentDetailTrialCtrl:OnDestroy()
end
function CharTalentDetailTrialCtrl:OnBtnClick_Key(btn)
if self.mapSelectNode ~= nil then
if self.mapSelectNode.bKey == true then
return
else
self._mapNode.Node[self.mapSelectNode.nIndex]:SetSelect(false)
end
end
self.mapSelectNode = {bKey = true, nIndex = 0}
self._mapNode.goKeySelect:SetActive(true)
self._mapNode.Info:RefreshKey(self.tbGroup[self.nSelectGroupIndex], self.mapTalent)
end
function CharTalentDetailTrialCtrl:OnBtnClick_Node(btn, nIndex)
if self.mapSelectNode ~= nil then
if self.mapSelectNode.bKey == true then
self._mapNode.goKeySelect:SetActive(false)
elseif self.mapSelectNode.bKey == false and self.mapSelectNode.nIndex == nIndex then
return
elseif self.mapSelectNode.bKey == false and self.mapSelectNode.nIndex ~= nIndex then
self._mapNode.Node[self.mapSelectNode.nIndex]:SetSelect(false)
end
end
self.mapSelectNode = {bKey = false, nIndex = nIndex}
self._mapNode.Node[nIndex]:SetSelect(true)
self._mapNode.Info:RefreshNormal(self.tbTalent[nIndex], self.tbGroup[self.nSelectGroupIndex], self.mapTalent)
end
function CharTalentDetailTrialCtrl:OnBtnClick_Back(btn)
if self.mapSelectNode.bKey then
self._mapNode.goKeySelect:SetActive(false)
else
self._mapNode.Node[self.mapSelectNode.nIndex]:SetSelect(false)
end
self._mapNode.animInfo:Play("CharTalent_info_out")
EventManager.Hit("CharTalentDetailBack")
self:AddTimer(1, 0.33, function()
self.gameObject:SetActive(false)
end, true, true, true)
end
function CharTalentDetailTrialCtrl:OnEvent_ActiveTalent(bKey, nTalentId)
if bKey then
EventManager.Hit(EventId.BlockInput, true)
end
local nHas = PlayerData.Item:GetItemCountByID(self.nFragmentsId)
local callback = function()
local bAble = nHas >= self.nPerFragmentsQty
if not bAble or bKey then
self:RefreshNode()
end
if bKey then
PlayerData.Voice:PlayCharVoice("exCharUp", self.nCharId)
CS.WwiseAudioManager.Instance:PostEvent("ui_charInfo_talent_active_large")
self.ani:Play("TalentKeyNode_unlock", 0, 0)
self:AddTimer(1, 1.3, function()
EventManager.Hit(EventId.BlockInput, false)
end, true, true, true)
end
end
if self.mapSelectNode.bKey then
callback()
else
self._mapNode.Node[self.mapSelectNode.nIndex]:PlayActiveAnim(callback)
local nStart = self.mapSelectNode.nIndex
local nIndex = 0
for i, v in ipairs(self.tbTalent) do
if i > nStart then
local bActive = self._mapNode.Node[i]:CheckActive()
if not bActive then
nIndex = i
break
end
end
end
if nIndex == 0 then
for i, v in ipairs(self.tbTalent) do
if i < nStart then
local bActive = self._mapNode.Node[i]:CheckActive()
if not bActive then
nIndex = i
break
end
end
end
end
if nIndex ~= 0 then
self:OnBtnClick_Node(nil, nIndex)
end
end
self:RefreshData()
end
return CharTalentDetailTrialCtrl