PGRData/Script/matrix/xentity/xdlchunt/xviewmodel/XViewModelDlcHuntBag.lua
2024-09-01 22:49:41 +02:00

333 lines
No EOL
10 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XViewModelDlcHuntBagChildChip = require("XEntity/XDlcHunt/XViewModel/XViewModelDlcHuntBagChildChip")
local XViewModelDlcHuntBagChildOthers = require("XEntity/XDlcHunt/XViewModel/XViewModelDlcHuntBagChildOthers")
local XDlcHuntItem = require("XEntity/XDlcHunt/XDlcHuntItem")
local CHIP_FILTER_IGNORE = XDlcHuntChipConfigs.CHIP_FILTER_IGNORE
local XDlcHuntFilterCondition = require("XEntity/XDlcHunt/XDlcHuntFilterCondition")
local TAB = XDlcHuntConfigs.TAB_BAG
---@class XViewModelDlcHuntBag
local XViewModelDlcHuntBag = XClass(nil, "XViewModelDlcHuntBag")
function XViewModelDlcHuntBag:Ctor()
self._Tab = TAB.MAIN_CHIP
-- 主芯片
local conditionMain = XDlcHuntFilterCondition.New()
conditionMain.Ignore = conditionMain.Ignore | CHIP_FILTER_IGNORE.MAIN
self._ModelViewChildMain = XViewModelDlcHuntBagChildChip.New(conditionMain)
-- 从属芯片
local conditionSub = XDlcHuntFilterCondition.New()
conditionSub.Ignore = conditionSub.Ignore | CHIP_FILTER_IGNORE.SUB
self._ModelViewChildSub = XViewModelDlcHuntBagChildChip.New(conditionSub)
-- 其他(碎片)
---@type XViewModelDlcHuntBagChildOthers
self._ModelViewChildOthers = XViewModelDlcHuntBagChildOthers.New()
self._IsShowDecompose = false
self._ChipsSelected4Decompose = {}
self._StarSelected = {}
end
function XViewModelDlcHuntBag:SetTabIndex(index)
self._Tab = index
end
function XViewModelDlcHuntBag:GetTabIndex()
return self._Tab
end
---@return XViewModelDlcHuntBagChildChip
function XViewModelDlcHuntBag:GetViewModelChild()
if self._Tab == TAB.MAIN_CHIP then
return self._ModelViewChildMain
end
if self._Tab == TAB.SUB_CHIP then
return self._ModelViewChildSub
end
if self._Tab == TAB.OTHERS then
return self._ModelViewChildOthers
end
error("[XViewModelDlcHuntBag] invalid tab:", tostring(self._Tab))
end
function XViewModelDlcHuntBag:GetAmount()
if self._Tab == TAB.MAIN_CHIP then
return XDataCenter.DlcHuntChipManager.GetChipAmountMain(), XDlcHuntChipConfigs.CHIP_MAIN_CAPACITY
end
if self._Tab == TAB.SUB_CHIP then
return XDataCenter.DlcHuntChipManager.GetChipAmountSub(), XDlcHuntChipConfigs.CHIP_SUB_CAPACITY
end
if self._Tab == TAB.OTHERS then
return #self._ModelViewChildOthers:GetAllItem(), XDlcHuntChipConfigs.ITEM_CAPACITY
end
return 0, 0
end
function XViewModelDlcHuntBag:GetConditionDecompose()
local condition = XDlcHuntFilterCondition.New()
if self._Tab == TAB.MAIN_CHIP then
condition.Ignore = condition.Ignore | CHIP_FILTER_IGNORE.MAIN
end
if self._Tab == TAB.SUB_CHIP then
condition.Ignore = condition.Ignore | CHIP_FILTER_IGNORE.SUB
end
return condition
end
function XViewModelDlcHuntBag:IsShowPanelSort()
return self._Tab == TAB.MAIN_CHIP
or self._Tab == TAB.SUB_CHIP
end
function XViewModelDlcHuntBag:GetAllItem()
local allItem = self:GetViewModelChild():GetAllItem()
-- 分解界面,不显示已佩戴 or 援助中
if self._IsShowDecompose then
local result = {}
for i = 1, #allItem do
---@type XDlcHuntChip
local chip = allItem[i]
if not chip:HasSetAsAssistantChip2Others()
and not chip:IsInUse()
and not chip:IsLock()
then
result[#result + 1] = chip
end
end
return result
end
return allItem
end
function XViewModelDlcHuntBag:SetFilterType(index)
-- ui按钮顺序星级突破等级最近
if index == 1 then
self:GetViewModelChild():SetFilterType(XDlcHuntChipConfigs.CHIP_FILTER_TYPE.STAR)
return
end
if index == 2 then
self:GetViewModelChild():SetFilterType(XDlcHuntChipConfigs.CHIP_FILTER_TYPE.BREAKTHROUGH)
return
end
if index == 3 then
self:GetViewModelChild():SetFilterType(XDlcHuntChipConfigs.CHIP_FILTER_TYPE.LEVEL)
return
end
if index == 4 then
self:GetViewModelChild():SetFilterType(XDlcHuntChipConfigs.CHIP_FILTER_TYPE.RECENTLY)
return
end
XLog.Error("[XViewModelDlcHuntBag] unhandled sort index", index)
end
function XViewModelDlcHuntBag:GetFilterType()
local type = self:GetViewModelChild():GetFilterType()
if type == XDlcHuntChipConfigs.CHIP_FILTER_TYPE.STAR then
return 1
end
if type == XDlcHuntChipConfigs.CHIP_FILTER_TYPE.BREAKTHROUGH then
return 2
end
if type == XDlcHuntChipConfigs.CHIP_FILTER_TYPE.LEVEL then
return 3
end
if type == XDlcHuntChipConfigs.CHIP_FILTER_TYPE.RECENTLY then
return 4
end
return 1
end
function XViewModelDlcHuntBag:IsAscend()
return self:GetViewModelChild():IsAscend()
end
function XViewModelDlcHuntBag:SetFilterOrderInverse()
self:GetViewModelChild():SetFilterOrderInverse()
end
function XViewModelDlcHuntBag:SetVisibleDecomposeInverse()
self._IsShowDecompose = not self._IsShowDecompose
if self._IsShowDecompose then
for star, isSelected in pairs(self._StarSelected) do
self:SetStarSelected(star, isSelected)
end
else
self:ClearDecomposeSelected()
for star, isSelected in pairs(self._StarSelected) do
self:SetStarSelected(star, false)
end
end
self:SendEventUpdateChipSelected(true)
end
function XViewModelDlcHuntBag:IsVisibleDecompose()
return self._IsShowDecompose
end
function XViewModelDlcHuntBag:IsCanSelectGrid()
return self:IsVisibleDecompose()
end
--region decompose 把分解,合并到背包界面
---@param chip XDlcHuntChip
function XViewModelDlcHuntBag:SetChipSelected(chip)
if not chip then
return
end
self._ChipsSelected4Decompose[chip:GetUid()] = true
end
function XViewModelDlcHuntBag:SetChipUnselected(chipId)
self._ChipsSelected4Decompose[chipId] = false
end
---@param chip XDlcHuntChip
function XViewModelDlcHuntBag:SetChipSelectedInverse(chip)
local uid = chip:GetUid()
if self._ChipsSelected4Decompose[uid] then
self._ChipsSelected4Decompose[uid] = nil
else
self._ChipsSelected4Decompose[uid] = true
end
XEventManager.DispatchEvent(XEventId.EVENT_DLC_HUNT_CHIP_DECOMPOSE_UPDATE)
end
---@param chip XDlcHuntChip
function XViewModelDlcHuntBag:IsChipSelected(chip)
if not self._IsShowDecompose then
return false
end
return self._ChipsSelected4Decompose[chip:GetUid()]
end
---@return XDlcHuntChip[]
function XViewModelDlcHuntBag:_GetChipsSelected()
local result = {}
for uid, isSelected in pairs(self._ChipsSelected4Decompose) do
if isSelected then
local chip = XDataCenter.DlcHuntChipManager.GetChip(uid)
result[#result + 1] = chip
end
end
return result
end
---@return XDlcHuntItem[]
function XViewModelDlcHuntBag:GetDecomposeResult()
local result = {}
local itemDict = {}
local chips = self:_GetChipsSelected()
for i = 1, #chips do
local chip = chips[i]
local decomposeResult = chip:GetDecomposeResult()
itemDict[decomposeResult.ItemId] = (itemDict[decomposeResult.ItemId] or 0) + decomposeResult.ItemCount
end
for itemId, itemCount in pairs(itemDict) do
---@type XDlcHuntItem
local item = XDlcHuntItem.New()
item:SetAmount(itemCount)
item:SetItemId(itemId)
result[#result + 1] = item
end
return result
end
function XViewModelDlcHuntBag:GetDecomposeAmount()
local amount = 0
for uid, isSelected in pairs(self._ChipsSelected4Decompose) do
if isSelected then
amount = amount + 1
end
end
return amount
end
function XViewModelDlcHuntBag:IsCanDecompose()
return self:GetDecomposeAmount() > 0
end
-- 背包会满
function XViewModelDlcHuntBag:IsBagNotEnoughToHold()
local decomposeResult = self:GetDecomposeResult()
for i = 1, #decomposeResult do
local item = decomposeResult[i]
local itemId = item:GetItemId()
local ownItem = XDataCenter.ItemManager.GetItem(itemId)
local onwAmount = ownItem and ownItem.Count
if onwAmount + item:GetAmount() > item:GetCapacity() then
return true
end
end
return false
end
function XViewModelDlcHuntBag:DecomposeChips()
if not self:IsCanDecompose() then
return
end
if self:IsBagNotEnoughToHold() then
XUiManager.TipText("DlcHuntChipDecomposeFull")
return
end
XDataCenter.DlcHuntChipManager.DecomposeChips(self:_GetChipsSelected())
end
function XViewModelDlcHuntBag:SetStarSelected(star, isSelected)
self._StarSelected[star] = isSelected
if isSelected then
local allChips = self:GetAllItem()
for i = 1, #allChips do
---@type XDlcHuntChip
local chip = allChips[i]
if chip:GetStarAmount() == star and not chip:HasSetAsAssistantChip2Others() then
self._ChipsSelected4Decompose[chip:GetUid()] = true
end
end
else
for uid, isHasSelected in pairs(self._ChipsSelected4Decompose) do
if isHasSelected then
local chip = XDataCenter.DlcHuntChipManager.GetChip(uid)
if chip and chip:GetStarAmount() == star then
self._ChipsSelected4Decompose[uid] = nil
end
end
end
end
end
function XViewModelDlcHuntBag:SendEventUpdateChipSelected(updateItem)
XEventManager.DispatchEvent(XEventId.EVENT_DLC_HUNT_CHIP_DECOMPOSE_SELECT_UPDATE, updateItem)
end
function XViewModelDlcHuntBag:PickOutInvalidChip()
for uid, isHasSelected in pairs(self._ChipsSelected4Decompose) do
local chip = XDataCenter.DlcHuntChipManager.GetChip(uid)
if not chip then
self._ChipsSelected4Decompose[uid] = nil
end
end
end
function XViewModelDlcHuntBag:IsShowBtnDecompose()
return self._Tab ~= TAB.OTHERS
end
function XViewModelDlcHuntBag:ClearDecomposeSelected()
for uid, _ in pairs(self._ChipsSelected4Decompose) do
self._ChipsSelected4Decompose[uid] = nil
end
end
function XViewModelDlcHuntBag:ClearInvalidSelected()
for uid, _ in pairs(self._ChipsSelected4Decompose) do
if not XDataCenter.DlcHuntChipManager.GetChip(uid) then
self._ChipsSelected4Decompose[uid] = false
end
end
end
--endregion decompose
return XViewModelDlcHuntBag