2025-10-22 15:05:56 +08:00

338 lines
12 KiB
Lua

local MainComp = class("MainComp", LuaComponent)
local UISpineObject = require "app/bf/unity/ui_spine_object"
local CHAPTER_BG_PATH = "assets/arts/textures/background/chapter/%s.png"
local HERO_SPINE_ASSET_PATH = "assets/arts/spines/characters/%s/%s_skeletondata.asset"
local CHAPTER_PATH = "assets/prefabs/ui/chapter/%s.prefab"
local CHAPTER_PAGE = 5
function MainComp:onClose()
self.currChapterId = nil
end
function MainComp:init()
local uiMap = self:getBaseObject():genAllChildren()
uiMap["main_comp.arena_btn.text"]:setText(I18N:getGlobalText(I18N.GlobalConst.ARENA_DESC_1))
uiMap["main_comp.daily_challenge_btn.text"]:setText(I18N:getGlobalText(I18N.GlobalConst.DAILY_CHALLENGE))
uiMap["main_comp.left_btn.text"]:setText(I18N:getGlobalText(I18N.GlobalConst.IDLE_DESC_1))
uiMap["main_comp.right_btn.text"]:setText(I18N:getGlobalText(I18N.GlobalConst.SUMMON_DESC_2))
self.backGroundNode = uiMap["main_comp.back_ground"]
self.arenaBtn = uiMap["main_comp.arena_btn"]
self.dailyChallengeBtn = uiMap["main_comp.daily_challenge_btn"]
self.chapterBg = uiMap["main_comp.bg"]
self.fightBtn = uiMap["main_comp.fight_btn"]
-- 体力消耗
self.fightCost = uiMap["main_comp.fight_btn.cost"]
self.costTxCost = uiMap["main_comp.fight_btn.cost.tx_cost"]
-- 按钮文本
self.txFight = uiMap["main_comp.fight_btn.tx_desc"]
self.fightBtn:addClickListener(function ()
ModuleManager.ChapterManager:startFight()
end)
self.leftArrowBtn = uiMap["main_comp.middle_bg.left_arrow.btn"]
self.rightArrowBtn = uiMap["main_comp.middle_bg.right_arrow.btn"]
self.leftBtn = uiMap["main_comp.left_btn"]
self.rightBtn = uiMap["main_comp.right_btn"]
self.heroSpineList = {}
self.heroNodeList = {}
for i = 1, 5 do
self.heroNodeList[i] = uiMap["main_comp.formation.hero_" .. i]
self.heroNodeList[i]:addClickListener(function()
local heroId = self.curFormation[i]
if heroId then
local hero = DataManager.HeroData:getHeroById(heroId)
if hero then
ModuleManager.HeroManager:showHeroDetailUI(heroId, nil, nil, GConst.BattleConst.FORMATION_TYPE.STAGE)
end
end
end)
end
self.chapterMiddleBg = uiMap["main_comp.middle_bg"]
self.chapterTx = uiMap["main_comp.middle_bg.chapter_tx"]
self.chapterMaxTx = uiMap["main_comp.middle_bg.max_tx"]
self.chapterInfoBtn = uiMap["main_comp.middle_bg.info_btn"]
self.chapterBoxBtn = uiMap["main_comp.middle_bg.box_btn"]
self.chapterPageNode = uiMap["main_comp.middle_bg.page_node"]
self.chapterPageBtns = {}
self.chapterPageBtnCheckImgs = {}
self.chapterPageBtnDescTxs = {}
self.chapterPageBtnMaskImgs = {}
self.chapterPageBtnSelectImgs = {}
for i = 1, CHAPTER_PAGE do
self.chapterPageBtns[i] = uiMap["main_comp.middle_bg.page_node.page_btn_" .. i]
self.chapterPageBtnCheckImgs[i] = uiMap["main_comp.middle_bg.page_node.page_btn_" .. i .. ".check_img"]
self.chapterPageBtnDescTxs[i] = uiMap["main_comp.middle_bg.page_node.page_btn_" .. i .. ".desc_tx"]
self.chapterPageBtnMaskImgs[i] = uiMap["main_comp.middle_bg.page_node.page_btn_" .. i .. ".mask_img"]
self.chapterPageBtnSelectImgs[i] = uiMap["main_comp.middle_bg.page_node.page_btn_" .. i .. ".select_img"]
self.chapterPageBtns[i]:addClickListener(function()
self.chapterStage = i
local chapterId = DataManager.ChapterData:getChapterCfgByPageAndStage(self.chapterPage, self.chapterStage)
DataManager.ChapterData:setChapterId(chapterId)
self:refresh()
end)
end
-- MaincityManager:showChapterBoxUI(chapterId)
uiMap["main_comp.middle_bg.box_btn"]:addClickListener(function()
local canGet = DataManager.ChapterData:getChapterBoxCanGet()
if canGet then
ModuleManager.ChapterManager:openBox()
else
local chapterId = DataManager.ChapterData:getChapterId()
ModuleManager.MaincityManager:showChapterBoxUI(chapterId)
end
end)
uiMap["main_comp.middle_bg.info_btn"]:addClickListener(function()
local chapterId = DataManager.ChapterData:getChapterId()
ModuleManager.MaincityManager:showChapterBoxUI(chapterId)
end)
uiMap["main_comp.arena_btn"]:addClickListener(function()
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA) then
return
end
ModuleManager.ArenaManager:reqArenaInfo(true)
end)
uiMap["main_comp.daily_challenge_btn"]:addClickListener(function()
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DAILY_CHALLENGE) then
return
end
ModuleManager.DailyChallengeManager:showDailyChallengeUI()
end)
self.leftArrowBtn:addClickListener(function()
self.chapterPage = self.chapterPage - 1
self.chapterList = DataManager.ChapterData:getChapterList(self.chapterPage)
if self.chapterStage > #self.chapterList then
self.chapterStage = #self.chapterList
end
local chapterId = DataManager.ChapterData:getChapterCfgByPageAndStage(self.chapterPage, self.chapterStage)
DataManager.ChapterData:setChapterId(chapterId)
self:refresh()
end)
self.rightArrowBtn:addClickListener(function()
self.chapterPage = self.chapterPage + 1
self.chapterList = DataManager.ChapterData:getChapterList(self.chapterPage)
if self.chapterStage > #self.chapterList then
self.chapterStage = #self.chapterList
end
local chapterId = DataManager.ChapterData:getChapterCfgByPageAndStage(self.chapterPage, self.chapterStage)
DataManager.ChapterData:setChapterId(chapterId)
self:refresh()
end)
self.leftBtn:addClickListener(function()
ModuleManager.IdleManager:showIdleDropUI()
end)
self.rightBtn:addClickListener(function()
ModuleManager.SummonManager:showSummonMainUI()
end)
local chapterId = DataManager.ChapterData:getChapterId()
self.chapterPage = DataManager.ChapterData:getChapterPage(chapterId)
self.chapterStage = DataManager.ChapterData:getChapterStage(chapterId)
self.chapterScenes = {}
end
function MainComp:refreshTime()
self:refreshRedPoint()
end
function MainComp:refresh()
self:refreshChapter()
self:refreshRedPoint()
self:refreshHero()
end
function MainComp:refreshChapter(force)
local chapterId = DataManager.ChapterData:getChapterId()
self.chapterList = DataManager.ChapterData:getChapterList(self.chapterPage)
if self.currChapterId ~= chapterId or force then
self.currChapterId = chapterId
self.chapterPage = DataManager.ChapterData:getChapterPage(chapterId)
self.chapterStage = DataManager.ChapterData:getChapterStage(chapterId)
self:refreshChapterBg()
self:refreshFightBtn()
end
self.currChapterId = chapterId
self:refreshChapterInfo()
self:refreshChapterBtn()
self.leftBtn:setActive(ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.IDLE_DROP, true))
self.rightBtn:setActive(ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_OPEN, true))
end
function MainComp:refreshChapterBg()
if self.isLoading then
return
end
local chapterId = DataManager.ChapterData:getChapterId()
local icon = DataManager.ChapterData:getChapterCfg()[chapterId].icon
local scene = DataManager.ChapterData:getChapterCfg()[chapterId].scene
local bgPath = string.format(CHAPTER_PATH, icon)
if self.currScenePath == bgPath then
return
end
if self.chapterScenes[bgPath] then
self.chapterScenes[bgPath]:setActive(true)
if self.currScenePath and self.chapterScenes[self.currScenePath] then
self.chapterScenes[self.currScenePath]:setActive(false)
end
self.currScenePath = bgPath
self.chapterBg:setTexture(string.format(CHAPTER_BG_PATH, scene))
else
self.isLoading = true
local oldPath = self.currScenePath
UIPrefabManager:loadUIWidgetAsync(bgPath, self.backGroundNode, function(prefab)
self.isLoading = false
if oldPath and self.chapterScenes[oldPath] then
self.chapterScenes[oldPath]:setActive(false)
end
self.currScenePath = bgPath
self.chapterScenes[self.currScenePath] = prefab
self.chapterBg:setTexture(string.format(CHAPTER_BG_PATH, scene))
end)
end
end
function MainComp:refreshChapterBtn()
local chapterNewId = DataManager.ChapterData:getNewChapterId()
local maxPage = DataManager.ChapterData:getChapterPage(chapterNewId)
self.leftArrowBtn:setActive(self.chapterPage > 1)
self.rightArrowBtn:setActive(self.chapterPage < maxPage)
end
function MainComp:refreshFightBtn()
-- 体力消耗
local cost = DataManager.ChapterData:getFightCost()
self.fightCost:setActive(true)
self.txFight:setText(I18N:getGlobalText(I18N.GlobalConst.START_DESC))
self.costTxCost:setText(GFunc.getRewardNum(cost))
end
function MainComp:refreshChapterInfo()
local chapterId = DataManager.ChapterData:getChapterId()
local chapterMaxId = DataManager.ChapterData:getMaxChapterId()
for i = 1, CHAPTER_PAGE do
if i <= #self.chapterList then
self.chapterPageBtns[i]:setActive(true)
self.chapterPageBtnSelectImgs[i]:setActive(i == self.chapterStage)
self.chapterPageBtnDescTxs[i]:setText(i)
local selChapterId = DataManager.ChapterData:getChapterCfgByPageAndStage(self.chapterPage, i)
self.chapterPageBtnCheckImgs[i]:setActive(selChapterId <= chapterMaxId)
self.chapterPageBtnMaskImgs[i]:setActive(selChapterId > (chapterMaxId + 1))
else
self.chapterPageBtns[i]:setActive(false)
end
end
self.chapterPageNode:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_HORIZONTAL_OR_VERTICAL_LAYOUT):RefreshLayout()
if chapterId <= chapterMaxId + 1 then
self.fightBtn:setTouchEnable(true)
self.fightBtn:setSprite(GConst.ATLAS_PATH.MAIN, "main_btn_1")
else
self.fightBtn:setTouchEnable(false)
self.fightBtn:setSprite(GConst.ATLAS_PATH.MAIN, "main_btn_4")
end
local chapterI18NInfo = I18N:getConfig("chapter")[chapterId]
if chapterI18NInfo then
self.chapterTx:setText(chapterI18NInfo.name)
end
if chapterId <= chapterMaxId then
self.chapterMaxTx:setText(I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_7))
elseif chapterId == chapterMaxId + 1 then
self.chapterMaxTx:setText(I18N:getGlobalText(I18N.GlobalConst.CHAPTER_DESC_1, DataManager.ChapterData:getChapterMaxWave()))
else
self.chapterMaxTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_22))
end
end
function MainComp:refreshRedPoint()
local time = Time:getServerTime() - DataManager.IdleData:getLastDropTime()
-- local idleMaxTime = DataManager.IdleData:getIdleMaxTime()
local idleMaxTime = 3600
if time >= idleMaxTime then
self.leftBtn:addRedPoint(70, -36, 1)
else
self.leftBtn:removeRedPoint()
end
if DataManager.SummonData:hasSummonCostRedPoint() then
self.rightBtn:addRedPoint(-70, -36, 1)
else
self.rightBtn:removeRedPoint()
end
if DataManager.ArenaData:hasEntranceRedDot() then
self.arenaBtn:addRedPoint(70, 26, 1)
else
self.arenaBtn:removeRedPoint()
end
if DataManager.DailyChallengeData:showRedPoint() then
self.dailyChallengeBtn:addRedPoint(-70, 26, 1)
else
self.dailyChallengeBtn:removeRedPoint()
end
if DataManager.ChapterData:getChapterBoxCanGet() then
self.chapterBoxBtn:addRedPoint(20, 20, 1)
else
self.chapterBoxBtn:removeRedPoint()
end
end
function MainComp:getArenaBtnPosition()
return self.arenaBtn:getPosition()
end
function MainComp:getDailyChallengeBtnPosition()
return self.dailyChallengeBtn:getPosition()
end
function MainComp:getIdleBtnPosition()
local pos = self.leftBtn:getPosition()
return {x = pos.x + 0.5, y = pos.y + 0.5, z = 0}
end
function MainComp:getSummonBtnPosition()
local pos = self.rightBtn:getPosition()
return {x = pos.x - 0.5, y = pos.y + 0.5, z = 0}
end
function MainComp:refreshHero()
self.curFormation = DataManager.FormationData:getStageFormation()
for i = 1, 5 do
local heroId = self.curFormation[i]
local hero = DataManager.HeroData:getHeroById(heroId)
if hero and hero:getLv() > 0 then
if self.heroSpineList[i] and self.heroSpineList[i]:getModelId() == hero:getModelId() then
self.heroSpineList[i]:setActive(true)
self.heroSpineList[i]:playAnimation("move", true)
else
SpineManager:loadHeroAsync(hero:getModelId(), self.heroNodeList[i], function(spineObject)
if heroId ~= self.curFormation[i] then
return
end
if self.heroSpineList[i] then
self.heroSpineList[i]:destroy()
end
spineObject:playAnimation("move", true)
spineObject:setLocalScale(0.7, 0.7, 0.7)
self.heroSpineList[i] = spineObject
self.heroSpineList[i]:setLocalPosition(0, -60, 0)
end)
end
else
if self.heroSpineList[i] then
self.heroSpineList[i]:setActive(false)
end
end
end
end
return MainComp