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 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() if self.isAutoQuenching then -- 结束自动淬炼 self:endAutoQuenching() end end -- 自动淬炼刷新 function RunesInfoComp:autoQuenching() self:refreshSuit() self:refreshRunes() if not ModuleManager.RunesManager:isInSyncQuenching() then 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) if self.tempMaterialCount < self.tempCostNum then -- 剩余材料不够,结束自动淬炼 ModuleManager.RunesManager:reqSyncQuenching(true) else DataManager.RunesData:checkAutoTime() end EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.RUNE_QUENCHING_SUCCESS, self.tempMaterialCount) 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