5e0d58cfad
EN: 1.2.0.60 CN: 1.2.0.61 JP: 1.2.0.63 KR: 1.2.0.67
251 lines
7.7 KiB
Lua
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
|