PGRData/Script/matrix/xui/xuifurniturerecycleobtain/XUiFurnitureObtain.lua
2024-09-01 22:49:41 +02:00

502 lines
No EOL
18 KiB
Lua

local XUiGridObtain = require("XUi/XUiFurnitureRecycleObtain/XUiGridObtain")
local XUiFurnitureObtain = XLuaUiManager.Register(XLuaUi, "UiFurnitureObtain")
local FurnitureState
function XUiFurnitureObtain:OnAwake()
self:AddListener()
FurnitureState = XFurnitureConfigs.FURNITURE_STATE
end
function XUiFurnitureObtain:AddListener()
self:RegisterClickEvent(self.BtnClose, self.OnBtnCloseClick)
self:RegisterClickEvent(self.BtnReset, self.OnBtnResetClick)
self:RegisterClickEvent(self.BtnRecovery, self.OnBtnRecoveryClick)
self:RegisterClickEvent(self.BtnRefit, self.OnBtnRefitClick)
self:RegisterClickEvent(self.BtnBatchReset, self.OnBtnBatchResetClick)
self:RegisterClickEvent(self.BtnBatchRecovery, self.OnBtnBatchRecoveryClick)
self:RegisterClickEvent(self.BtnBatchRefit, self.OnBtnBatchRefitClick)
self:RegisterClickEvent(self.TogLevelA, self.OnTogLevelAClick)
self:RegisterClickEvent(self.TogLevelB, self.OnTogLevelBClick)
self:RegisterClickEvent(self.TogLevelC, self.OnTogLevelCClick)
end
function XUiFurnitureObtain:OnStart(gainType, furnitureList, refitCallBack, createCoinCount, isCloseBatchRecovery, isCloseBatchRemake, isCloseBatchRefit)
self.RefitCallBack = refitCallBack
self.FurnitureState = FurnitureState.DETAILS
self.IsRecovery = false
self.GainType = gainType
self.CreateCoinCount = createCoinCount or 0
self.IsCloseBatchRecovery = isCloseBatchRecovery
self.IsCloseBatchRemake = isCloseBatchRemake
self.BtnBatchRecovery.gameObject:SetActiveEx(not isCloseBatchRecovery)
self.BtnBatchReset.gameObject:SetActiveEx(not isCloseBatchRemake)
self.BtnBatchRefit.gameObject:SetActiveEx(not isCloseBatchRefit)
self:InitFurnitureDatas(furnitureList)
self:InitDynamicTable()
self:InitBtnState()
end
function XUiFurnitureObtain:OnEnable()
XEventManager.AddEventListener(XEventId.EVENT_CLICK_FURNITURE_GRID, self.OnObtainGridClick, self)
end
function XUiFurnitureObtain:OnDisable()
XEventManager.RemoveEventListener(XEventId.EVENT_CLICK_FURNITURE_GRID, self.OnObtainGridClick, self)
end
function XUiFurnitureObtain:InitFurnitureDatas(furnitueList)
self.FurnitureIds = {}
self.FurnitureLevelDic = {}
if not furnitueList or #furnitueList <= 0 then
return
end
local white = XGoodsCommonManager.QualityType.White
local greed = XGoodsCommonManager.QualityType.Greed
local blue = XGoodsCommonManager.QualityType.Blue
local purple = XGoodsCommonManager.QualityType.Purple
local gold = XGoodsCommonManager.QualityType.Gold
for _, furniture in ipairs(furnitueList) do
table.insert(self.FurnitureIds, furniture.Id)
local furnitureType = XDataCenter.FurnitureManager.GetFurnitureConfigByUniqueId(furniture.Id).TypeId
local totalScore = XDataCenter.FurnitureManager.GetFurnitureScore(furniture.Id)
local quality = XFurnitureConfigs.GetFurnitureTotalAttrLevel(furnitureType, totalScore)
local insert = function(color, id)
if not self.FurnitureLevelDic[color] then
self.FurnitureLevelDic[color] = {}
end
table.insert(self.FurnitureLevelDic[color], id)
end
if quality == white then
insert(white, furniture.Id)
elseif quality == greed then
insert(greed, furniture.Id)
elseif quality == blue then
insert(blue, furniture.Id)
elseif quality == purple then
insert(purple, furniture.Id)
elseif quality >= gold then
insert(gold, furniture.Id)
end
end
end
function XUiFurnitureObtain:InitDynamicTable()
self.ObtainGrid.gameObject:SetActiveEx(false)
self.DynamicTable = XDynamicTableNormal.New(self.PanelDynamic)
self.DynamicTable:SetProxy(XUiGridObtain)
self.DynamicTable:SetDelegate(self)
end
--动态列表事件
function XUiFurnitureObtain:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:Init(self)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local data = self.FurnitureIds[index]
grid:Refresh(data, self.SelectQualityList)
end
end
function XUiFurnitureObtain:UpdateDynamicTable()
self.DynamicTable:SetDataSource(self.FurnitureIds)
self.DynamicTable:ReloadDataASync(1)
end
function XUiFurnitureObtain:InitBtnState()
local isCreate = self:IsCreate() or self:IsRemake()
self.BtnBatchReset.gameObject:SetActiveEx(isCreate and not self.IsCloseBatchRemake)
self.BtnBatchRefit.gameObject:SetActiveEx(not isCreate)
local icon = XDataCenter.ItemManager.GetItemIcon(XDataCenter.ItemManager.ItemId.FurnitureCoin)
self.RImgIcon:SetRawImage(icon)
self:ChangeUiState()
end
function XUiFurnitureObtain:ChangeUiState()
self.FurnitureSelectList = {}
self.FurnitureSelectCount = 0
self.SelectQualityList = {}
if self.FurnitureState == FurnitureState.DETAILS then
self.PanelBatch.gameObject:SetActiveEx(true)
self.PanelEdit.gameObject:SetActiveEx(false)
elseif self.FurnitureState == FurnitureState.SELECT then
self.PanelBatch.gameObject:SetActiveEx(false)
self.PanelEdit.gameObject:SetActiveEx(true)
self.TogLevelA.isOn = false
self.TogLevelB.isOn = false
self.TogLevelC.isOn = false
local isCreate = self:IsCreate() or self:IsRemake()
self.BtnReset.gameObject:SetActiveEx(not self.IsRecovery and isCreate)
self.BtnRefit.gameObject:SetActiveEx(not self.IsRecovery and not isCreate)
self.TxtDesc.gameObject:SetActiveEx(self.IsRecovery or isCreate)
self.BtnRecovery.gameObject:SetActiveEx(self.IsRecovery)
if self.IsRecovery or isCreate then
local text = self.IsRecovery and CS.XTextManager.GetText("DormObtainRecovery") or CS.XTextManager.GetText("DormObtainReset")
self.TxtDesc.text = text
end
self:SetCoinCount()
end
self:UpdateDynamicTable()
end
function XUiFurnitureObtain:SetCoinCount()
self.IsRefitCoinEnough = true
if self.FurnitureSelectCount <= 0 then
self.TxtCoin.text = 0
return
end
local getRewardCount = function()
local count = 0
local rewards = XDataCenter.FurnitureManager.GetRecycleRewards(self:GetFurnitureList())
local coinId = XDataCenter.ItemManager.ItemId.FurnitureCoin
for _, reward in ipairs(rewards) do
local templateId = (reward.TemplateId and reward.TemplateId > 0) and reward.TemplateId or reward.Id
if templateId == coinId then
count = count + reward.Count
end
end
return count
end
if self.IsRecovery then
self.TxtCoin.text = getRewardCount()
elseif self:IsCreate() or self:IsRemake() then
local rewardCount = getRewardCount()
--local createCount = self.CreateCoinCount * self.FurnitureSelectCount
local createCount = self:GetCreateCount()
local count = (createCount - rewardCount) > 0 and createCount - rewardCount or 0
local currentOwn = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.FurnitureCoin) + rewardCount
self.IsRefitCoinEnough = currentOwn >= createCount
self.TxtCoin.text = self.IsRefitCoinEnough and CS.XTextManager.GetText("DormBuildEnoughCount", count)
or CS.XTextManager.GetText("DormBuildNoEnoughCount", count)
end
end
function XUiFurnitureObtain:GetCreateCount()
local list = self:GetFurnitureList()
if XTool.IsTableEmpty(list) then
return 0
end
local coin = 0
for _, furnitureId in pairs(list) do
local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId)
if furniture then
local coinA, coinB, coinC = furniture:GetBaseAttr()
coin = coin + coinA + coinB + coinC
end
end
return coin
end
function XUiFurnitureObtain:CheckIncludeLevelS()
for id, _ in pairs(self.FurnitureSelectList) do
local furnitureType = XDataCenter.FurnitureManager.GetFurnitureConfigByUniqueId(id).TypeId
local totalScore = XDataCenter.FurnitureManager.GetFurnitureScore(id)
local quality = XFurnitureConfigs.GetFurnitureTotalAttrLevel(furnitureType, totalScore)
if quality >= XGoodsCommonManager.QualityType.Gold then
return true
end
end
return false
end
function XUiFurnitureObtain:GetGridSelected(id)
if self.FurnitureState == XFurnitureConfigs.FURNITURE_STATE.SELECT then
if self.FurnitureSelectCount <= 0 then
return false
end
for myId, _ in pairs(self.FurnitureSelectList) do
if myId == id then
return true
end
end
return false
end
return false
end
function XUiFurnitureObtain:GetFurnitureList()
local list = {}
for id, _ in pairs(self.FurnitureSelectList) do
table.insert(list, id)
end
return list
end
function XUiFurnitureObtain:RemoveSelectQuality(quality, closeTog)
local removeIndex
for i, k in ipairs(self.SelectQualityList) do
if k == quality then
removeIndex = i
break
end
end
if removeIndex then
table.remove(self.SelectQualityList, removeIndex)
end
if not closeTog then return end
local white = XGoodsCommonManager.QualityType.White
local greed = XGoodsCommonManager.QualityType.Greed
local blue = XGoodsCommonManager.QualityType.Blue
local purple = XGoodsCommonManager.QualityType.Purple
if (quality == white or quality == greed) and self.TogLevelC.isOn then
self.TogLevelC.isOn = false
elseif quality == blue and self.TogLevelB.isOn then
self.TogLevelB.isOn = false
elseif quality == purple and self.TogLevelA.isOn then
self.TogLevelA.isOn = false
end
end
function XUiFurnitureObtain:IsCreate()
return self.GainType == XFurnitureConfigs.GainType.Create
end
function XUiFurnitureObtain:IsRemake()
return self.GainType == XFurnitureConfigs.GainType.Remake
end
--------------------------------- 点击事件相关(Start) ---------------------------------
function XUiFurnitureObtain:OnObtainGridClick(furnitureId, furnitureConfigId, grid)
if self.FurnitureState == FurnitureState.DETAILS then
XLuaUiManager.Open("UiFurnitureDetail", furnitureId, furnitureConfigId, nil, nil, true, true, self.IsCloseBatchRemake)
elseif self.FurnitureState == FurnitureState.SELECT then
grid:SetSelected(not grid:IsSelected())
for myId, _ in pairs(self.FurnitureSelectList) do
if myId == furnitureId then
self.FurnitureSelectCount = self.FurnitureSelectCount - 1
self.FurnitureSelectList[myId] = nil
self:RemoveSelectQuality(grid.Quality, true)
self:SetCoinCount()
return
end
end
self.FurnitureSelectList[furnitureId] = true
self.FurnitureSelectCount = self.FurnitureSelectCount + 1
self:SetCoinCount()
end
end
function XUiFurnitureObtain:OnBtnCloseClick()
if self.FurnitureState == FurnitureState.DETAILS then
self:Close()
elseif self.FurnitureState == FurnitureState.SELECT then
self.FurnitureState = FurnitureState.DETAILS
self:ChangeUiState()
end
end
function XUiFurnitureObtain:OnBtnBatchResetClick()
self.IsRecovery = false
self.FurnitureState = FurnitureState.SELECT
self:ChangeUiState()
end
function XUiFurnitureObtain:OnBtnBatchRefitClick()
self.IsRecovery = false
self.FurnitureState = FurnitureState.SELECT
self:ChangeUiState()
end
function XUiFurnitureObtain:OnBtnBatchRecoveryClick()
self.IsRecovery = true
self.FurnitureState = FurnitureState.SELECT
self:ChangeUiState()
end
function XUiFurnitureObtain:OnTogLevelAClick()
local purple = XGoodsCommonManager.QualityType.Purple
self:OnTogLevelClick(self.TogLevelA, purple, true)
end
function XUiFurnitureObtain:OnTogLevelBClick()
local blue = XGoodsCommonManager.QualityType.Blue
self:OnTogLevelClick(self.TogLevelB, blue, true)
end
function XUiFurnitureObtain:OnTogLevelCClick()
local greed = XGoodsCommonManager.QualityType.Greed
local white = XGoodsCommonManager.QualityType.White
self:OnTogLevelClick(self.TogLevelC, white)
self:OnTogLevelClick(self.TogLevelC, greed, true)
end
function XUiFurnitureObtain:OnTogLevelClick(tog, quality, isFresh)
if not tog.isOn then
self:RemoveSelectQuality(quality)
-- 从选择列表中移除
local levelIdList = self.FurnitureLevelDic[quality] or {}
for _, id in ipairs(levelIdList) do
if self.FurnitureSelectList[id] then
self.FurnitureSelectCount = self.FurnitureSelectCount - 1
self.FurnitureSelectList[id] = nil
end
end
else
table.insert(self.SelectQualityList, quality)
-- 添加到选择列表
local levelIdList = self.FurnitureLevelDic[quality] or {}
for _, id in ipairs(levelIdList) do
if not self.FurnitureSelectList[id] then
self.FurnitureSelectList[id] = true
self.FurnitureSelectCount = self.FurnitureSelectCount + 1
end
end
end
if not isFresh then return end
self:UpdateDynamicTable()
self:SetCoinCount()
end
-- 重新建造
function XUiFurnitureObtain:OnBtnResetClick()
if not self.IsRefitCoinEnough then
XUiManager.TipMsg(CS.XTextManager.GetText("FurnitureZeroCoin"))
return
end
local func = function()
local furnitureList = self:GetFurnitureList()
if #furnitureList <= 0 then
XUiManager.TipMsg(CS.XTextManager.GetText("DormFurnitureRecycelNull"), XUiManager.UiTipType.Tip)
return
end
if #furnitureList > XFurnitureConfigs.MaxRemakeCount then
XUiManager.TipMsg(CS.XTextManager.GetText("DormBuildMaxCount", XFurnitureConfigs.MaxRemakeCount))
return
end
for _, furnitureId in pairs(furnitureList) do
if XDataCenter.FurnitureManager.GetFurnitureIsLocked(furnitureId) then
XUiManager.TipMsg(CS.XTextManager.GetText("DormCannotRemakeLockFurniture"))
return
end
end
local furnitureId = furnitureList[1]
local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId)
local costA, costB, costC = furniture:GetBaseAttr()
XDataCenter.FurnitureManager.FurnitureRemake(furnitureList, costA, costB, costC, nil, function()
self:Close()
end)
end
if self:CheckIncludeLevelS() then
local titletext = CS.XTextManager.GetText("TipTitle")
local contenttext = CS.XTextManager.GetText("DormObtainLevelSReset")
XUiManager.DialogTip(titletext, contenttext, XUiManager.DialogType.Normal, nil, function()
func()
end)
else
func()
end
end
-- 回收
function XUiFurnitureObtain:OnBtnRecoveryClick()
local func = function()
local furnitureList = self:GetFurnitureList()
if #furnitureList <= 0 then
XUiManager.TipMsg(CS.XTextManager.GetText("DormFurnitureRecycelNull"), XUiManager.UiTipType.Tip)
return
end
for _, furnitureId in pairs(furnitureList) do
if XDataCenter.FurnitureManager.GetFurnitureIsLocked(furnitureId) then
XUiManager.TipMsg(CS.XTextManager.GetText("DormCannotRecycleLockFurniture"))
return
end
end
XDataCenter.FurnitureManager.DecomposeFurniture(furnitureList, function(rewardItems, successIds, isFailed)
if not isFailed then
-- 打开回收界面
XLuaUiManager.Open("UiDormBagRecycle", furnitureList, rewardItems, nil, function()
self:Close()
end)
-- 将分解成功的家具从缓存中移除
for _, id in ipairs(successIds) do
-- local configId = XDataCenter.FurnitureManager.GetFurnitureConfigId(id)
XDataCenter.FurnitureManager.RemoveFurniture(id)
end
-- 删除红点
XDataCenter.FurnitureManager.DeleteNewHint(successIds)
XEventManager.DispatchEvent(XEventId.EVENT_FURNITURE_ON_MODIFY)
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FURNITURE_ON_MODIFY)
end
end)
end
if self:CheckIncludeLevelS() then
local titletext = CS.XTextManager.GetText("TipTitle")
local contenttext = CS.XTextManager.GetText("DormObtainLevelSRecovery")
XUiManager.DialogTip(titletext, contenttext, XUiManager.DialogType.Normal, nil, function()
func()
end)
else
func()
end
end
-- 重新改造
function XUiFurnitureObtain:OnBtnRefitClick()
local func = function()
self:Close()
if self.RefitCallBack then
local furnitureList = self:GetFurnitureList()
if #furnitureList <= 0 then
XUiManager.TipMsg(CS.XTextManager.GetText("DormFurnitureRecycelNull"), XUiManager.UiTipType.Tip)
return
end
self.RefitCallBack(furnitureList)
end
end
for id, _ in pairs(self.FurnitureSelectList) do
if XDataCenter.FurnitureManager.GetFurnitureIsLocked(id) then
XUiManager.TipMsg(CS.XTextManager.GetText("DormCannotRemakeLockFurniture"))
return
end
end
if self:CheckIncludeLevelS() then
local titletext = CS.XTextManager.GetText("TipTitle")
local contenttext = CS.XTextManager.GetText("DormObtainLevelSRefit")
XUiManager.DialogTip(titletext, contenttext, XUiManager.DialogType.Normal, nil, function()
func()
end)
else
func()
end
end
--------------------------------- 点击事件相关(End) ---------------------------------