c1_lua/lua/app/ui/equip/equip_resolve_ui.lua
2025-10-11 15:46:19 +08:00

345 lines
11 KiB
Lua
Executable File

local EquipResolveUI = class("EquipResolveUI", BaseUI)
function EquipResolveUI:onClose()
end
function EquipResolveUI:isFullScreen()
return false
end
function EquipResolveUI:ctor()
self.isOpenPartSelect = false
self.isOpenQltSelect = false
self.selectedPart = 0
self.selectedQlt = 0
self.selectEquips = {}
end
function EquipResolveUI:getPrefabPath()
return "assets/prefabs/ui/equip/equip_resolve_ui.prefab"
end
function EquipResolveUI:onLoadRootComplete()
local uiMap = self.root:genAllChildren()
uiMap["equip_resolve_ui.mask"]:addClickListener(function()
self:closeUI()
end)
uiMap["equip_resolve_ui.bg.close_btn"]:addClickListener(function()
self:closeUI()
end)
self.titleTx = uiMap["equip_resolve_ui.bg.title_tx"]
self.bg1 = uiMap["equip_resolve_ui.bg.bg_1"]
self.bg2 = uiMap["equip_resolve_ui.bg.bg_2"]
self.scrollrect = uiMap["equip_resolve_ui.bg.scrollrect"]
self.listPart = uiMap["equip_resolve_ui.bg.list_part"]
self.listPartBtns = {}
for i = 0, 6 do
local partBtn = uiMap["equip_resolve_ui.bg.list_part.scrollrect.viewport.content.part_btn_" .. i]
partBtn:addClickListener(function()
self:selectPart(i)
end)
local partTx = uiMap["equip_resolve_ui.bg.list_part.scrollrect.viewport.content.part_btn_" .. i .. ".text"]
if i == 0 then
partTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_QLT_SELECT_ALL_2))
else
partTx:setText(I18N:getGlobalText(GConst.EquipConst.EQUIP_PART_NAME[i]))
end
table.insert(self.listPartBtns, {partBtn = partBtn, partTx = partTx})
end
self.partBtn = uiMap["equip_resolve_ui.bg.part_btn"]
self.partTx = uiMap["equip_resolve_ui.bg.part_btn.text"]
self.listQlt = uiMap["equip_resolve_ui.bg.list_qlt"]
self.listBtnQlts = {}
for i = 0, 5 do
local qltBtn = uiMap["equip_resolve_ui.bg.list_qlt.scrollrect.viewport.content.qlt_btn_" .. i]
qltBtn:addClickListener(function()
self:selectQlt(i)
end)
local qltBtnTx = uiMap["equip_resolve_ui.bg.list_qlt.scrollrect.viewport.content.qlt_btn_" .. i .. ".text"]
self.listBtnQlts[i] = {qltBtn = qltBtn, qltBtnTx = qltBtnTx}
end
self.qltBtn = uiMap["equip_resolve_ui.bg.qlt_btn"]
self.qltBtnTx = uiMap["equip_resolve_ui.bg.qlt_btn.text"]
self.cost = uiMap["equip_resolve_ui.bg.cost"]
self.costTx = uiMap["equip_resolve_ui.bg.cost.cost_tx"]
self.selectAllBtn = uiMap["equip_resolve_ui.bg.select_all_btn"]
self.selectAllBtnTx = uiMap["equip_resolve_ui.bg.select_all_btn.text"]
self.resolveBtn = uiMap["equip_resolve_ui.bg.resolve_btn"]
self.emptyTx = uiMap["equip_resolve_ui.bg.empty_tx"]
self.titleTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_24))
uiMap["equip_resolve_ui.bg.desc_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_28))
uiMap["equip_resolve_ui.bg.resolve_btn.text"]:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_30))
uiMap["equip_resolve_ui.bg.empty_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_40))
self.partBtn:addClickListener(function()
self:openPartSelect()
end)
self.qltBtn:addClickListener(function()
self:openQltSelect()
end)
self.selectAllBtn:addClickListener(function()
if table.nums(self.selectEquips) < table.nums(self.listEquip) then
for i,v in ipairs(self.listEquip) do
self.selectEquips[v:getUid()] = v:getUid()
end
else
self.selectEquips = {}
end
self:refreshScrollRect()
end)
self.resolveBtn:addClickListener(function()
if table.nums(self.selectEquips) == 0 then
GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_31))
return
end
local params = {}
params.boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL_CLOSE
params.content = I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_48)
params.okFunc = function()
local listUid = {}
for i,uid in pairs(self.selectEquips) do
table.insert(listUid, uid)
end
ModuleManager.EquipManager:onEquipDecomposeReq(listUid)
end
GFunc.showMessageBox(params)
end)
self:bind(DataManager.EquipData, "isDirty", function()
self:onRefresh()
end)
self:bind(DataManager.EquipData, "isDirtyResolve", function()
self.selectEquips = {}
self.selectedPart = 0
self.selectedQlt = 0
self:onRefresh()
end)
end
function EquipResolveUI:onRefresh()
self.lowestFiveGrades, self.lowestFiveEquips = DataManager.EquipData:getLowestFiveGradeEquips()
for i = 0, 5 do
if i == 0 then
self.listBtnQlts[i].qltBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_QLT_SELECT_ALL_1))
else
if self.lowestFiveGrades[i] then
self.listBtnQlts[i].qltBtn:setActive(true)
self.listBtnQlts[i].qltBtnTx:setText(I18N:getGlobalText("EQUIP_QLT_SELECT", I18N:getGlobalText("EQUIP_QLT_DESC_" .. self.lowestFiveGrades[i].qlt, self.lowestFiveGrades[i].star)))
else
self.listBtnQlts[i].qltBtn:setActive(false)
end
end
end
self:refreshScrollRect()
self:refreshText()
end
function EquipResolveUI:refreshSelectEquip()
for i,uid in pairs(self.selectEquips) do
local shouldRemove = false
local equip = DataManager.EquipData:getEquipByUid(uid)
if self.selectedPart ~= 0 then
if equip:getPart() ~= self.selectedPart then
shouldRemove = true
end
end
if not shouldRemove and self.selectedQlt ~= 0 then
if equip:getQlt() > self.lowestFiveGrades[self.selectedQlt].qlt then
-- 品质高于要求
shouldRemove = true
elseif equip:getQlt() == self.lowestFiveGrades[self.selectedQlt].qlt then
-- 同品质时检查星级
if equip:getStar() > self.lowestFiveGrades[self.selectedQlt].star then
shouldRemove = true
end
end
end
if shouldRemove then
self.selectEquips[uid] = nil
end
end
end
function EquipResolveUI:openPartSelect()
if self.isOpenPartSelect then
self.isOpenPartSelect = false
else
self.isOpenPartSelect = true
self.listPart:setActive(true)
if self.isOpenQltSelect then
self:openQltSelect()
end
end
if self.partSeq then
self.partSeq:Kill()
self.partSeq = nil
end
self.partSeq = DOTweenManager:createSeqWithIntId()
local startSize = self.listPart:getSizeDeltaY()
local endSize = self.isOpenPartSelect and 420 or 0
local tween = CS.DG.Tweening.DOTween.To(
function()
return startSize
end,
function(y)
self.listPart:setSizeDeltaY(y)
end,
endSize, 0.3)
tween:SetEase(CS.DG.Tweening.Ease.InOutCirc)
self.partSeq:Append(tween)
self.partSeq:AppendCallback(function()
if self.partSeq then
self.partSeq:Kill()
self.partSeq = nil
end
if not self.isOpenPartSelect then
self.listPart:setActive(false)
end
end)
end
function EquipResolveUI:openQltSelect()
if self.isOpenQltSelect then
self.isOpenQltSelect = false
else
self.isOpenQltSelect = true
self.listQlt:setActive(true)
if self.isOpenPartSelect then
self:openPartSelect()
end
end
if self.qltSeq then
self.qltSeq:Kill()
self.qltSeq = nil
end
self.qltSeq = DOTweenManager:createSeqWithIntId()
local startSize = self.listQlt:getSizeDeltaY()
local endSize = self.isOpenQltSelect and 368 or 0
local tween = CS.DG.Tweening.DOTween.To(
function()
return startSize
end,
function(y)
self.listQlt:setSizeDeltaY(y)
end,
endSize, 0.3)
tween:SetEase(CS.DG.Tweening.Ease.InOutCirc)
self.qltSeq:Append(tween)
self.qltSeq:AppendCallback(function()
if self.qltSeq then
self.qltSeq:Kill()
self.qltSeq = nil
end
if not self.isOpenQltSelect then
self.listQlt:setActive(false)
end
end)
end
function EquipResolveUI:selectPart(part)
if self.isOpenPartSelect then
self:openPartSelect()
end
self.selectedPart = part
self:refreshScrollRect()
self:refreshText()
end
function EquipResolveUI:selectQlt(qlt)
if self.isOpenQltSelect then
self:openQltSelect()
end
self.selectedQlt = qlt
self:refreshScrollRect()
self:refreshText()
end
function EquipResolveUI:refreshText()
if self.selectedPart == 0 then
self.partTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_QLT_SELECT_ALL_2))
else
self.partTx:setText(I18N:getGlobalText(GConst.EquipConst.EQUIP_PART_NAME[self.selectedPart]))
end
if self.selectedQlt == 0 then
self.qltBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_QLT_SELECT_ALL_1))
else
self.qltBtnTx:setText(I18N:getGlobalText("EQUIP_QLT_SELECT", I18N:getGlobalText("EQUIP_QLT_DESC_" .. self.lowestFiveGrades[self.selectedQlt].qlt, self.lowestFiveGrades[self.selectedQlt].star)))
end
end
-- 新增方法:根据选中的品质+星级,获取该等级及更低的所有装备
function EquipResolveUI:getEquipsByGradeAndBelow(selectedPart, selectedQlt, selectedStar)
-- 2. 筛选符合条件的装备
local resultEquips = {}
for _, group in ipairs(self.lowestFiveEquips) do
-- 判断是否低于或等于选中等级
if group:getQlt() < selectedQlt or (group:getQlt() == selectedQlt and group:getStar() <= selectedStar) then
if selectedPart == 0 or (selectedPart > 0 and group:getPart() == selectedPart) then
table.insert(resultEquips, group)
end
end
end
return resultEquips
end
function EquipResolveUI:refreshScrollRect()
if self.selectedQlt == 0 then
self.listEquip = DataManager.EquipData:getAllEquipsSortInverted(self.selectedPart, nil, nil, false)
else
self.listEquip = self:getEquipsByGradeAndBelow(self.selectedPart, self.lowestFiveGrades[self.selectedQlt].qlt, self.lowestFiveGrades[self.selectedQlt].star)
end
self.emptyTx:setActive(#self.listEquip <= 0)
if self.scrollRect == nil then
self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
self.scrollRect:addInitCallback(function()
return GConst.TYPEOF_LUA_CLASS.EQUIP_CELL
end)
self.scrollRect:addRefreshCallback(function(index, cell)
local isSelect = self.selectEquips[self.listEquip[index]:getUid()] ~= nil
cell:refresh(self.listEquip[index])
cell:showMask(isSelect)
cell:showCheck(isSelect)
cell:addClickListener(function()
if self.selectEquips[self.listEquip[index]:getUid()] then
self.selectEquips[self.listEquip[index]:getUid()] = nil
cell:showCheck(false)
cell:showMask(false)
else
self.selectEquips[self.listEquip[index]:getUid()] = self.listEquip[index]:getUid()
cell:showCheck(true)
cell:showMask(true)
end
self:refreshReward()
end)
end)
end
if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
self.scrollRect:refillCells(#self.listEquip)
elseif self.scrollRect:getTotalCount() ~= #self.listEquip then
self.scrollRect:clearCells()
self.scrollRect:refillCells(#self.listEquip)
else
self.scrollRect:updateAllCell()
end
self:refreshReward()
end
function EquipResolveUI:refreshReward()
self:refreshSelectEquip()
if table.nums(self.selectEquips) < table.nums(self.listEquip) then
self.selectAllBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_29))
else
self.selectAllBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_HERO_DESC_21))
end
local count = 0
for i,uid in pairs(self.selectEquips) do
local equip = DataManager.EquipData:getEquipByUid(uid)
local decompose = DataManager.EquipData:getResolveReward(equip:getId())
count = count + decompose.num
end
self.costTx:setText(count)
end
return EquipResolveUI