PGRData/Script/matrix/xui/xuigacha/xuigachaorganize/XUiGachaOrganize.lua

428 lines
14 KiB
Lua
Raw Normal View History

local XUiGachaOrganize = XLuaUiManager.Register(XLuaUi, "UiGachaOrganize")
local XUiGridGacha = require("XUi/XUiGacha/XUiGachaOrganize/XUiGridGacha")
local MAX_GACHA_BTN_COUNT = 2 -- 抽卡按钮的数量
local NewUnlockGachaId -- 新解锁卡池的Id
function XUiGachaOrganize:OnAwake()
self.IsCanGacha = true
self.PreviewGridPool = {} -- XUiGridCommon池子
self.UsePreviewGrid = {} -- 正在使用的XUiGridCommon
self.DrawButtonComponent = {} -- 抽卡按钮的控件{ Btn, TxtDrawDesc, TxtUseItemCount, ImgUseItemIcon}
self:InitComponent()
self:AddListener()
end
function XUiGachaOrganize:OnStart(organizeId, curGachaId, organizeRule)
self.OrganizeId = organizeId
self.OrganizeRule = organizeRule
self.TextName.text = organizeRule.GachaName or ""
if self.TextName2 then
self.TextName2.text = organizeRule.GachaName2 or ""
end
self.BtnDrawRule.gameObject:SetActiveEx(organizeRule.UiType == XGachaConfigs.UiType.Pay)
self:GenerateGachas(curGachaId)
self:ChangeGacha(curGachaId)
end
function XUiGachaOrganize:InitComponent()
for i = 1, MAX_GACHA_BTN_COUNT do
local btnName = "BtnDraw" .. i
local btn = XUiHelper.TryGetComponent(self.PanelDrawButtons, btnName, "Button")
if btn then
if not self.DrawButtonComponent[i] then
self.DrawButtonComponent[i] = {}
end
self.DrawButtonComponent[i].Btn = btn
self.DrawButtonComponent[i].TxtDrawDesc = btn.transform:Find("TxtDrawDesc"):GetComponent("Text")
self.DrawButtonComponent[i].TxtUseItemCount = btn.transform:Find("TxtUseItemCount"):GetComponent("Text")
self.DrawButtonComponent[i].ImgUseItemIcon = btn.transform:Find("ImgUseItemIcon"):GetComponent("RawImage")
end
end
self.TextTip.text = CS.XTextManager.GetText("GachaOrganizeRankTip")
self.PanelGet.gameObject:SetActiveEx(false)
self.GridGacha.gameObject:SetActiveEx(false)
self.GridDrawActivity.gameObject:SetActiveEx(false)
self:InitDynamicTable()
end
function XUiGachaOrganize:InitDynamicTable()
self.DynamicTable = XDynamicTableCurve.New(self.PanelGachaList)
self.DynamicTable:SetProxy(XUiGridGacha)
self.DynamicTable:SetDelegate(self)
end
-----------------------------------------------按钮响应函数---------------------------------------------------------------
function XUiGachaOrganize:AddListener()
self.BtnBack.CallBack = function()
self:OnBtnBackClick()
end
self.BtnMainUi.CallBack = function()
self:OnBtnMainUiClick()
end
self.BtnMore.CallBack = function()
self:OnBtnMore()
end
self.BtnUseItem.CallBack = function()
self:OnBtnUseItemClick()
end
self.BtnDrawRule.CallBack = function()
self:OnBtnDrawRuleClick()
end
if self.BtnSwitchNext then
self.BtnSwitchNext.CallBack = function()
self:OnSwitchGachaClick(true)
end
end
if self.BtnSwitchPre then
self.BtnSwitchPre.CallBack = function()
self:OnSwitchGachaClick()
end
end
for i, btnComponent in ipairs(self.DrawButtonComponent) do
btnComponent.Btn.CallBack = function()
self:OnDrawClick(i)
end
end
end
function XUiGachaOrganize:OnBtnBackClick()
self:Close()
end
function XUiGachaOrganize:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiGachaOrganize:OnBtnMore()
XLuaUiManager.Open("UiGachaPanelPreview", self.CurGachaId)
end
function XUiGachaOrganize:OnBtnUseItemClick()
local data = XDataCenter.ItemManager.GetItem(self.GachaCfg.ConsumeId)
XLuaUiManager.Open("UiTip", data)
end
function XUiGachaOrganize:OnBtnDrawRuleClick()
XLuaUiManager.Open("UiDrawActivityLog", self.CurGachaId, nil, self.OrganizeRule)
end
function XUiGachaOrganize:OnSwitchGachaClick(isNext)
local index
if isNext then
index = self.SelectedIndex
else
index = self.SelectedIndex - 2
end
self.DynamicTable.Imp:TweenToIndex(index)
end
---
--- 'btnIndex'是抽卡按钮在DrawButtonComponent上的索引用来获取配置表上的抽卡次数配置
function XUiGachaOrganize:OnDrawClick(btnIndex)
-- 卡池是否处于开放时间
if not XDataCenter.GachaManager.CheckGachaIsOpenById(self.GachaCfg.Id, true, true) then
return
end
-- 卡池状态是否正常
local status = XDataCenter.GachaManager.GetOrganizeGachaStatus(self.OrganizeId, self.CurGachaId)
if status ~= XGachaConfigs.OrganizeGachaStatus.Normal then
if self.DrawButtonComponent[btnIndex].Btn.ButtonState == CS.UiButtonState.Normal then
XLog.Error("XUiGachaOrganize:OnDrawClick函数错误卡池的状态为非正常抽卡按钮的状态不应该是Normal")
end
if status == XGachaConfigs.OrganizeGachaStatus.Lock then
XUiManager.TipText("GachaOrganizeLockNotDraw")
elseif status == XGachaConfigs.OrganizeGachaStatus.SoldOut then
XUiManager.TipText("GachaOrganizeSoldOutNotDraw")
end
return
end
-- 武器意识的背包容量是否足够
if XDataCenter.EquipManager.CheckBoxOverLimitOfDraw() then
return
end
local gachaCount = self.GachaCfg.BtnGachaCount[btnIndex]
local ownItemCount = XDataCenter.ItemManager.GetItem(self.GachaCfg.ConsumeId).Count
local lackItemCount = self.GachaCfg.ConsumeCount * gachaCount - ownItemCount
-- 剩余次数是否足够
local dtCount = XDataCenter.GachaManager.GetMaxCountOfAll() - XDataCenter.GachaManager.GetCurCountOfAll()
if dtCount < gachaCount and not XDataCenter.GachaManager.GetIsInfinite() then
XUiManager.TipMsg(CS.XTextManager.GetText("GachaIsNotEnough"))
return
end
-- 货币是否足够
if lackItemCount > 0 then
if self.OrganizeRule.ItemNotEnoughSkipId > 0 then
XLuaUiManager.Open("UiDialog", CS.XTextManager.GetText("TipTitle"),
CS.XTextManager.GetText("GachaOrganizeNotEnoughSkipHint"), XUiManager.DialogType.Normal, nil, function()
XFunctionManager.SkipInterface(self.OrganizeRule.ItemNotEnoughSkipId)
end)
else
XUiManager.TipError(CS.XTextManager.GetText("GachaOrganizeDrawNotEnoughError"))
end
return
end
if self.IsCanGacha then
self.IsCanGacha = false
XLuaUiManager.SetMask(true)
local asyncPlayAnim = asynTask(self.PlayAnimation, self)
local cb = function(rewardList, newUnlockGachaId)
XDataCenter.AntiAddictionManager.BeginDrawCardAction()
RunAsyn(function()
asyncPlayAnim("PanelGetEnable")
XLuaUiManager.Open("UiGachaOrganizeDrawResult", rewardList, function()
self:WhetherUnLockNewGacha()
end)
NewUnlockGachaId = newUnlockGachaId
self.IsCanGacha = true
XLuaUiManager.SetMask(false)
self:RefreshItemCount()
self:RefreshGachaAfterDraw()
self:RefreshPreviewData()
self:RefreshDrawButton()
end)
end
local errorCb = function()
XLuaUiManager.SetMask(false)
self.IsCanGacha = true
end
XDataCenter.GachaManager.DoGacha(self.GachaCfg.Id, gachaCount, cb, errorCb, self.OrganizeId)
end
end
------------------------------------------------------------------------------------------------------------------------
---
--- 设置动态列表的DataSource生成卡池
function XUiGachaOrganize:GenerateGachas(curGachaId)
self.DataSource = XGachaConfigs.GetOrganizeGahcaIdList(self.OrganizeId)
-- SelectedIndex为打开时默认选择的卡池在DataSource中的索引
for index, id in ipairs(self.DataSource) do
if id == curGachaId then
self.SelectedIndex = index
break
end
end
if not self.SelectedIndex then
self.SelectedIndex = 1
end
self.DynamicTable:SetDataSource(self.DataSource)
self.DynamicTable:ReloadData(#self.DataSource > 0 and (self.SelectedIndex - 1) or -1)
end
-----------------------------------------------刷新界面------------------------------------------------------------------
---
--- 动态列表的index从0开始
--- self.SelectedIndex从1开始
function XUiGachaOrganize:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local i = index + 1
grid:Refresh(self.OrganizeId, self.DataSource[i])
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
self.DynamicTable.Imp:TweenToIndex(index)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_TWEEN_OVER then
-- 切换卡池时请求卡池的奖励库存与掉落信息
local startIndex = self.DynamicTable.Imp.StartIndex
local selectIndex = startIndex + 1
XDataCenter.GachaManager.GetGachaRewardInfoRequest(self.DataSource[selectIndex], function()
-- 先更改SelectIndex再更改CurGachaId最后刷新界面有GET_GACHA_DATA_INTERVAL秒的间隔时间限制
if self.SelectedIndex ~= selectIndex then
self.SelectedIndex = selectIndex
self:ChangeGacha(self.DataSource[selectIndex])
end
end)
end
end
---
--- 抽卡后检测是否解锁了新卡池
function XUiGachaOrganize:WhetherUnLockNewGacha()
if NewUnlockGachaId then
-- SelectedIndex比动态列表的Index多1所以会跳去下一个新解锁的卡池中
self.DynamicTable.Imp:TweenToIndex(self.SelectedIndex)
NewUnlockGachaId = nil
end
end
---
--- 切换卡池,刷新界面
---@param gachaId number
function XUiGachaOrganize:ChangeGacha(gachaId)
self.CurGachaId = gachaId
self.GachaCfg = XGachaConfigs.GetGachaCfgById(gachaId)
-- 刷新序号
local index
if self.SelectedIndex < 10 then
index = string.format("%s%s", "0", tostring(self.SelectedIndex))
else
index.tostring(self.SelectedIndex)
end
self.TxtRank.text = index
if self.BtnSwitchNext then
self.BtnSwitchNext.gameObject:SetActiveEx(not (self.SelectedIndex >= #self.DataSource))
end
if self.BtnSwitchPre then
self.BtnSwitchPre.gameObject:SetActiveEx(not (self.SelectedIndex <= 1))
end
-- 刷新代币
local icon = XDataCenter.ItemManager.GetItemBigIcon(self.GachaCfg.ConsumeId)
self.ImgUseItemIcon:SetRawImage(icon)
self:RefreshItemCount()
-- 刷新抽奖按钮
self:RefreshDrawButton()
-- 生成奖励
self:GeneratePreview()
self:PlayAnimation("QieHuan")
end
---
--- 刷新代币数量
--- 抽卡、切换卡池时刷新
function XUiGachaOrganize:RefreshItemCount()
self.TxtUseItemCount.text = XDataCenter.ItemManager.GetItem(self.GachaCfg.ConsumeId).Count
end
---
--- 刷新抽奖按钮
--- 抽卡、切换卡池时刷新
function XUiGachaOrganize:RefreshDrawButton()
local isLock = false
local status = XDataCenter.GachaManager.GetOrganizeGachaStatus(self.OrganizeId, self.CurGachaId)
if status ~= XGachaConfigs.OrganizeGachaStatus.Normal then
isLock = true
end
for i, btnComponent in ipairs(self.DrawButtonComponent) do
local gachaCount = self.GachaCfg.BtnGachaCount[i]
btnComponent.TxtDrawDesc.text = CS.XTextManager.GetText("GachaOrganizeDrawCount", gachaCount)
btnComponent.TxtUseItemCount.text = gachaCount * self.GachaCfg.ConsumeCount
local useItemIcon = XDataCenter.ItemManager.GetItemBigIcon(self.GachaCfg.ConsumeId)
btnComponent.ImgUseItemIcon:SetRawImage(useItemIcon)
btnComponent.Btn:SetDisable(isLock)
end
end
---
--- 生成预览奖励
--- 更换卡池时刷新
function XUiGachaOrganize:GeneratePreview()
-- 回收格子
for _, grid in pairs(self.UsePreviewGrid) do
local gridGO = grid.GameObject
if gridGO.activeSelf then
gridGO:SetActiveEx(false)
end
end
self.UsePreviewGrid = {}
-- 生成奖励预览
local count = 1
local gachaRewardInfo = XDataCenter.GachaManager.GetGachaRewardInfoById(self.CurGachaId)
for k, v in pairs(gachaRewardInfo) do
if count > self.OrganizeRule.PreviewShowCount then
break
end
if v.Rare then
-- 取出格子
local grid = self.PreviewGridPool[count]
if not grid then
local obj = CS.UnityEngine.Object.Instantiate(self.GridDrawActivity, self.PreviewContent)
grid = XUiGridCommon.New(self, obj)
self.PreviewGridPool[count] = grid
end
-- 刷新信息
if grid then
local tmpData = {}
tmpData.TemplateId = v.TemplateId
tmpData.Count = v.Count
local curCount
if v.RewardType == XGachaConfigs.RewardType.Count then
curCount = v.CurCount
end
grid:Refresh(tmpData, nil, nil, nil, curCount)
grid.GameObject:SetActiveEx(true)
self.UsePreviewGrid[k] = grid
count = count + 1
end
end
end
-- 刷新次数
self:RefreshPreviewCount()
self.PanelNumber.gameObject:SetActiveEx(not XDataCenter.GachaManager.GetIsInfinite())
end
---
--- 刷新奖励库存
--- 抽卡时刷新
function XUiGachaOrganize:RefreshPreviewData()
local gachaRewardInfo = XDataCenter.GachaManager.GetGachaRewardInfoById(self.CurGachaId)
-- 刷新奖励格子
for k, v in pairs(self.UsePreviewGrid or {}) do
local tmpData = {}
tmpData.TemplateId = gachaRewardInfo[k].TemplateId
tmpData.Count = gachaRewardInfo[k].Count
local curCount
if gachaRewardInfo[k].RewardType == XGachaConfigs.RewardType.Count then
curCount = gachaRewardInfo[k].CurCount
end
v:Refresh(tmpData, nil, nil, nil, curCount)
end
-- 刷新次数
self:RefreshPreviewCount()
end
---
--- 刷新卡池奖励进度
--- 抽卡、切换卡池时刷新
function XUiGachaOrganize:RefreshPreviewCount()
local curCount = XDataCenter.GachaManager.GetCurCountOfAll()
local maxCount = XDataCenter.GachaManager.GetMaxCountOfAll()
local countStr = CS.XTextManager.GetText("GachaAlreadyobtainedCount", curCount, maxCount)
self.TxtNumber.text = countStr
self.ImgJd.fillAmount = curCount / maxCount
end
---
--- 刷新所有卡池
--- 抽卡时刷新
function XUiGachaOrganize:RefreshGachaAfterDraw()
local grids = self.DynamicTable:GetGrids()
for _, grid in pairs(grids) do
grid:AfterDrawRefresh()
end
end