Files
StellaSora_DataLua/lua/game/ui/towerdefense/towerdefenseguidectrl.lua
T
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

325 lines
13 KiB
Lua

local TowerDefenseGuideCtrl = class("TowerDefenseGuideCtrl", BaseCtrl)
TowerDefenseGuideCtrl._mapNodeConfig = {
anim = {sNodeName = "Root", sComponentName = "Animator"},
txt_Guide_window = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Guide"
},
txt_sv_char = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_TeamEditor_Char"
},
txt_sv_item = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Title_Item"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
list_content = {
sComponentName = "RectTransform"
},
temp_grid_char = {},
char_content = {},
char_detail = {},
txtTitle_skill = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Guide_Skill"
},
txtTitle_potential = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Guide_Potential"
},
skill = {nCount = 2},
PotentialItem = {nCount = 4},
temp_grid_item = {},
item_content = {},
item_detail = {},
txt_itemName = {sComponentName = "TMP_Text"},
txt_itemCD = {sComponentName = "TMP_Text"},
txt_des = {sComponentName = "TMP_Text"},
btnAllClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
}
}
TowerDefenseGuideCtrl._mapEventConfig = {
TowerDefenseGuideCellOnSelected = "OnEvent_CellOnSelected"
}
TowerDefenseGuideCtrl._mapRedDotConfig = {}
local SelectType = {Char = 1, Item = 2}
function TowerDefenseGuideCtrl:SetData(nActId)
self._mapNode.anim:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
self.tbCharacterIds = {}
self.tbItemIds = {}
self.nActId = nActId
self.selectedGridGo = nil
self.TowerDefenseData = PlayerData.Activity:GetActivityDataById(self.nActId)
local forEachFunction = function(config)
if config.ActivityId == nActId and config.IsShow then
if config.GuideType == GameEnum.TowerDefGuideType.Character then
table.insert(self.tbCharacterIds, config.Id)
elseif config.GuideType == GameEnum.TowerDefGuideType.Item then
table.insert(self.tbItemIds, config.Id)
end
end
end
ForEachTableLine(DataTable.TowerDefenseGuide, forEachFunction)
local sortFunction = function(a, b)
local config_a = ConfigTable.GetData("TowerDefenseGuide", a)
local config_b = ConfigTable.GetData("TowerDefenseGuide", b)
local bUnlock_a = self.TowerDefenseData:IsLevelUnlock(config_a.LevelId) and self.TowerDefenseData:IsPreLevelPass(config_a.LevelId)
local bUnlock_b = self.TowerDefenseData:IsLevelUnlock(config_b.LevelId) and self.TowerDefenseData:IsPreLevelPass(config_b.LevelId)
if bUnlock_a and not bUnlock_b then
return true
elseif bUnlock_b and not bUnlock_a then
return false
else
return a < b
end
end
table.sort(self.tbCharacterIds, sortFunction)
table.sort(self.tbItemIds, sortFunction)
self._mapNode.list_content.gameObject:SetActive(false)
local charIndex, charFirstaGo = self:CreateChar()
local itemIndex, itemFirstaGo = self:CreateItem()
self._mapNode.list_content.gameObject:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.char_content:GetComponent("RectTransform"))
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.item_content:GetComponent("RectTransform"))
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.list_content)
end
cs_coroutine.start(wait)
if charFirstaGo ~= nil then
EventManager.Hit("TowerDefenseGuideCellOnSelected", self.tbCharacterIds[charIndex], SelectType.Char, charFirstaGo)
elseif itemFirstaGo ~= nil then
EventManager.Hit("TowerDefenseGuideCellOnSelected", self.tbItemIds[itemIndex], SelectType.Item, itemFirstaGo)
end
end
function TowerDefenseGuideCtrl:CreateChar()
delChildren(self._mapNode.char_content.transform)
local firstGo
local firstIndex = 0
for index, guideId in ipairs(self.tbCharacterIds) do
local guide_config = ConfigTable.GetData("TowerDefenseGuide", guideId)
local charId = guide_config.ObjectId
local config = ConfigTable.GetData("TowerDefenseCharacter", charId)
if config ~= nil then
local go = instantiate(self._mapNode.temp_grid_char, self._mapNode.char_content.transform)
go.name = charId
local btn = go.transform:Find("btn_grid"):GetComponent("UIButton")
local icon = go.transform:Find("btn_grid/AnimRoot/img_icon/icon_char"):GetComponent("Image")
local lock = go.transform:Find("btn_grid/AnimRoot/img_icon/bg_Lock")
local txt_name = go.transform:Find("btn_grid/AnimRoot/img_icon/txt_name"):GetComponent("TMP_Text")
local txt_new = go.transform:Find("btn_grid/AnimRoot/img_icon/txt_new"):GetComponent("TMP_Text")
if guide_config.Str == "" then
txt_new.gameObject:SetActive(false)
else
txt_new.gameObject:SetActive(true)
NovaAPI.SetTMPText(txt_new, guide_config.Str)
end
local bUnLock = true
if guide_config ~= nil then
bUnLock = self.TowerDefenseData:IsLevelUnlock(guide_config.LevelId) and self.TowerDefenseData:IsPreLevelPass(guide_config.LevelId)
end
if not bUnLock then
lock.gameObject:SetActive(true)
NovaAPI.SetTMPText(txt_name, ConfigTable.GetUIText("TowerDef_Lock"))
btn.onClick:AddListener(function()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("TowerDef_LockTip"))
end)
else
local i = index
lock.gameObject:SetActive(false)
self:SetPngSprite(icon, config.Icon .. AllEnum.CharHeadIconSurfix.QM)
NovaAPI.SetTMPText(txt_name, config.Name)
btn.onClick:AddListener(function()
EventManager.Hit("TowerDefenseGuideCellOnSelected", self.tbCharacterIds[i], SelectType.Char, go)
end)
end
go:SetActive(true)
if firstGo == nil then
firstGo = go
firstIndex = index
end
end
end
return firstIndex, firstGo
end
function TowerDefenseGuideCtrl:CreateItem()
delChildren(self._mapNode.item_content.transform)
local firstGo
local firstIndex = 0
for index, guideId in ipairs(self.tbItemIds) do
local guide_config = ConfigTable.GetData("TowerDefenseGuide", guideId)
local itemId = guide_config.ObjectId
local config = ConfigTable.GetData("TowerDefenseItem", itemId)
if config ~= nil then
local go = instantiate(self._mapNode.temp_grid_item, self._mapNode.item_content.transform)
go.name = itemId
local btn = go.transform:Find("btn_grid"):GetComponent("UIButton")
local icon = go.transform:Find("btn_grid/AnimRoot/img_icon"):GetComponent("Image")
local lock = go.transform:Find("btn_grid/AnimRoot/bg_Lock")
local txt_lock = go.transform:Find("btn_grid/AnimRoot/txt_lock"):GetComponent("TMP_Text")
local txt_new = go.transform:Find("btn_grid/AnimRoot/txt_new"):GetComponent("TMP_Text")
if guide_config.Str == "" then
txt_new.gameObject:SetActive(false)
else
txt_new.gameObject:SetActive(true)
NovaAPI.SetTMPText(txt_new, guide_config.Str)
end
local bUnLock = true
if guide_config ~= nil then
bUnLock = self.TowerDefenseData:IsLevelUnlock(guide_config.LevelId) and self.TowerDefenseData:IsPreLevelPass(guide_config.LevelId)
end
if not bUnLock then
lock.gameObject:SetActive(true)
txt_lock.gameObject:SetActive(true)
NovaAPI.SetTMPText(txt_lock, ConfigTable.GetUIText("TowerDef_Lock"))
btn.onClick:AddListener(function()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("TowerDef_LockTip"))
end)
else
local i = index
lock.gameObject:SetActive(false)
txt_lock.gameObject:SetActive(false)
self:SetPngSprite(icon, config.CardIcon)
btn.onClick:AddListener(function()
EventManager.Hit("TowerDefenseGuideCellOnSelected", self.tbItemIds[i], SelectType.Item, go)
end)
end
go:SetActive(true)
if firstGo == nil then
firstGo = go
firstIndex = index
end
end
end
return firstIndex, firstGo
end
function TowerDefenseGuideCtrl:UpdateDetail()
self._mapNode.char_detail:SetActive(false)
self._mapNode.item_detail:SetActive(false)
if self.SelectedType == SelectType.Char then
local charId = ConfigTable.GetData("TowerDefenseGuide", self.nSelectedId).ObjectId
local config = ConfigTable.GetData("TowerDefenseCharacter", charId)
if config == nil then
return
end
local skill1 = self._mapNode.skill[1]
local icon1 = skill1.transform:Find("AnimRoot/imgIcon"):GetComponent("Image")
local skill1_bg1 = skill1.transform:Find("AnimRoot/imgBg1"):GetComponent("Image")
local skill1_bg2 = skill1.transform:Find("AnimRoot/imgBg2"):GetComponent("Image")
local skill1_type = skill1.transform:Find("AnimRoot/imgType")
local btn1 = skill1:GetComponent("UIButton")
btn1.onClick:RemoveAllListeners()
local skillConfig = ConfigTable.GetData("Skill", config.SkillId)
if skillConfig ~= nil then
if skillConfig.Icon ~= "" then
self:SetPngSprite(icon1, skillConfig.Icon)
end
self:SetAtlasSprite(skill1_type:GetComponent("Image"), "05_language", "zs_character_skill_text_" .. skillConfig.Type)
btn1.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.TowerDefenseTipsPanel, btn1.gameObject, skillConfig.Title, skillConfig.Desc)
end)
end
local skill2 = self._mapNode.skill[2]
local icon2 = skill2.transform:Find("AnimRoot/imgIcon"):GetComponent("Image")
local skill2_bg1 = skill2.transform:Find("AnimRoot/imgBg1"):GetComponent("Image")
local skill2_bg2 = skill2.transform:Find("AnimRoot/imgBg2"):GetComponent("Image")
local skill2_type = skill2.transform:Find("AnimRoot/imgType")
local atkSkillConfig = ConfigTable.GetData("Skill", config.NormalAtkId)
local btn2 = skill2:GetComponent("UIButton")
btn2.onClick:RemoveAllListeners()
if atkSkillConfig ~= nil then
if atkSkillConfig.Icon ~= "" then
self:SetPngSprite(icon2, atkSkillConfig.Icon)
end
self:SetAtlasSprite(skill2_type:GetComponent("Image"), "05_language", "zs_character_skill_text_" .. atkSkillConfig.Type)
btn2.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.TowerDefenseTipsPanel, btn2.gameObject, atkSkillConfig.Title, atkSkillConfig.Desc)
end)
end
local EETConfig = ConfigTable.GetData("MonsterValueTempleteAdjust", config.Templete)
if EETConfig ~= nil then
local sName = AllEnum.ElementIconType.SkillEx .. EETConfig.EET
self:SetAtlasSprite(skill1_bg1, "12_rare", sName)
self:SetAtlasSprite(skill2_bg1, "12_rare", sName)
local _, color = ColorUtility.TryParseHtmlString(AllEnum.SkillElementBgColor[EETConfig.EET])
NovaAPI.SetImageColor(skill1_bg2, Color(color.r, color.g, color.b, 0.2980392156862745))
NovaAPI.SetImageColor(skill2_bg2, Color(color.r, color.g, color.b, 0.2980392156862745))
end
local tbPotential = {}
for _, value in ipairs(config.NewPotential6) do
table.insert(tbPotential, value)
end
for _, value in ipairs(config.NewPotential4) do
table.insert(tbPotential, value)
end
for _, potentialItem in pairs(self._mapNode.PotentialItem) do
potentialItem:SetActive(false)
end
for index, value in ipairs(tbPotential) do
local potential_config = ConfigTable.GetData("TowerDefensePotential", value)
if potential_config ~= nil then
local go = self._mapNode.PotentialItem[index]
local normal = go.transform:Find("btnItem/AnimRoot/goNormal")
local special = go.transform:Find("btnItem/AnimRoot/goSpecial")
normal.gameObject:SetActive(false)
special.gameObject:SetActive(false)
if potential_config.Rarity == GameEnum.itemRarity.SSR then
local icon = special.transform:Find("imgSpIcon"):GetComponent("Image")
self:SetPngSprite(icon, potential_config.Icon .. AllEnum.PotentialIconSurfix.A)
special.gameObject:SetActive(true)
elseif potential_config.Rarity == GameEnum.itemRarity.SR then
local icon = normal.transform:Find("goInfo/imgIcon1"):GetComponent("Image")
self:SetPngSprite(icon, potential_config.Icon .. AllEnum.PotentialIconSurfix.A)
normal.gameObject:SetActive(true)
end
local btn = go.transform:Find("btnItem"):GetComponent("UIButton")
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.TowerDefenseTipsPanel, go.gameObject, potential_config.Name, potential_config.PotentialDes)
end)
go:SetActive(true)
end
end
self._mapNode.char_detail:SetActive(true)
elseif self.SelectedType == SelectType.Item then
local itemId = ConfigTable.GetData("TowerDefenseGuide", self.nSelectedId).ObjectId
local config = ConfigTable.GetData("TowerDefenseItem", itemId)
if config == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txt_itemName, config.Name)
NovaAPI.SetTMPText(self._mapNode.txt_itemCD, ConfigTable.GetUIText("TowerDef_CD") .. config.Cd .. ConfigTable.GetUIText("CommonTips_CDSec"))
NovaAPI.SetTMPText(self._mapNode.txt_des, config.Des)
self._mapNode.item_detail:SetActive(true)
end
end
function TowerDefenseGuideCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
self._mapNode.anim:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, function()
self.selectedGridGo = nil
EventManager.Hit("CloseTowerDefenseGuidePanel")
end, true, true, true)
end
function TowerDefenseGuideCtrl:OnEvent_CellOnSelected(nSelectedId, nType, go)
if self.selectedGridGo ~= nil then
local selected = self.selectedGridGo.transform:Find("btn_grid/AnimRoot/go_select")
selected.gameObject:SetActive(false)
end
self.selectedGridGo = go
local selected = self.selectedGridGo.transform:Find("btn_grid/AnimRoot/go_select")
selected.gameObject:SetActive(true)
self.nSelectedId = nSelectedId
self.SelectedType = nType
self:UpdateDetail()
end
return TowerDefenseGuideCtrl