c1_lua/lua/app/ui/main_city/main_city_ui.lua
2023-04-03 10:59:13 +08:00

1123 lines
39 KiB
Lua

---@class MainCityUI : BaseUI
local MainCityUI = class("MainCityUI", BaseUI)
local BF_UI_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_UI_HELPER
local HERO_MAIN_COMP = "app/ui/hero/hero_main_comp" -- 主角组件
local SECT_MAIN_COMP = "" -- TODO 门派组件
local TRAIN_MAIN_COMP = "app/ui/train/train_main_comp" -- 修炼组件
local DUNGEON_MAIN_COMP = "app/ui/dungeon/dungeon_main_comp" -- 试炼组件
local SHOP_MAIN_COMP = "app/ui/shop/shop_main_comp" -- 商店组件
local MINE_MAIN_COMP = "app/ui/mining/mining_main_comp" --地下城(挖矿)组件
local BOTTOM_BTN_CELL = "app/ui/main_city/cell/bottom_btn_cell"
local BOTTOM_BTN_CELL_COUNT = 5
local CHAPTER_SLIDER_COMP = "app/ui/main_city/component/chapter_slider_comp"
local TUTORIAL_TASK_COMP = "app/ui/main_city/component/tutorial_task_comp"
local DELAY_RESUME_TIME = 0.5
local SIDE_BAR_DEFAULT_CELL_WIDTH = 80
local SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE = 10
local SIDE_BAR_DEFAULT_CELL_HEIGHT = 80
local SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE = 32
local SIDE_BAR_COMP_TYPE = {
STRENGTH = 1001, -- 强化
MONTHLY_CARD = 1011, -- 月卡
SPEED_UP = 1021, -- 加速
BOUNTY = 1031, -- 战令
TASK = 2001, -- 任务
HANDBOOK = 2011, -- 图鉴
ACTIVITY = 2021, -- 活动
}
local SIDE_BAR_PREFAB_PATH = {
-- 左边
[SIDE_BAR_COMP_TYPE.STRENGTH] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
[SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
[SIDE_BAR_COMP_TYPE.SPEED_UP] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
[SIDE_BAR_COMP_TYPE.BOUNTY] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
-- 右边
[SIDE_BAR_COMP_TYPE.TASK] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
[SIDE_BAR_COMP_TYPE.HANDBOOK] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
[SIDE_BAR_COMP_TYPE.ACTIVITY] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab",
}
local SIDE_BAR_COMP_PATH = {
-- 左边
[SIDE_BAR_COMP_TYPE.STRENGTH] = "app/ui/main_city/cell/side_bar_strength_cell",
[SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "app/ui/main_city/cell/side_bar_monthly_card_cell",
[SIDE_BAR_COMP_TYPE.SPEED_UP] = "app/ui/main_city/cell/side_bar_speed_up_cell",
[SIDE_BAR_COMP_TYPE.BOUNTY] = "app/ui/main_city/cell/side_bar_bounty_cell",
-- 右边
[SIDE_BAR_COMP_TYPE.TASK] = "app/ui/main_city/cell/side_bar_task_cell",
[SIDE_BAR_COMP_TYPE.HANDBOOK] = "app/ui/main_city/cell/side_bar_handbook_cell",
[SIDE_BAR_COMP_TYPE.ACTIVITY] = "app/ui/main_city/cell/side_bar_activity_cell",
}
local SIDE_BAR_NAME = {
[SIDE_BAR_COMP_TYPE.STRENGTH] = "strength_cell",
[SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "monthly_card_cell",
[SIDE_BAR_COMP_TYPE.SPEED_UP] = "speed_up_cell",
[SIDE_BAR_COMP_TYPE.BOUNTY] = "bounty_cell",
[SIDE_BAR_COMP_TYPE.TASK] = "task_cell",
[SIDE_BAR_COMP_TYPE.HANDBOOK] = "handbook_cell",
[SIDE_BAR_COMP_TYPE.ACTIVITY] = "activity_cell",
}
local BLACK_FADE_TIME = 0.25
local SAVE_POWER_MODE_TIME = 60
function MainCityUI:getUIType()
return UIManager.UI_TYPE.MAIN
end
function MainCityUI:currencyParams()
self.targetIndex = self.targetIndex or 0
local params = {}
local hidAddImg = false
params.showType = GConst.CURRENCY_TYPE.HORIZONTAL
if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then
if self.targetIndex == 0 then -- 默认状态
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.HERO then -- 主角
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.SECT then -- 门派
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then -- 强化
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then -- 地下城
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.SHOP then -- 商店
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
GConst.ItemConst.ITEM_ID_GEM,
}
end
else
hidAddImg = true
if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GOLD then
params.itemIds = {
GConst.ItemConst.ITEM_ID_GOLD,
}
elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GEM then
params.itemIds = {
GConst.ItemConst.ITEM_ID_GEM,
}
else
params.itemIds = GConst.EMPTY_TABLE
end
end
return params, true, hidAddImg
end
function MainCityUI:updateCurrentBattleType(battleType)
if self.battleType ~= battleType then
self.battleType = battleType
self:updateCurrencyBar()
end
end
function MainCityUI:getPrefabPath()
return "assets/prefabs/ui/main_city/main_ui.prefab"
end
function MainCityUI:ctor(params)
self.isFirstEnter = params and params.isFirstEnter
self.targetIndex = params and params.targetIndex or 0
self.battleType = params and params.battleType or ModuleManager.BattleManager.BATTLE_TYPE.STAGE
self.savePowerModeTime = SAVE_POWER_MODE_TIME
end
function MainCityUI:onReshow()
if self.mineComp then
self.mineComp:checkRedPoint()
end
end
function MainCityUI:onLoadRootComplete()
if self:isClosed() then
return
end
self.uiMap = self.root:genAllChildren()
self:_display()
self:_addListeners()
self:_bind()
self:updateTime()
self:scheduleGlobal(function()
self:updateTime()
end, 1)
self:hideBlackUI()
DataManager.HeroData:getMainHeroEntity():getPassiveSkillIds()
end
function MainCityUI:_display()
self:refreshRoleInfo() -- 刷新左上角角色信息
self:initBattleNode() -- 初始化战斗节点
self:initComp() -- 初始化页签界面
self:initBottom() -- 初始化底部页签
self:refreshBottom(nil, false) -- 刷新底部页签
self:refreshChapterSlider() -- 刷新章节滑动条
self:refreshPower()
-- 检查弹窗
self:checkMainPop()
end
function MainCityUI:_addListeners()
self:addEventListener(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP, function()
self:checkMainPop()
end)
self:addEventListener(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY_OVER, function(params)
if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then
DataManager.ChapterData:addStageCoinToBagWhenFlyOver() -- 关卡怪物金币入包
elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GOLD then
UIManager:refreshCurrencyAddTx(GConst.ItemConst.ITEM_ID_GOLD, DataManager.DungeonData:getCacheDungeonDropBigNum())
elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GEM then
UIManager:refreshCurrencyAddTx(GConst.ItemConst.ITEM_ID_GEM, DataManager.DungeonData:getCacheDungeonDropBigNum())
end
end)
self:addEventListener(EventManager.CUSTOM_EVENT.TUTORIAL_TASK_REWARD, function(rewards)
if rewards and self.tutorialTaskComp then
GFunc.showCurrencyFlyAction(rewards, self.tutorialTaskComp:getBaseObject():getTransform().position)
end
end)
self:addEventListener(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY, function(params)
local pos = params.pos
local imgNum = params.imgNum
local itemIds = params.itemIds
if self.targetIndex == 0 and self:isTopUI() then
if itemIds and #itemIds > 0 then
local allPos = {}
for i = 1, imgNum do
local posX, posY = GFunc.randomPos(i, {x = pos.x, y = pos.y})
allPos[i] = {x = posX, y = posY}
end
local flyPos = {}
for _, id in ipairs(itemIds) do
flyPos[id] = allPos
end
UIManager:showCurrencyAction(flyPos)
end
else
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY_OVER)
end
end)
self:addEventListener(EventManager.CUSTOM_EVENT.BATTLE_SHOW_CHAPTER_BLACK_UI, function(params)
self:showBlackUI(params.desc, params.time, params.isShowFail)
end)
self:addEventListener(EventManager.CUSTOM_EVENT.BATTLE_SHOW_TOAST, function(params)
if self.targetIndex == 0 and self:isTopUI() then
GFunc.showToast(params)
end
end)
self:addEventListener(EventManager.CUSTOM_EVENT.ATK_TRAIN_TUTORIAL_OVER, function()
if self.trainComp then
self.trainComp:clearTrainStatus()
end
end)
self:addEventListener(EventManager.CUSTOM_EVENT.TUTORIAL_TASK_STOP, function()
self:checkTutorialTaskMask()
end)
self:addEventListener(EventManager.CUSTOM_EVENT.GET_ANY_KEY_DOWN, function()
self:resetSavePowerTime()
end)
end
function MainCityUI:_bind()
self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, function(params)
params = params or {}
local oldPage = self.targetIndex
local page = params.page or self.targetIndex
if page == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
self.showStoreIdx = params.storeIdx
self.storeOffsetY = params.storeOffsetY
end
self:refreshBottom(page, true)
if page == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
self.shopComp:refresh(self, self.showStoreIdx)
end
end)
self:bind(DataManager.ChapterData, "isDirty", function(binder, value)
self:refreshChapterSlider()
end)
self:bind(DataManager.TutorialTaskData, "isDirty", function()
self:_refreshChapterTask()
self:checkTutorialTaskMask()
self:refreshBottomIconOnly()
if self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN and self.trainComp then
self.trainComp:refreshTutorialTask()
end
end, true)
self:bind(DataManager.DungeonData, "isDirty", function(binder, value)
self.dungeonComp:refresh()
end)
self:bind(DataManager.BagData.ItemData, "dirty", function(binder, value)
self.dungeonComp:refresh()
self.mineComp:refresh()
end)
self:bind(DataManager.ShopData, "isDirty", function(binder, value)
self.shopComp:refresh()
end)
self:bind(DataManager.HeroData:getMainHeroEntity(), "powerDirty", function(binder, value)
self:refreshPower()
end)
self:bind(DataManager.PlayerData, "level", function(binder, value)
self:refreshBottomIconOnly()
end)
self:bind(DataManager.ChapterData, "historyChapterId", function(binder, value)
self:refreshBottomIconOnly()
end)
DataManager:registerCrossDayFunc("crossDay", function()
DataManager:resetSignInInfo()
DataManager.SummonData:resetDailyAdTimes()
-- 检查弹窗
self:checkMainPop()
end)
end
function MainCityUI:initBattleNode()
self.battleNode = self.uiMap["main_ui.battle_node"]
end
function MainCityUI:getBattleNode()
return self.battleNode
end
function MainCityUI:onSetUIOrder()
if self.subComps then
for index, comp in pairs(self.subComps) do
local order = self._baseRootCanvas.sortingOrder
local uiHelper = comp:getGameObject():GetComponent(BF_UI_HELPER)
if uiHelper then
uiHelper:SetSortingOrder(order + 1)
end
end
end
end
-- 左上角头像与角色信息
function MainCityUI:refreshRoleInfo()
if not self.avatarCell then
self.avatarCell = CellManager:addCellComp(self.uiMap["main_ui.role_node.avatar_cell"], GConst.TYPEOF_LUA_CLASS.AVATAR_CELL)
end
self.avatarCell:refresh()
self.avatarCell:addClickListener(function()
ModuleManager.GameSettingManager:showSettingUI()
end)
self:refreshPower()
end
-- 初始化底部页签栏
function MainCityUI:initBottom()
if not self.bottomBtnCells then
self.bottomBtnCells = {}
for i = 1, BOTTOM_BTN_CELL_COUNT do
table.insert(self.bottomBtnCells, CellManager:addCellComp(self.uiMap["main_ui.bottom_node.bottom_btn_cell_" .. i], BOTTOM_BTN_CELL))
end
end
for i = 1, BOTTOM_BTN_CELL_COUNT do
local icon = GConst.MainCityConst.BOTTOM_ICON[i]
local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i]
local isOpen
if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true)
elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true)
end
self.bottomBtnCells[i]:refresh(i, false, icon, closeIcon, isOpen)
self.bottomBtnCells[i]:addClickListener(function()
local isOpen
if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true)
if not isOpen then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true)
if not isOpen then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true)
if not isOpen then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true)
end
end
end
if not isOpen then -- 弹toast
local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, false)
if notShowToast then
notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, false)
if notShowToast then
notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, false)
if notShowToast then
notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, false)
end
end
end
end
elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true)
if not isOpen then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true)
end
if not isOpen then -- 弹toast
local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, false)
if notShowToast then
notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, false)
end
end
else
isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], false)
end
if isOpen then
self:refreshBottom(i, true)
end
end)
end
self.tutorialTaskFinger = self.uiMap["main_ui.bottom_node.tutorial_finger"]
end
-- 刷新底部页签栏
function MainCityUI:refreshBottom(targetIndex, playAnim)
targetIndex = targetIndex or 0
-- 如果点击一样的 则是关闭效果
if self.targetIndex == targetIndex then
targetIndex = 0
end
local oldIndex = self.targetIndex
self.targetIndex = targetIndex
if playAnim then
-- 动画 TODOJ
for i = 1, BOTTOM_BTN_CELL_COUNT do
local icon = GConst.MainCityConst.BOTTOM_ICON[i]
local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i]
local isOpen
if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true)
elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true)
else
isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true)
end
self.bottomBtnCells[i]:refresh(i, targetIndex == i, icon, closeIcon, isOpen)
end
else
for i = 1, BOTTOM_BTN_CELL_COUNT do
local icon = GConst.MainCityConst.BOTTOM_ICON[i]
local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i]
local isOpen
if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true)
elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true)
else
isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true)
end
self.bottomBtnCells[i]:refresh(i, targetIndex == i, icon, closeIcon, isOpen)
end
end
-- 展示页签内容
if self.targetIndex == 0 or self.subComps[self.targetIndex] then
self:switchComp(self.targetIndex, oldIndex)
end
self:refreshBottomRedPoint()
self:checkTutorialTaskMask()
-- 战斗开启与暂停
if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE and oldIndex ~= self.targetIndex then
if self.targetIndex == 0 then
if self.resumeBattleId then
SchedulerManager:unscheduleGlobal(self.resumeBattleId)
end
self.resumeBattleId = self:performWithDelayGlobal(function()
self.resumeBattleId = nil
if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE and oldIndex ~= self.targetIndex then
ModuleManager.BattleManager:resumeFight()
end
end, DELAY_RESUME_TIME)
else
if not DataManager.BattleData:getIsAutoFight() or self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then
ModuleManager.BattleManager:pauseFight()
end
end
end
end
function MainCityUI:refreshBottomIconOnly()
for i = 1, BOTTOM_BTN_CELL_COUNT do
local icon = GConst.MainCityConst.BOTTOM_ICON[i]
local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i]
local isOpen
if 1 == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true)
elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true)
or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true)
else
isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true)
end
self.bottomBtnCells[i]:refresh(i, self.targetIndex == i, icon, closeIcon, isOpen)
end
end
-- 初始化页签界面
function MainCityUI:initComp()
if not self.subComps then
local uiMap = self.root:genAllChildren()
self.subComps = {}
-- 主角
local heroComp = uiMap["main_ui.sub_ui_node.hero_main_comp"]
heroComp:initPrefabHelper()
heroComp:genAllChildren()
self.subComps[1] = heroComp:addLuaComponent(HERO_MAIN_COMP)
self.heroComp = self.subComps[1]
-- 试炼副本
local dungeonComp = uiMap["main_ui.sub_ui_node.dungeon_main_comp"]
dungeonComp:initPrefabHelper()
dungeonComp:genAllChildren()
self.subComps[2] = dungeonComp:addLuaComponent(DUNGEON_MAIN_COMP)
self.dungeonComp = self.subComps[2]
self.dungeonComp:setParentUI(self)
-- 强化
local trainComp = uiMap["main_ui.sub_ui_node.train_main_comp"]
trainComp:initPrefabHelper()
trainComp:genAllChildren()
self.subComps[3] = trainComp:addLuaComponent(TRAIN_MAIN_COMP)
self.trainComp = self.subComps[3]
-- 地下城
local mineComp = uiMap["main_ui.sub_ui_node.mine_main_comp"]
mineComp:initPrefabHelper()
mineComp:genAllChildren()
self.subComps[4] = mineComp:addLuaComponent(MINE_MAIN_COMP)
self.mineComp = self.subComps[4]
self.mineComp:setParentUI(self)
-- 商城
local shopComp = uiMap["main_ui.sub_ui_node.shop_main_comp"]
shopComp:initPrefabHelper()
shopComp:genAllChildren()
self.subComps[5] = shopComp:addLuaComponent(SHOP_MAIN_COMP)
self.shopComp = self.subComps[5]
self.shopComp:setParentUI(self)
self:onSetUIOrder()
end
end
-- 切换展示对应页签
function MainCityUI:switchComp(index, oldIndex)
index = index or self.targetIndex
for i, comp in pairs(self.subComps) do
-- 页签被隐藏时调用
if oldIndex and comp.onHide and i ~= index and oldIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then
comp:onHide()
end
comp:getBaseObject():setActive(i == index)
if i == index then
comp:refresh(self)
self:updateTime()
end
end
self:updateCurrencyBar()
self:checkMainPop()
end
-- 定时器
function MainCityUI:updateTime()
self:refreshSubComps()
self:refreshLeftNode()
self:refreshRightNode()
self:refreshBottomRedPoint()
self:updateSavePowerModeTime()
DataManager.BlessingData:addTimeCount()
end
-- 定时刷新子页签内容
function MainCityUI:refreshSubComps()
-- TODO
self.shopComp:updateTime()
end
-- 定时刷新左部分界面
function MainCityUI:refreshLeftNode()
self:_refreshLeftSideBar()
end
-- 定时刷新左侧边栏
function MainCityUI:_refreshLeftSideBar()
local leftNum = 0
local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2
local x = 0
local y = 0
local rp = false -- 总红点
local leftSideBarNode = self.uiMap["main_ui.left_node.side_bar_bg"]
-- 祝福 ********************************************************************************************
local isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.BLESSING, true)
if isOpen then
offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY)
end
local isShake = false
local isRed = false -- TODO 红点逻辑
rp = rp or (isOpen and isRed)
local forceDisVisible = false
local isAdPoint = DataManager.BlessingData:showVideoPoint()
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.STRENGTH, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function()
ModuleManager.BlessingManager:showBlessingMainUI()
end)
-- 挂机 ********************************************************************************************
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.IDLE, true) and ModuleManager.IdleManager:canGetIdleDrop()
if isOpen then
offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY)
end
isShake = true
isRed = false -- TODO 红点逻辑
rp = rp or (isOpen and isRed)
forceDisVisible = false
local isAdPoint = false
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.MONTHLY_CARD, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function()
ModuleManager.IdleManager:onBaseGetDrop()
end)
-- 加速 ********************************************************************************************
isOpen = DataManager.AccelerationData:getIsOpen()
if isOpen then
offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY)
end
isShake = false
isRed = false
rp = rp or (isOpen and isRed)
forceDisVisible = false
local isAdPoint = false
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.SPEED_UP, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function()
ModuleManager.BattleManager:showBattleSpeedUpUI()
end)
-- 战令/基金 ********************************************************************************************
isOpen = ModuleManager.BountyManager:isOpen()
if isOpen then
offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY)
end
isShake = false
isRed = ModuleManager.BountyManager:showRp()
rp = rp or (isOpen and isRed)
forceDisVisible = false
local isAdPoint = false
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.BOUNTY, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function()
ModuleManager.ActivityManager:showHallUI(ModuleManager.BountyManager:getAllActList())
end)
-- 处理总红点
-- TODOJ
end
-- 定时刷新章节进度
function MainCityUI:refreshChapterSlider()
local sliderObj = self.uiMap["main_ui.chapter_slider_node.chapter_slider_comp"]
if not self.chapterSliderComp then
sliderObj:initPrefabHelper()
sliderObj:genAllChildren()
self.chapterSliderComp = sliderObj:addLuaComponent(CHAPTER_SLIDER_COMP)
end
self.chapterSliderComp:refresh()
-- boss章节隐藏
if DataManager.ChapterData:checkIsFirstRewardChapter(DataManager.ChapterData:getCurChapterId() + 1) then
sliderObj:setVisible(false)
else
sliderObj:setVisible(true)
end
end
-- 定时刷新右部分界面
function MainCityUI:refreshRightNode()
self:_refreshEmailBtn()
self:_refreshChapterTask()
self:_refreshRightSideBar()
end
-- 定时刷新邮件
function MainCityUI:_refreshEmailBtn()
local emailBtn = self.uiMap["main_ui.right_node.email_btn"]
emailBtn:addClickListener(function()
ModuleManager.MailManager:showUI()
end)
local mailIsOpen = DataManager.MailData:getIsOpen()
if self.mailIsOpen ~= mailIsOpen then
emailBtn:setActive(mailIsOpen)
self.mailIsOpen = mailIsOpen
end
local isRed, isAdRp = DataManager.MailData:getRedPoint()
if isRed then
local iconName
if isAdRp then
iconName = GFunc.getAdSprite()
end
emailBtn:addRedPoint(23, 14, 0.6, iconName, nil, true)
else
emailBtn:removeRedPoint()
end
end
-- 定时刷新任务
function MainCityUI:_refreshChapterTask()
if not self.tutorialTaskComp then
local taskObj = self.uiMap["main_ui.right_node.tutorial_task_comp"]
taskObj:initPrefabHelper()
taskObj:genAllChildren()
self.tutorialTaskComp = self.uiMap["main_ui.right_node.tutorial_task_comp"]:addLuaComponent(TUTORIAL_TASK_COMP)
end
local over = DataManager.TutorialTaskData:getTaskCollect()
self.tutorialTaskComp:getBaseObject():setVisible(not over)
if not over then
self.tutorialTaskComp:refresh()
end
end
-- 定时刷新右侧边栏
function MainCityUI:_refreshRightSideBar()
local rightNum = 0
local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2
local x = 0
local y = 0
local rp = false
local rightSideBarNode = self.uiMap["main_ui.right_node.side_bar_bg"]
-- 任务 *****************************************************************************************************
local isOpen = true -- TODO 开启逻辑
if isOpen then
offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY)
end
local isShake = false
local isRed = DataManager.DailyTaskData:showRedPoint()
rp = rp or (isOpen and isRed)
local forceDisVisible = false
local isAdPoint = DataManager.DailyTaskData:showAdPoint()
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.TASK, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function()
ModuleManager.DailyTaskManager:showUI()
end)
-- 图鉴 *****************************************************************************************************
isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.COLLECTION, true)
if isOpen then
offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY)
end
isShake = false
isRed = DataManager.CollectionData:showRedPoint()
rp = rp or (isOpen and isRed)
forceDisVisible = false
local isAdPoint = false
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.HANDBOOK, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function()
-- 打开图鉴界面
ModuleManager.CollectionManager:showCollectionUI()
end)
-- 活动 *****************************************************************************************************
isOpen = DataManager.SevenDayData:getIsOpen()
if isOpen then
offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY)
end
isShake = false
-- isRed = ModuleManager.ActivityManager:showRp()
isRed = DataManager.SevenDayData:getRp()
rp = rp or (isOpen and isRed)
forceDisVisible = false
local isAdPoint = false
self:_refreshSideBar(SIDE_BAR_COMP_TYPE.ACTIVITY, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function()
-- ModuleManager.ActivityManager:showHallUI()
ModuleManager.SevenDayManager:showUI()
end)
-- 处理总红点
-- TODOJ
end
-- 定时刷新底部红点
function MainCityUI:refreshBottomRedPoint()
-- 英雄
if DataManager.HeroData:showHeroRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.HERO then
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.HERO].baseObject:addRedPoint(40, 40, 0.7)
else
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.HERO].baseObject:removeRedPoint()
end
-- 修炼
if DataManager.ChapterData:showTrainRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.TRAIN then
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.TRAIN].baseObject:addRedPoint(40, 40, 0.7)
else
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.TRAIN].baseObject:removeRedPoint()
end
-- 挖矿
if DataManager.ResearchData:showRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.DUNGEON].baseObject:addRedPoint(40, 40, 0.7)
else
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.DUNGEON].baseObject:removeRedPoint()
end
-- 商城显示广告图标
if DataManager.ShopData:showAdImg() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.SHOP then
local skip = DataManager.MallActData:skipAd()
local iconName = skip and "common_ad_4" or "common_ad_3"
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:addRedPoint(40, 40, 0.7, iconName, nil, true)
else
-- 商城
if DataManager.ShopData:showRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.SHOP then
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:addRedPoint(40, 40, 0.7, nil, nil, true)
else
self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:removeRedPoint()
end
end
if self.tutorialTaskFinger then
if DataManager.TutorialTaskData:showFinger() and (self.targetIndex == nil or self.targetIndex == 0) then
self.tutorialTaskFinger:setVisible(true)
self.tutorialTaskFinger:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play(50306902)
else
self.tutorialTaskFinger:setVisible(false)
end
end
end
-- 检测弹窗
function MainCityUI:checkMainPop()
local topUI = UIManager:getTopUIObj()
if topUI:getUIIndex() ~= self:getUIIndex() then
return
end
-- 签到弹窗
local signIsOpen = ModuleManager.SignInManager:getIsSignInOpen()
if signIsOpen and self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then
local signCount, canSignIn, hasSigned = DataManager:getSignInfo()
if signCount < 7 and (not hasSigned) and canSignIn then
ModuleManager.SignInManager:showSignMainUI()
return
end
end
self:checkTutorial()
end
-- 动态获取侧边栏按钮
function MainCityUI:_refreshSideBar(type, isOpen, isShake, isRed, isAdPoint, parent, x, y, forceDisVisible, clickCallback)
if not self.sideBarCells then
self.sideBarCells = {}
end
if not self.sideBarCells[type] then
if not self.loadingSideBarCells then
self.loadingSideBarCells = {}
end
if not self.loadingSideBarCells[type] then -- 未加载中,加载对应模块侧边栏按钮
self.loadingSideBarCells[type] = true
CellManager:loadCellAsync(SIDE_BAR_PREFAB_PATH[type], SIDE_BAR_COMP_PATH[type], parent, function(cell)
self.loadingSideBarCells[type] = false
-- 如果已经加载了 则销毁新生成的
if self.sideBarCells[type] then
self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback)
cell.baseObject:destroy()
return
end
cell.baseObject:getGameObject().name = SIDE_BAR_NAME[type]
self.sideBarCells[type] = cell
self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback)
end)
end
else
self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback)
end
end
-- 获取侧边栏按钮相对位置
function MainCityUI:_getSideBtnPos(btnNum, offsetY, isRight)
local x = 0
local y = offsetY
local maxColumnNum = self:_getMaxColumnNum()
btnNum = btnNum + 1
if btnNum < maxColumnNum then
offsetY = offsetY - (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE)
else
local num = btnNum - maxColumnNum
if num > 0 then
if not isRight then
x = SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE
else
x = - (SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE)
end
end
offsetY = -(SIDE_BAR_DEFAULT_CELL_HEIGHT / 2) - num * (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE)
end
return offsetY, btnNum, x, y
end
-- 侧边栏按钮可支持数量
function MainCityUI:_getMaxColumnNum()
if not self.maxColumnNum then
local screenOffsetY = GFunc.calculateFitSizeY()
self.maxColumnNum = 5 + screenOffsetY // (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE)
end
return self.maxColumnNum
end
function MainCityUI:checkTutorial()
if self.targetIndex == nil or self.targetIndex == 0 then
ModuleManager.TutorialManager:checkAndPlayForceTutorial()
end
end
-- 提供给战斗使用 隐藏除战斗外的UI
function MainCityUI:hideMainUIExceptBattle()
if self.chapterSliderComp then
self.chapterSliderComp.baseObject:setVisible(false)
end
local leftNode = self.uiMap["main_ui.left_node"]
leftNode:setVisible(false)
local rightNode = self.uiMap["main_ui.right_node"]
rightNode:setVisible(false)
local bottomNode = self.uiMap["main_ui.bottom_node"]
bottomNode:setVisible(false)
self:refreshBottom(nil, true)
end
function MainCityUI:showMainUIExceptBattle()
if self.chapterSliderComp then
self.chapterSliderComp.baseObject:setVisible(true)
end
local leftNode = self.uiMap["main_ui.left_node"]
leftNode:setVisible(true)
local rightNode = self.uiMap["main_ui.right_node"]
rightNode:setVisible(true)
local bottomNode = self.uiMap["main_ui.bottom_node"]
bottomNode:setVisible(true)
end
function MainCityUI:refreshPower()
local hero = DataManager.HeroData:getMainHeroEntity()
if hero then
local powerTx = self.uiMap["main_ui.role_node.power_node.power_tx"]
powerTx:setText(BigNumOpt.bigNum2Str4Power(hero:getPower()))
end
end
function MainCityUI:showBlackUI(desc, time, isShowFail)
-- 自动关闭
if self.scheduleId then
self:unscheduleGlobal(self.scheduleId)
end
self.scheduleId = self:performWithDelayGlobal(function()
self.scheduleId = nil
self:hideBlackUI()
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.BATTLE_CLOSE_CHAPTER_BLACK_UI)
end,
time)
-- 表现
local descTx = self.uiMap["main_ui.black_node.black_bg.desc_tx"]
descTx:setText(nil)
local mask = self.uiMap["main_ui.black_node.black_bg"]
mask:setVisible(true)
local canvasGroup = mask:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP)
canvasGroup.alpha = 0
local sequence = mask:createBindTweenSequence()
local fadeTween = canvasGroup:DOFade(1, BLACK_FADE_TIME)
sequence:Append(fadeTween)
sequence:OnComplete(function()
descTx:setText(desc)
if not isShowFail then
Game:garbageCollect()
end
end)
end
function MainCityUI:hideBlackUI()
local mask = self.uiMap["main_ui.black_node.black_bg"]
mask:setVisible(false)
end
function MainCityUI:updateSavePowerModeTime()
local isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.POWER_SAVE_MODE, true)
local topUI = UIManager:getTopUIObj()
if isOpen and ModuleManager.GameSettingManager:getSavePowerMode() == 1 and topUI:getUIIndex() == self:getUIIndex() and self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then
self.savePowerModeTime = self.savePowerModeTime - 1
if self.savePowerModeTime < 0 then
ModuleManager.GameSettingManager:showSavePowerUI()
self:resetSavePowerTime()
end
end
end
function MainCityUI:resetSavePowerTime()
self.savePowerModeTime = SAVE_POWER_MODE_TIME
end
---- 引导任务强制领取
function MainCityUI:checkTutorialTaskMask()
if not self.targetIndex or self.targetIndex == 0 then
if DataManager.TutorialTaskData:showMaskFinger() then
self:showTutorialTaskNode()
else
self:hideTutorialTaskNode()
end
end
end
function MainCityUI:showTutorialTaskNode()
if not self.uiMap then
return
end
self.uiMap["main_ui.tutorial_task_node"]:setVisible(true)
if not self.tutorialMaskMat then
self.tutorialMaskMat = CS.UnityEngine.Object.Instantiate(RenderManager:getUITutorialMat())
self.tutorialMask = self.uiMap["main_ui.tutorial_task_node.mask"]
self.tutorialMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).material = self.tutorialMaskMat
self.clickArea = self.uiMap["main_ui.tutorial_task_node.click_area"]
self.clickArea:addClickListener(function()
end)
local taskComp = self.uiMap["main_ui.right_node.tutorial_task_comp"]
local rectTransform = taskComp:getComponent(GConst.TYPEOF_UNITY_CLASS.RECTTRANSFORM)
local rect = rectTransform.rect
local anchoredPosition = self:getTargetAnchoredPosition(taskComp)
self.tutorialMaskMat:SetVector(self:getCenterPropertyID(), {x = anchoredPosition.x, y = anchoredPosition.y, z = 0, w = 0})
self.tutorialMaskMat:SetFloat(self:getEllipsePropertyID(), 10)
self.tutorialMaskMat:SetFloat(self:getRectXPropertyID(), rect.width / 2 + 20)
self.tutorialMaskMat:SetFloat(self:getRectYPropertyID(), rect.height / 2 + 20)
self.tutorialFingerNode = self.uiMap["main_ui.tutorial_task_node.finger_node"]
self.tutorialBlockTouch = self.uiMap["main_ui.tutorial_task_node.block_touch"]
self.tutorialBlockTouch:addClickListener(function()
self.tutorialFingerNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("finger_click_prompt", -1, 0)
end)
self.tutorialClickAreaCS = self.clickArea:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_TUTORIAL_CLICKAREA)
self.tutorialClickAreaCS:ClearTargetTransform()
self.tutorialClickAreaCS:SetTargetTransform(self.uiMap["main_ui.right_node.tutorial_task_comp.chapter_task_bg"]:getTransform())
end
self.tutorialFingerNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("finger_click_prompt", -1, 0)
self.showingTutorialTaskNode = true
ModuleManager.BattleManager:pauseFightByTutorial()
end
function MainCityUI:getTargetAnchoredPosition(targetGo)
local rectTransform = targetGo:getComponent(GConst.TYPEOF_UNITY_CLASS.RECTTRANSFORM)
local rect = rectTransform.rect
local localToWorldMatrix = rectTransform.localToWorldMatrix
local tarCornerMid = localToWorldMatrix:MultiplyPoint3x4(BF.Vector3((rect.xMax + rect.x) / 2, (rect.yMax + rect.y) / 2, 0))
local screenPos = UIManager:getUICameraComponent():WorldToScreenPoint(tarCornerMid)
local anchoredPosition = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.root:getTransform(), screenPos.x, screenPos.y, UIManager:getUICameraComponent())
return anchoredPosition
end
function MainCityUI:getCenterPropertyID()
if not self._tutorialMatCenterId then
self._tutorialMatCenterId = CS.UnityEngine.Shader.PropertyToID("_Center")
end
return self._tutorialMatCenterId
end
function MainCityUI:getEllipsePropertyID()
if not self._tutorialMatEllipseId then
self._tutorialMatEllipseId = CS.UnityEngine.Shader.PropertyToID("_Ellipse")
end
return self._tutorialMatEllipseId
end
function MainCityUI:getRectXPropertyID()
if not self._tutorialMatRectXId then
self._tutorialMatRectXId = CS.UnityEngine.Shader.PropertyToID("_Rect_X")
end
return self._tutorialMatRectXId
end
function MainCityUI:getRectYPropertyID()
if not self._tutorialMatRectYId then
self._tutorialMatRectYId = CS.UnityEngine.Shader.PropertyToID("_Rect_Y")
end
return self._tutorialMatRectYId
end
function MainCityUI:hideTutorialTaskNode()
if not self.uiMap then
return
end
self.uiMap["main_ui.tutorial_task_node"]:setVisible(false)
if self.showingTutorialTaskNode then
ModuleManager.BattleManager:resumeFightByTutorial()
end
self.showingTutorialTaskNode = false
end
---- end 引导任务强制领取
function MainCityUI:onClose()
if self.sideBarCells then
for k, cell in pairs(self.sideBarCells) do
self.sideBarCells[k] = nil
cell.baseObject:destroy()
end
end
if self.loadingSideBarCells then
for k, _ in pairs(self.loadingSideBarCells) do
self.loadingSideBarCells[k] = false
end
end
DataManager:unregisterCrossDayFunc("crossDay")
end
return MainCityUI