c1_lua/lua/app/ui/hero/runes_info_comp.lua
2023-09-19 10:50:56 +08:00

322 lines
12 KiB
Lua

local RunesInfoComp = class("RunesInfoComp", LuaComponent)
local LOCK_ICON = "common_lock"
local UNLOCK_ICON = "common_lock_1"
function RunesInfoComp:onClose()
if self.autoSid then
self.baseObject:unscheduleGlobal(self.autoSid)
self.autoSid = nil
end
if self.autoSyncSid then
self.baseObject:unscheduleGlobal(self.autoSyncSid)
self.autoSyncSid = nil
end
end
function RunesInfoComp:init()
local uiMap = self:getUIMap()
self.btnHelp = uiMap["runes_info.btn_help"]
self.imgProg = uiMap["runes_info.prog.img_prog"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.txProg = uiMap["runes_info.prog.tx_prog"]
self.txLevel = uiMap["runes_info.level.tx_level"]
self.btnSuit = uiMap["runes_info.btn_suit"]
self.txSuit = uiMap["runes_info.btn_suit.tx_suit"]
self.itemMaterial = uiMap["runes_info.item_material"]
self.txNum = uiMap["runes_info.item_material.tx_num"]
self.btnUse = uiMap["runes_info.bottom.btn_use"]
self.txUse = uiMap["runes_info.bottom.btn_use.tx_use"]
self.imgCost = uiMap["runes_info.bottom.btn_use.cost.img_cost"]
self.txCost = uiMap["runes_info.bottom.btn_use.cost.tx_cost"]
self.btnAuto = uiMap["runes_info.bottom.btn_auto"]
self.spineAuto = uiMap["runes_info.bottom.btn_auto.spine_auto"]
self.txAuto = uiMap["runes_info.bottom.btn_auto.tx_auto"]
self.txEmpty = uiMap["runes_info.suits.tx_empty"]
self.mask = uiMap["runes_info.bottom.mask"]
self.btnAutoEnd = uiMap["runes_info.bottom.btn_auto_end"]
self.txAutoEnd = uiMap["runes_info.bottom.btn_auto_end.tx_end"]
self.suitsNode = uiMap["runes_info.suits"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_HORIZONTAL_OR_VERTICAL_LAYOUT)
self.suits = {}
for i = 1, 3 do
self.suits[i] = uiMap["runes_info.suits.item_suit_" .. i]
end
self.grids = {}
for i = 1, 6 do
self.grids[i] = uiMap["runes_info.list_attr.grid_" .. i]
end
self.mask:setActive(false)
self.txSuit:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_2))
self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_5))
self.txEmpty:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_23))
self.txAutoEnd:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_29))
self.txAuto:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_4))
self.itemMaterial:addClickListener(function()
UIManager:showUI("app/ui/runes/runes_source_ui")
end)
self.btnHelp:addClickListener(function()
UIManager:showUI("app/ui/runes/runes_level_ui")
end)
self.btnSuit:addClickListener(function()
UIManager:showUI("app/ui/runes/runes_suit_ui", self.heroEntity)
end)
self.btnAuto:addClickListener(function()
if not DataManager.RunesData:canAutoMake() then
GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_27, DataManager.RunesData:getAutoMakeOpenLevel()))
return
end
local params ={
content = I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_21),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL,
showToday = GConst.MESSAGE_BOX_SHOW_TODAY.RUNES_AUTO,
okFunc = function()
self:checkQuenching(true)
end,
}
GFunc.showMessageBox(params)
end)
self.btnAutoEnd:addClickListener(function()
-- 玩家点击停止自动淬炼
ModuleManager.RunesManager:reqSyncQuenching(true)
end)
self.btnUse:addClickListener(function()
self:checkQuenching(false)
end)
self:bind(DataManager.BagData.ItemData, "dirty", function()
self:refresh()
end)
self:bind(DataManager.RunesData, "isDirty", function()
self:refresh()
end)
end
function RunesInfoComp:setHeroData(heroEntity)
self.heroEntity = heroEntity
self.runesEntity = DataManager.RunesData:getRunes(self.heroEntity:getCfgId())
end
function RunesInfoComp:updateData()
self.exp = self.runesEntity:getExp()
end
function RunesInfoComp:refresh()
if self.autoSid then
self.baseObject:unscheduleGlobal(self.autoSid)
self.autoSid = nil
end
if self.autoSyncSid then
self.baseObject:unscheduleGlobal(self.autoSyncSid)
self.autoSyncSid = nil
end
if ModuleManager.RunesManager:isInAutoQuenching() then
self:startAutoQuenching()
return
elseif self.isAutoQuenching then
-- 结束自动淬炼
self:endAutoQuenching()
end
self.txCost:setText(GFunc.getRewardNum(self.runesEntity:getMaterialCost()))
GFunc.centerImgAndTx(self.imgCost, self.txCost)
if DataManager.RunesData:canAutoMake() then
self.spineAuto:playAnim("idle", true, true)
else
self.spineAuto:playAnim("idle2", true, true)
end
self:refreshLevelExp()
self:refreshSuit()
self:refreshRunes()
end
-- 自动淬炼刷新
function RunesInfoComp:autoQuenching()
DataManager.RunesData:onAutoQuenchingOnce()
self.tempExp = self.tempExp + self.tempCostNum
self.tempMaterialCount = self.tempMaterialCount - self.tempCostNum
self.tempLevel = DataManager.RunesData:getLevelByExp(self.tempExp)
local curCfg = DataManager.RunesData:getLevelConfig()[self.tempLevel]
local nextCfg = DataManager.RunesData:getLevelConfig()[self.tempLevel + 1]
local maxExp = (nextCfg and nextCfg.cost or 0) - (curCfg and curCfg.cost or 0)
if maxExp then
local levelExp = self.tempExp - (curCfg and curCfg.cost or 0)
self.imgProg.value = levelExp / maxExp
self.txProg:setText(levelExp .. "/" .. maxExp)
else
self.imgProg.value = 1
self.txProg:setText(I18N:getGlobalText(I18N.GlobalConst.STR_MAX))
end
self.txLevel:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_1, self.tempLevel))
self.txNum:setText(self.tempMaterialCount)
self:refreshSuit()
self:refreshRunes()
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.RUNE_QUENCHING_SUCCESS, self.tempMaterialCount)
if self.tempMaterialCount < self.tempCostNum then
-- 剩余材料不够,结束自动淬炼
ModuleManager.RunesManager:reqSyncQuenching(true)
end
end
-- 刷新等级经验、道具个数
function RunesInfoComp:refreshLevelExp()
local curExp = DataManager.RunesData:getLevelExp()
local maxExp = DataManager.RunesData:getNextLevelTotalExp()
if maxExp then
self.imgProg.value = curExp / maxExp
self.txProg:setText(curExp .. "/" .. maxExp)
else
self.imgProg.value = 1
self.txProg:setText(I18N:getGlobalText(I18N.GlobalConst.STR_MAX))
end
self.txLevel:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_1, DataManager.RunesData:getLevel()))
self.txNum:setText(DataManager.RunesData:getMaterialCount())
end
-- 刷新符文
function RunesInfoComp:refreshRunes()
for index, obj in ipairs(self.grids) do
local map = obj:genAllChildren()
local imgQlt = map["img_qlt"]
local imgSuit = map["img_suit"]
local txAttr = map["tx_attr"]
local imgLock = map["img_lock"]
local lock = map["lock"]
local txLock = map["tx_lock"]
obj:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = false
if ModuleManager.RunesManager:isInAutoQuenching() and index <= DataManager.RunesData:getLevelConfig()[self.tempLevel].grid or DataManager.RunesData:isUnlock(index) then
lock:setActive(false)
local qlt = self.runesEntity:getGridQuality(index)
if qlt then
imgQlt:setSprite(GConst.ATLAS_PATH.HERO, GConst.RunesConst.QUALITY_ICON[qlt])
end
local suit = self.runesEntity:getGridSuit(index)
if suit then
imgSuit:setSprite(GConst.ATLAS_PATH.HERO, "hero_rune_"..suit)
end
imgLock:setSprite(GConst.ATLAS_PATH.COMMON, self.runesEntity:isAttrLock(index) and LOCK_ICON or UNLOCK_ICON)
local attr = self.runesEntity:getGridAttr(index)
if attr then
txAttr:setText(GFunc.getAttrDesc(attr.type, attr.num))
end
imgLock:addClickListener(function()
ModuleManager.RunesManager:reqChangeLockGrid(self.heroEntity:getCfgId(), index, not self.runesEntity:isAttrLock(index))
end)
else
lock:setActive(true)
txLock:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_3, DataManager.RunesData:getUnlockLevel(index)))
end
end
end
-- 刷新套装
function RunesInfoComp:refreshSuit()
local ids = self.runesEntity:getSuitIds()
local isEmpty = true
for index, obj in ipairs(self.suits) do
local map = obj:genAllChildren()
local img = map["img"]
local tx = map["tx"]
if ids[index] then
local level = self.runesEntity:getSuitLevel(ids[index].id)
if level > 0 then
isEmpty = false
obj:setActive(true)
img:setSprite(GConst.ATLAS_PATH.HERO, "hero_rune_"..ids[index].id)
tx:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, level))
else
obj:setActive(false)
end
else
obj:setActive(false)
end
end
self.txEmpty:setActive(isEmpty)
self.suitsNode:RefreshLayout()
end
-- 检查淬炼
function RunesInfoComp:checkQuenching(isAuto)
-- 是否全部锁定
if DataManager.RunesData:getRunes(self.heroEntity:getCfgId()):getAttrLockCount() >= DataManager.RunesData:getUnlockCount() then
GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_25))
return
end
-- 材料是否足够
local cost = self.runesEntity:getMaterialCost()
if not GFunc.checkCost(GFunc.getRewardId(cost), GFunc.getRewardNum(cost), true) then
UIManager:showUI("app/ui/runes/runes_source_ui")
return
end
if self.runesEntity:isUnlockHighQlt() then
local params ={
content = I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_28),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL,
okText = I18N:getGlobalText(I18N.GlobalConst.CONTINUE_DESC),
okFunc = function()
self:reqQuenching(isAuto)
end,
}
GFunc.showMessageBox(params)
else
self:reqQuenching(isAuto)
end
end
-- 请求淬炼
function RunesInfoComp:reqQuenching(isAuto)
if isAuto then
-- 自动淬炼
self.isAutoQuenching = true
self.mask:setActive(true)
self.btnUse:setActive(false)
self.txAuto:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_30))
self.spineAuto:playAnim("attack", true, true)
ModuleManager.RunesManager:reqAutoQuenching(self.heroEntity:getCfgId())
else
-- 单次淬炼
ModuleManager.RunesManager:reqQuenching(self.heroEntity:getCfgId())
end
end
-- 开始自动淬炼
function RunesInfoComp:startAutoQuenching()
self.tempLevel = DataManager.RunesData:getLevel()
self.tempExp = DataManager.RunesData:getExp()
self.tempCostNum = self.runesEntity:getMaterialCostNum()
self.tempMaterialCount = DataManager.RunesData:getMaterialCount()
self.autoSid = self.baseObject:scheduleGlobal(function() self:autoQuenching() end, 1 / GConst.RunesConst.AUTO_INTERVAL)
self.autoSyncSid = self.baseObject:scheduleGlobal(function() ModuleManager.RunesManager:reqSyncQuenching(false, true) end, GConst.RunesConst.SYNC_INTERVAL)
end
-- 结束自动淬炼
function RunesInfoComp:endAutoQuenching()
self.isAutoQuenching = false
self.mask:setActive(false)
self.btnUse:setActive(true)
self.txAuto:setText(I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_4))
self.spineAuto:playAnim("idle", true, true)
for index, obj in ipairs(self.grids) do
local qlt = self.runesEntity:getGridQuality(index)
if qlt and qlt >= GConst.RunesConst.CHECK_QLT_LOCK and not self.runesEntity:isAttrLock(index) then
local animator = obj:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR)
animator.enabled = true
-- CS.UnityEngine.Animator.StringToHash("runes_shake") 结果是1132417824
animator:Play(1132417824, -1, 0)
end
end
end
return RunesInfoComp