Files
StellaSora_DataLua/lua/game/ui/gachaex/gachactrl.lua
T
SL1900 e01012cbcc Update - 1.7.0.89
EN: 1.7.0.89
CN: 1.7.0.91
JP: 1.7.0.92
KR: 1.7.0.95
2026-02-28 15:00:00 +09:00

1452 lines
51 KiB
Lua

local GachaCtrl = class("GachaCtrl", BaseCtrl)
local LocalData = require("GameCore.Data.LocalData")
local newDayTime = UTILS.GetDayRefreshTimeOffset()
local WwiseManger = CS.WwiseAudioManager
local coverScript = {
[GameEnum.gachaStorageType.CharacterCardPool] = "Game.UI.GachaEx.GachaCover.GachaCoverCtrl_PermanentCharUp",
[GameEnum.gachaStorageType.DiscCardPool] = "Game.UI.GachaEx.GachaCover.GachaCoverCtrl_PermanentDiscUp",
[GameEnum.gachaStorageType.CharacterUpCardPool] = "Game.UI.GachaEx.GachaCover.GachaCoverCtrl_CharUp",
[GameEnum.gachaStorageType.DiscUpCardPool] = "Game.UI.GachaEx.GachaCover.GachaCoverCtrl_DiscUp",
[GameEnum.gachaStorageType.BeginnerCardPool] = "Game.UI.GachaEx.GachaCover.GachaCoverCtrl_NewBie"
}
GachaCtrl._mapNodeConfig = {
coverRoot = {
sNodeName = "----BGRoot----",
sComponentName = "Transform"
},
PoolContent = {sComponentName = "Transform"},
PoolTabTemplete = {},
btn_GachaOne = {
sComponentName = "UIButton",
callback = "OnBtnClick_One"
},
btn_GachaTen = {
sComponentName = "UIButton",
callback = "OnBtnClick_Ten"
},
txtBtnpoolDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Recruit_info"
},
txtBtnpoolHistory = {
sComponentName = "TMP_Text",
sLanguageId = "GachaHistory_Guarantee"
},
txtBtnshop = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Tog_Exchange"
},
txt_NewBieJump = {
sComponentName = "TMP_Text",
sLanguageId = "Gacha_NewBieRecord"
},
txt_NewBieCount = {sComponentName = "TMP_Text"},
TMP_gachaNewBieTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Gacha_NewBieSummonTitle"
},
TMP_gachaNewBieCost = {
sComponentName = "TMP_Text",
sLanguageId = "Gacha_NewBieSummonCost"
},
TMP_gachaOneTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Recruit_one"
},
TMP_gachaTenTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Recruit_ten"
},
TMP_GachaTimes = {sComponentName = "TMP_Text"},
imgItemOne = {sComponentName = "Image"},
imgItemTen = {sComponentName = "Image"},
imgNewBieItemTen = {sComponentName = "Image"},
TMP_gachaOneCost = {sComponentName = "TMP_Text"},
TMP_gachaTenCost = {sComponentName = "TMP_Text"},
imgBtnTip = {sComponentName = "Image"},
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btn_poolDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_GachaDetail"
},
btn_poolHistory = {
sComponentName = "UIButton",
callback = "OnBtnClick_GachaHistory"
},
btn_shop = {
sComponentName = "UIButton",
callback = "OnBtnClick_shop"
},
btn_NewBieJump = {
sComponentName = "UIButton",
callback = "OnBtnClick_NewBieJump"
},
btn_NewBieJumpRecord = {
sComponentName = "UIButton",
callback = "OnBtnClick_NewBieJumpRecord"
},
rootAnim = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
GachaOpenDoor = {},
GachaShow = {
sCtrlName = "Game.UI.GachaEx.GachaShowCtrl"
},
GachaShowResult = {
sCtrlName = "Game.UI.GachaEx.GachaShowResultCtrl"
},
GachaInfo = {
sNodeName = "----PoolInfo---- ",
sCtrlName = "Game.UI.GachaEx.GachaInfoCtrl"
},
GachaHistory = {
sNodeName = "----GachaHistory----",
sCtrlName = "Game.UI.GachaEx.GachaHistotyCtrl"
},
GachaProb = {
sNodeName = "----ProbInfo----",
sCtrlName = "Game.UI.GachaEx.GachaProbInfoCtrl"
},
GachaNewBieShowRecord = {
sNodeName = "GachaNewBieShowRecord",
sCtrlName = "Game.UI.GachaEx.GachaNewBieShowRecordCtrl"
},
GachaNewBieShowResult = {
sNodeName = "GachaNewBieShowResult",
sCtrlName = "Game.UI.GachaEx.GachaNewBieShowResultCtrl"
},
GachaNewBieSaveRecord = {
sNodeName = "GachaNewBieSaveRecord",
sCtrlName = "Game.UI.GachaEx.GachaNewBieSaveRecordCtrl"
},
GachaNewBieReplaceResult = {
sNodeName = "GachaNewBieReplaceResult",
sCtrlName = "Game.UI.GachaEx.GachaNewBieReplaceResultCtrl"
},
GachaNewBieObtainResult = {
sNodeName = "GachaNewBieObtainResult",
sCtrlName = "Game.UI.GachaEx.GachaNewBieObtainResultCtrl"
}
}
GachaCtrl._mapEventConfig = {
GachaPoolDetail = "OnEvent_GachaPoolDetail",
GachaOpenPoolInfo = "OnBtnClick_GachaDetail",
GachaOpenProbInfo = "OnBtnClick_ProbDetail",
GachaNewbieSpin = "OnEvent_GachaNewbieSpin",
GachaNewbieRecord = "OnEvent_GachaNewbieRecord",
GachaNewbieObtainRecord = "OnEvent_GachaNewbieObtainRecord",
GachaNewbieSaveRecord = "OnEvent_GachaNewbieSaveRecord",
GachaNewbieReplaceRecord = "OnEvent_GachaNewbieReplaceRecord",
GachaNewbieReplaceRecordOver = "OnEvent_GachaNewbieReplaceRecordOver",
GachaNewbieObtainRecordOver = "OnEvent_GachaNewbieObtainRecordOver",
GachaProcessStart = "OnEvent_GachaProcessStart",
OnBtnClickGachaCoverEntranceGo = "OnEvent_GachaCoverEntranceGo",
[EventId.UIHomeConfirm] = "OnEvent_Home",
[EventId.UIBackConfirm] = "OnEvent_Back"
}
function GachaCtrl:Awake()
self.bGachaProcess = false
end
function GachaCtrl:FadeIn()
end
function GachaCtrl:FadeOut()
end
function GachaCtrl:OnEnable()
self._mapMaxAcquireReward = {}
local forEachAcquireReward = function(mapData)
if self._mapMaxAcquireReward[mapData.itemStype] == nil then
self._mapMaxAcquireReward[mapData.itemStype] = {}
end
if self._mapMaxAcquireReward[mapData.itemStype][mapData.itemRarity] == nil then
self._mapMaxAcquireReward[mapData.itemStype][mapData.itemRarity] = mapData.AcquireTimes
end
if mapData.AcquireTimes > self._mapMaxAcquireReward[mapData.itemStype][mapData.itemRarity] then
self._mapMaxAcquireReward[mapData.itemStype][mapData.itemRarity] = mapData.AcquireTimes
end
end
ForEachTableLine(DataTable.AcquireReward, forEachAcquireReward)
self.nTopBarId = self._mapNode.TopBar.gameObject:GetInstanceID()
self.curPoolId = 0
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.curPoolId = tbParam[1]
end
local bOpen = true
if self._panel.nCurPool ~= nil and self._panel.nCurPool ~= 0 then
self.curPoolId = self._panel.nCurPool
self._panel.nCurPool = 0
bOpen = false
end
self.mapCover = {}
local callback = function()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:RefreshAll(bOpen)
end
cs_coroutine.start(wait)
EventManager.Hit("Guide_GachaOpen")
end
self._mapNode.TMP_GachaTimes.gameObject:SetActive(false)
local newbie_callback = function()
PlayerData.Gacha:GetGachaInfomation(callback)
end
PlayerData.Gacha:GetGachaNewbieInfomation(newbie_callback)
self._mapNode.GachaNewBieShowRecord.gameObject:SetActive(false)
self._mapNode.GachaNewBieShowResult.gameObject:SetActive(false)
self._mapNode.GachaNewBieSaveRecord.gameObject:SetActive(false)
self._mapNode.GachaNewBieReplaceResult.gameObject:SetActive(false)
self._mapNode.GachaNewBieObtainResult.gameObject:SetActive(false)
end
function GachaCtrl:OnDisable()
for _, mapCtrl in pairs(self.mapCover) do
self:UnbindCtrlByNode(mapCtrl)
end
self._panel.nCurPool = self.curPoolId
self.mapCover = nil
self.mapTab = nil
delChildren(self._mapNode.coverRoot)
delChildren(self._mapNode.PoolContent)
CS.WwiseAudioManager.Instance:PostEvent("ui_recuit_cover_all_stop")
end
function GachaCtrl:OnDestroy()
end
function GachaCtrl:OnRelease()
end
function GachaCtrl:RefreshAll(bOpen)
self.tbOpenedPool = PlayerData.Gacha:GetOpenedPool()
self:LoadCover()
self:RefreshTab()
if type(self.curPoolId) ~= "number" or self.curPoolId <= 0 or table.indexof(self.tbOpenedPool, self.curPoolId) < 1 then
self.curPoolId = self.tbOpenedPool[1]
end
self:SetTabSelect(self.curPoolId, true)
self:RefreshInfo()
EventManager.Hit(EventId.SetTransition)
local wait = function()
if self.mapCover[self.curPoolId] ~= nil then
self.mapCover[self.curPoolId].gameObject:SetActive(true)
local gachaData = ConfigTable.GetData("Gacha", self.curPoolId)
if gachaData ~= nil then
CS.WwiseAudioManager.Instance:PostEvent(gachaData.Voice)
end
end
self._mapNode.rootAnim:Play("GachaPanel_in")
if self.mapCover[self.curPoolId] then
self.mapCover[self.curPoolId]:PlayInAnim()
self.mapCover[self.curPoolId]:EnableCover()
end
end
if bOpen == true then
self:AddTimer(1, 0.3, wait, true, true, true)
else
wait()
end
end
function GachaCtrl:RefreshTab()
self.mapTab = {}
delChildren(self._mapNode.PoolContent)
if #self.tbOpenedPool < 1 then
printError("没有开启的卡池")
return
end
local comp = function(a, b)
local mapGachaA = ConfigTable.GetData("Gacha", a)
local mapGachaB = ConfigTable.GetData("Gacha", b)
return mapGachaA.Sort < mapGachaB.Sort
end
table.sort(self.tbOpenedPool, comp)
for _, nGachaId in ipairs(self.tbOpenedPool) do
local mapGacha = ConfigTable.GetData("Gacha", nGachaId)
local goTab = instantiate(self._mapNode.PoolTabTemplete, self._mapNode.PoolContent)
goTab.transform.localScale = Vector3.one
self.mapTab[nGachaId] = goTab
local compBtn = goTab:GetComponent("UIButton")
local func_Handler = ui_handler(self, self.OnBtnClick_Tab, compBtn, nGachaId)
compBtn.onClick:AddListener(func_Handler)
local imgIconTab = goTab.transform:Find("AnimRoot/imgTab"):GetComponent("Image")
self:SetPngSprite(imgIconTab, mapGacha.Icon)
goTab.transform:Find("AnimRoot/imgChoose").gameObject:SetActive(false)
end
end
function GachaCtrl:RefreshInfo()
if self.curPoolId == nil or self.curPoolId == 0 then
return
end
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha == nil then
return
end
self.isNewBie = mapGacha.StorageId == GameEnum.gachaStorageType.BeginnerCardPool
self._mapNode.btn_NewBieJump.gameObject:SetActive(self.isNewBie)
self._mapNode.btn_NewBieJumpRecord.gameObject:SetActive(self.isNewBie)
self._mapNode.btn_GachaOne.gameObject:SetActive(not self.isNewBie)
self._mapNode.btn_GachaTen.gameObject:SetActive(not self.isNewBie)
self._mapNode.btn_poolHistory.gameObject:SetActive(not self.isNewBie)
self._mapNode.btn_shop.gameObject:SetActive(not self.isNewBie)
if self.isNewBie then
local newbie = ConfigTable.GetData("GachaNewbie", self.curPoolId)
local newbieData = PlayerData.Gacha:GetGachaNewbieData(self.curPoolId)
local c = 0
if newbieData ~= nil then
c = #newbieData.Cards
end
if newbie ~= nil then
NovaAPI.SetTMPText(self._mapNode.txt_NewBieCount, tostring(c) .. "/" .. tostring(newbie.SaveCount))
end
end
self:RefreshCoin(mapGacha)
self:RefreshCover()
self._mapNode.GachaInfo:Refresh(self.curPoolId)
self._mapNode.GachaProb:Refresh(self.curPoolId)
end
function GachaCtrl:RefreshCoin(mapGacha)
if mapGacha == nil then
return
end
local mapGachaStorage = ConfigTable.GetData("GachaStorage", mapGacha.StorageId)
if mapGachaStorage == nil then
return
end
if self.isNewBie then
return
end
local rapidjson = require("rapidjson")
if type(mapGachaStorage.OncePreferred) == "string" then
local tbOne = rapidjson.decode(mapGachaStorage.OncePreferred)
if tbOne ~= nil then
mapGachaStorage.OncePreferred = tbOne
else
mapGachaStorage.OncePreferred = {}
printError("单抽消耗配置错误:" .. self.curPoolId)
return
end
end
if type(mapGachaStorage.TenTimesPreferred) == "string" then
local tbTen = rapidjson.decode(mapGachaStorage.TenTimesPreferred)
if tbTen ~= nil then
mapGachaStorage.TenTimesPreferred = tbTen
else
mapGachaStorage.TenTimesPreferred = {}
printError("十连消耗配置错误:" .. self.curPoolId)
return
end
end
local bShowSpecialOne = false
if mapGacha.SpecificTid > 0 then
local nCurCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
if nCurCount >= mapGacha.SpecificQty then
bShowSpecialOne = true
end
end
if bShowSpecialOne then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaOneCost, mapGacha.SpecificQty)
local mapItemCfgData = ConfigTable.GetData_Item(mapGacha.SpecificTid)
if mapItemCfgData ~= nil then
self:SetPngSprite(self._mapNode.imgItemOne, mapItemCfgData.Icon2)
end
NovaAPI.SetImageNativeSize(self._mapNode.imgItemOne)
elseif #mapGachaStorage.OncePreferred > 0 then
for nIdx, mapCost in ipairs(mapGachaStorage.OncePreferred) do
local f = pairs(mapCost)
local sTid, nCount = f(mapCost)
local nTid = tonumber(sTid)
local nCurCount = PlayerData.Item:GetItemCountByID(nTid)
if nCount <= nCurCount then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaOneCost, nCount)
local mapItemCfgData = ConfigTable.GetData_Item(nTid)
self:SetPngSprite(self._mapNode.imgItemOne, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemOne)
break
end
if nIdx == #mapGachaStorage.OncePreferred then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaOneCost, mapGachaStorage.DefaultQty)
local mapItemCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
self:SetPngSprite(self._mapNode.imgItemOne, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemOne)
end
end
else
NovaAPI.SetTMPText(self._mapNode.TMP_gachaOneCost, mapGachaStorage.DefaultQty)
local mapItemCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
if mapItemCfgData ~= nil then
self:SetPngSprite(self._mapNode.imgItemOne, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemOne)
end
end
local bShowSpecialTen = false
if mapGacha.SpecificTid > 0 then
local nCurCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
if nCurCount >= 10 * mapGacha.SpecificQty then
bShowSpecialTen = true
end
end
if bShowSpecialTen then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaTenCost, 10 * mapGacha.SpecificQty)
local mapItemCfgData = ConfigTable.GetData_Item(mapGacha.SpecificTid)
if mapItemCfgData ~= nil then
self:SetPngSprite(self._mapNode.imgItemTen, mapItemCfgData.Icon2)
end
NovaAPI.SetImageNativeSize(self._mapNode.imgItemTen)
elseif #mapGachaStorage.TenTimesPreferred > 0 then
for nIdx, mapCost in ipairs(mapGachaStorage.TenTimesPreferred) do
local f = pairs(mapCost)
local sTid, nCount = f(mapCost)
local nTid = tonumber(sTid)
local nCurCount = PlayerData.Item:GetItemCountByID(nTid)
if nCount <= nCurCount then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaTenCost, nCount)
local mapItemCfgData = ConfigTable.GetData_Item(nTid)
self:SetPngSprite(self._mapNode.imgItemTen, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemTen)
break
end
if nIdx == #mapGachaStorage.TenTimesPreferred then
NovaAPI.SetTMPText(self._mapNode.TMP_gachaTenCost, mapGachaStorage.DefaultQty * 10)
local mapItemCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
self:SetPngSprite(self._mapNode.imgItemTen, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemTen)
end
end
else
NovaAPI.SetTMPText(self._mapNode.TMP_gachaTenCost, mapGachaStorage.DefaultQty * 10)
local mapItemCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
self:SetPngSprite(self._mapNode.imgItemTen, mapItemCfgData.Icon2)
NovaAPI.SetImageNativeSize(self._mapNode.imgItemTen)
end
end
function GachaCtrl:RefreshCover()
for nPoolId, mapCoverCtrl in pairs(self.mapCover) do
mapCoverCtrl:SetCover(nPoolId)
end
end
function GachaCtrl:LoadCover()
self.mapCover = {}
for _, nPoolId in ipairs(self.tbOpenedPool) do
local mapGacha = ConfigTable.GetData("Gacha", nPoolId)
if mapGacha ~= nil then
print(string.format("UI_GachaCover/%s/%s.prefab", mapGacha.Image, mapGacha.Image))
local coverPrefab = self:LoadAsset(string.format("UI_GachaCover/%s/%s.prefab", mapGacha.Image, mapGacha.Image))
local goCover = instantiate(coverPrefab, self._mapNode.coverRoot)
goCover:SetActive(false)
local sScript = "Game.UI.GachaEx.GachaCoverCtrl"
if coverScript[mapGacha.StorageId] ~= nil then
sScript = coverScript[mapGacha.StorageId]
end
local goCtrl = self:BindCtrlByNode(goCover, sScript)
self.mapCover[nPoolId] = goCtrl
self.mapCover[nPoolId]:SetCover(nPoolId)
end
end
end
function GachaCtrl:SetTabSelect(nGachaId, bSelect)
if nGachaId == nil then
return
end
local gachaData = ConfigTable.GetData("Gacha", nGachaId)
local mapStorage = ConfigTable.GetData("GachaType", gachaData.GachaType)
if bSelect then
local tbCoin = clone(mapStorage.CoinItem)
if gachaData.SpecificTid > 0 then
table.insert(tbCoin, gachaData.SpecificTid)
end
self._mapNode.TopBar:CreateCoin(tbCoin)
self.tbCurTabCoin = tbCoin
end
local go = self.mapTab[nGachaId]
if go ~= nil then
go.transform:Find("AnimRoot/imgChoose").gameObject:SetActive(bSelect)
end
self._mapNode.btn_NewBieJump.gameObject:SetActive(gachaData.StorageId == GameEnum.gachaStorageType.BeginnerCardPool)
self._mapNode.btn_shop.gameObject:SetActive(gachaData.StorageId == GameEnum.gachaStorageType.BeginnerCardPool)
end
function GachaCtrl:SetCoverOpen(nGachaId, bOpen)
if nGachaId == nil then
return
end
local go = self.mapCover[nGachaId].gameObject
if go ~= nil then
go:SetActive(bOpen)
if bOpen then
local gachaData = ConfigTable.GetData("Gacha", nGachaId)
if gachaData ~= nil then
CS.WwiseAudioManager.Instance:PostEvent(gachaData.Voice)
end
end
end
end
function GachaCtrl:GachaOneExchangeCoin(mapGacha)
local ConfirmPanel = function(sTip, confirmCallback, againKey)
if againKey ~= nil then
local TipsTime = LocalData.GetPlayerLocalData(againKey)
local _tipDay = 0
if TipsTime ~= nil then
_tipDay = tonumber(TipsTime)
end
local curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local fixedTimeStamp = curTimeStamp - newDayTime * 3600
local nYear = tonumber(os.date("!%Y", fixedTimeStamp))
local nMonth = tonumber(os.date("!%m", fixedTimeStamp))
local nDay = tonumber(os.date("!%d", fixedTimeStamp))
local nowD = nYear * 366 + nMonth * 31 + nDay
if nowD == _tipDay then
confirmCallback()
return
end
end
local isSelectAgain = false
local func_confirm = function()
if againKey ~= nil and isSelectAgain then
local _curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local _fixedTimeStamp = _curTimeStamp - newDayTime * 3600
local _nYear = tonumber(os.date("!%Y", _fixedTimeStamp))
local _nMonth = tonumber(os.date("!%m", _fixedTimeStamp))
local _nDay = tonumber(os.date("!%d", _fixedTimeStamp))
local _nowD = _nYear * 366 + _nMonth * 31 + _nDay
LocalData.SetPlayerLocalData(againKey, tostring(_nowD))
end
confirmCallback()
end
local againCallback = function(isSelect)
isSelectAgain = isSelect
end
local cancelCallback = function()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTip,
callbackConfirmAfterClose = func_confirm,
callbackCancel = cancelCallback,
callbackAgain = againKey ~= nil and againCallback or nil,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
local GachaCallback = function(mapData)
self:GetGachaItem(mapData, mapGacha.StorageId)
self:RefreshCoin(mapGacha)
end
local mapGachaStorage = ConfigTable.GetData("GachaStorage", mapGacha.StorageId)
if mapGachaStorage == nil then
return
end
local bSpecial = false
if mapGacha.SpecificTid > 0 then
local nCurCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
if nCurCount >= mapGacha.SpecificQty then
bSpecial = true
end
end
local nDefaultCount = PlayerData.Item:GetItemCountByID(mapGachaStorage.DefaultId)
if nDefaultCount >= mapGachaStorage.DefaultQty or bSpecial then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 1, GachaCallback)
elseif 0 < mapGachaStorage.CostId then
local nCostCount = PlayerData.Item:GetItemCountByID(mapGachaStorage.CostId)
local confirmCallback = function()
if nCostCount >= mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty - nDefaultCount) then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 1, GachaCallback)
elseif mapGachaStorage.CostId == AllEnum.CoinItemId.Jade then
local nNeedCount = mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty - nDefaultCount)
local nJadeCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.Jade)
nNeedCount = nNeedCount - nJadeCount
local mapCostCfgData = ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE)
local mapJadeCfgData = ConfigTable.GetData_Item(AllEnum.CoinItemId.Jade)
local sTips1 = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGemZero"), mapJadeCfgData.Id, nNeedCount, mapCostCfgData.Id)
local confirmCallbackStone = function()
local nCurStoneCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.STONE)
nCurStoneCount = nCurStoneCount + PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.FREESTONE)
if nCurStoneCount >= nNeedCount then
PlayerData.Coin:SendGemConvertReqReq(nNeedCount, nil)
else
local sTips2 = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", mapCostCfgData.Id)
local confirmCallbackExchange = function()
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Gem)
end
ConfirmPanel(sTips2, confirmCallbackExchange)
end
end
ConfirmPanel(sTips1, confirmCallbackStone)
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("NotEnoughItem"))
end
end
local nNeedCount = mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty - nDefaultCount)
local mapCostCfgData = ConfigTable.GetData_Item(mapGachaStorage.CostId)
local mapDefaultCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
local sTips
if 0 < nDefaultCount then
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGem"), nDefaultCount, mapDefaultCfgData.Id, nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty - nDefaultCount, mapDefaultCfgData.Id)
else
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_Exchange"), nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty - nDefaultCount, mapDefaultCfgData.Id)
end
ConfirmPanel(sTips, confirmCallback, "GachaShowTicketExchange")
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("NotEnoughItem"))
end
end
function GachaCtrl:GachaTenExchangeCoin(mapGacha)
local ConfirmPanel = function(sTip, confirmCallback, againKey)
if againKey ~= nil then
local TipsTime = LocalData.GetPlayerLocalData(againKey)
local _tipDay = 0
if TipsTime ~= nil then
_tipDay = tonumber(TipsTime)
end
local curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local fixedTimeStamp = curTimeStamp - newDayTime * 3600
local nYear = tonumber(os.date("!%Y", fixedTimeStamp))
local nMonth = tonumber(os.date("!%m", fixedTimeStamp))
local nDay = tonumber(os.date("!%d", fixedTimeStamp))
local nowD = nYear * 366 + nMonth * 31 + nDay
if nowD == _tipDay then
confirmCallback()
return
end
end
local isSelectAgain = false
local func_confirm = function()
if againKey ~= nil and isSelectAgain then
local _curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local _fixedTimeStamp = _curTimeStamp - newDayTime * 3600
local _nYear = tonumber(os.date("!%Y", _fixedTimeStamp))
local _nMonth = tonumber(os.date("!%m", _fixedTimeStamp))
local _nDay = tonumber(os.date("!%d", _fixedTimeStamp))
local _nowD = _nYear * 366 + _nMonth * 31 + _nDay
LocalData.SetPlayerLocalData(againKey, tostring(_nowD))
end
confirmCallback()
end
local againCallback = function(isSelect)
isSelectAgain = isSelect
end
local cancelCallback = function()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTip,
callbackConfirmAfterClose = func_confirm,
callbackCancel = cancelCallback,
callbackAgain = againKey ~= nil and againCallback or nil,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
local bGetFirstTenReward = PlayerData.Gacha:GetRecvFirstTenReward(self.curPoolId)
local GachaCallback = function(mapData)
self:GetGachaItem(mapData, mapGacha.StorageId, bGetFirstTenReward)
self:RefreshCoin(mapGacha)
end
local mapGachaStorage = ConfigTable.GetData("GachaStorage", mapGacha.StorageId)
if mapGachaStorage == nil then
return
end
local bSpecial = false
local nSpecificCount = 0
local nSpecificGachaCount = 0
local nDefaultCount = PlayerData.Item:GetItemCountByID(mapGachaStorage.DefaultId)
if 0 < mapGacha.SpecificTid then
nSpecificCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
if nSpecificCount >= 10 * mapGacha.SpecificQty then
bSpecial = true
else
nSpecificGachaCount = math.floor(nSpecificCount / mapGacha.SpecificQty)
local nDefaultGachaCount = math.floor(nDefaultCount / mapGachaStorage.DefaultQty)
if 10 <= nSpecificGachaCount + nDefaultGachaCount then
bSpecial = true
end
end
end
if nDefaultCount >= mapGachaStorage.DefaultQty * 10 or bSpecial then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 2, GachaCallback)
elseif 0 < mapGachaStorage.CostId then
local nCostCount = PlayerData.Item:GetItemCountByID(mapGachaStorage.CostId)
local confirmCallback = function()
if nCostCount >= mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount) then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 2, GachaCallback)
elseif mapGachaStorage.CostId == AllEnum.CoinItemId.Jade then
local nNeedCount = mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount)
local nJadeCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.Jade)
nNeedCount = nNeedCount - nJadeCount
local mapCostCfgData = ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE)
local mapJadeCfgData = ConfigTable.GetData_Item(AllEnum.CoinItemId.Jade)
local sTips1 = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGemZero"), mapJadeCfgData.Id, nNeedCount, mapCostCfgData.Id)
local confirmCallbackStone = function()
local nCurStoneCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.STONE)
nCurStoneCount = nCurStoneCount + PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.FREESTONE)
if nCurStoneCount >= nNeedCount then
PlayerData.Coin:SendGemConvertReqReq(nNeedCount, nil)
else
local sTips2 = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", mapCostCfgData.Id)
local confirmCallbackExchange = function()
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Gem)
end
ConfirmPanel(sTips2, confirmCallbackExchange)
end
end
ConfirmPanel(sTips1, confirmCallbackStone)
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("NotEnoughItem"))
end
end
local nNeedCount = mapGachaStorage.CostQty * (mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount)
local mapCostCfgData = ConfigTable.GetData_Item(mapGachaStorage.CostId)
local mapDefaultCfgData = ConfigTable.GetData_Item(mapGachaStorage.DefaultId)
local sTips
if 0 < nDefaultCount and 0 < nSpecificCount then
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGem2"), nDefaultCount, mapDefaultCfgData.Id, nSpecificCount, mapGacha.SpecificTid, nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount, mapDefaultCfgData.Id)
elseif 0 < nDefaultCount then
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGem"), nDefaultCount, mapDefaultCfgData.Id, nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount, mapDefaultCfgData.Id)
elseif 0 < nSpecificCount then
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGem"), nSpecificCount, mapGacha.SpecificTid, nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount, mapDefaultCfgData.Id)
else
sTips = orderedFormat(ConfigTable.GetUIText("Recruit_Exchange"), nNeedCount, mapCostCfgData.Id, mapGachaStorage.DefaultQty * (10 - nSpecificGachaCount) - nDefaultCount, mapDefaultCfgData.Id)
end
ConfirmPanel(sTips, confirmCallback, "GachaShowTicketExchange")
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("NotEnoughItem"))
end
end
function GachaCtrl:OnBtnClick_Tab(goBtn, nGachaId)
CS.WwiseAudioManager.Instance:PostEvent("ui_recuit_cover_all_stop")
if self.curPoolId == nGachaId then
return
end
self:SetTabSelect(self.curPoolId, false)
self:SetTabSelect(nGachaId, true)
self:SetCoverOpen(self.curPoolId, false)
self:SetCoverOpen(nGachaId, true)
self.curPoolId = nGachaId
self:RefreshInfo()
self.mapCover[self.curPoolId]:PlayInAnim()
end
function GachaCtrl:OnBtnClick_One()
if self.bGachaProcess then
return
end
CS.WwiseAudioManager.Instance:PostEvent("ui_recuit_cover_all_stop")
local GachaCallback = function(mapData)
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha == nil then
return
end
self:RefreshCoin(mapGacha)
self:GetGachaItem(mapData, mapGacha.StorageId)
end
if self.curPoolId == nil or self.curPoolId == 0 then
return
end
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha == nil then
return
end
local mapGachaStorage = ConfigTable.GetData("GachaStorage", mapGacha.StorageId)
if mapGachaStorage == nil then
return
end
local rapidjson = require("rapidjson")
if type(mapGachaStorage.OncePreferred) == "string" then
local tbOne = rapidjson.decode(mapGachaStorage.OncePreferred)
if tbOne ~= nil then
mapGachaStorage.OncePreferred = tbOne
else
mapGachaStorage.OncePreferred = {}
printError("单抽消耗配置错误:" .. self.curPoolId)
return
end
end
local bSpecialOne = false
if 0 < mapGacha.SpecificTid then
local nCurCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
if 0 < nCurCount then
bSpecialOne = true
end
end
if bSpecialOne then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 1, GachaCallback)
elseif 0 < #mapGachaStorage.OncePreferred then
for nIdx, mapCost in ipairs(mapGachaStorage.OncePreferred) do
local f = pairs(mapCost)
local sTid, nCount = f(mapCost)
local nTid = tonumber(sTid)
local nCurCount = PlayerData.Item:GetItemCountByID(nTid)
if nCount <= nCurCount then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 1, GachaCallback)
break
end
if nIdx == #mapGachaStorage.OncePreferred then
self:GachaOneExchangeCoin(mapGacha)
end
end
else
self:GachaOneExchangeCoin(mapGacha)
end
end
function GachaCtrl:OnBtnClick_Ten()
if self.bGachaProcess then
return
end
if self.curPoolId == nil or self.curPoolId == 0 then
return
end
local bGetFirstTenReward = PlayerData.Gacha:GetRecvFirstTenReward(self.curPoolId)
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha == nil then
return
end
CS.WwiseAudioManager.Instance:PostEvent("ui_recuit_cover_all_stop")
local GachaCallback = function(mapData)
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha == nil then
return
end
self:RefreshCoin(mapGacha)
self:GetGachaItem(mapData, mapGacha.StorageId, bGetFirstTenReward)
end
local mapGachaStorage = ConfigTable.GetData("GachaStorage", mapGacha.StorageId)
if mapGachaStorage == nil then
return
end
local rapidjson = require("rapidjson")
if type(mapGachaStorage.TenTimesPreferred) == "string" then
local tbTen = rapidjson.decode(mapGachaStorage.TenTimesPreferred)
if tbTen ~= nil then
mapGachaStorage.TenTimesPreferred = tbTen
else
mapGachaStorage.TenTimesPreferred = {}
printError("十连消耗配置错误:" .. self.curPoolId)
return
end
end
local nSpecialCount = 0
local nDefaultCurCount = PlayerData.Item:GetItemCountByID(mapGachaStorage.DefaultId)
local nDefaultGachaCount = math.floor(nDefaultCurCount / mapGachaStorage.DefaultQty)
if 0 < mapGacha.SpecificTid then
local nCurCount = PlayerData.Item:GetItemCountByID(mapGacha.SpecificTid)
nSpecialCount = math.floor(nCurCount / mapGacha.SpecificQty)
end
local specialGachaHint = function(Tid1, Tid2, nCount1, nCount2, againKey)
local confirmCallback = function()
PlayerData.Gacha:SendGachaReq(self.curPoolId, 2, GachaCallback)
end
if againKey ~= nil then
local TipsTime = LocalData.GetPlayerLocalData(againKey)
local _tipDay = 0
if TipsTime ~= nil then
_tipDay = tonumber(TipsTime)
end
local curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local fixedTimeStamp = curTimeStamp - newDayTime * 3600
local nYear = tonumber(os.date("!%Y", fixedTimeStamp))
local nMonth = tonumber(os.date("!%m", fixedTimeStamp))
local nDay = tonumber(os.date("!%d", fixedTimeStamp))
local nowD = nYear * 366 + nMonth * 31 + nDay
if nowD == _tipDay then
confirmCallback()
return
end
end
local isSelectAgain = false
local func_confirm = function()
if againKey ~= nil and isSelectAgain then
local _curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
local _fixedTimeStamp = _curTimeStamp - newDayTime * 3600
local _nYear = tonumber(os.date("!%Y", _fixedTimeStamp))
local _nMonth = tonumber(os.date("!%m", _fixedTimeStamp))
local _nDay = tonumber(os.date("!%d", _fixedTimeStamp))
local _nowD = _nYear * 366 + _nMonth * 31 + _nDay
LocalData.SetPlayerLocalData(againKey, tostring(_nowD))
end
confirmCallback()
end
local againCallback = function(isSelect)
isSelectAgain = isSelect
end
local cancelCallback = function()
end
local sTips = orderedFormat(ConfigTable.GetUIText("Recruit_ComboDrawTicket"), nCount1, Tid1, nCount2, Tid2)
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTips,
callbackConfirmAfterClose = func_confirm,
callbackCancel = cancelCallback,
callbackAgain = againKey ~= nil and againCallback or nil,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
if 10 <= nSpecialCount then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 2, GachaCallback)
elseif 0 < nSpecialCount and 10 <= nDefaultGachaCount + nSpecialCount then
specialGachaHint(mapGacha.SpecificTid, mapGachaStorage.DefaultId, nSpecialCount * mapGacha.SpecificQty, (10 - nSpecialCount) * mapGachaStorage.DefaultQty, "RecruitComboDrawTicketHint")
elseif #mapGachaStorage.TenTimesPreferred > 0 then
for nIdx, mapCost in ipairs(mapGachaStorage.TenTimesPreferred) do
local f = pairs(mapCost)
local sTid, nCount = f(mapCost)
local nTid = tonumber(sTid)
local nCurCount = PlayerData.Item:GetItemCountByID(nTid)
if nCount <= nCurCount then
PlayerData.Gacha:SendGachaReq(self.curPoolId, 2, GachaCallback)
break
end
if nIdx == #mapGachaStorage.TenTimesPreferred then
self:GachaTenExchangeCoin(mapGacha)
end
end
else
self:GachaTenExchangeCoin(mapGacha)
end
end
function GachaCtrl:OnBtnClick_GachaDetail()
self._mapNode.GachaProb.gameObject:SetActive(false)
self._mapNode.GachaInfo:OpenInfo()
end
function GachaCtrl:OnBtnClick_ProbDetail()
self._mapNode.GachaInfo.gameObject:SetActive(false)
self._mapNode.GachaProb:OpenInfo()
end
function GachaCtrl:OnBtnClick_GachaHistory()
local mapGacha = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGacha ~= nil then
local GetDataCallback = function(tbData)
self._mapNode.GachaHistory:OpenPanel(mapGacha.StorageId, self.curPoolId)
end
PlayerData.Gacha:GetGachaHistory(mapGacha.StorageId, GetDataCallback)
end
end
function GachaCtrl:OnBtnClick_shop()
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Shop)
end
function GachaCtrl:OnEvent_GachaPoolDetail(nIdx)
end
function GachaCtrl:GetGachaItem(mapData, nStorageId, bGetFirstTenReward)
local tbReward = {}
local mapRewardItem = {}
local rare = 3
local tbGiveItems = {}
local nStorage = 0
local mapGachaData = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGachaData ~= nil then
nStorage = mapGachaData.StorageId
local mapStorage = ConfigTable.GetData("GachaStorage", nStorage)
if mapStorage ~= nil then
local sGiveItem = mapStorage.GiveItems
local mapDecodeItems = decodeJson(sGiveItem)
for nTid, nCount in pairs(mapDecodeItems) do
table.insert(tbGiveItems, {
Tid = tonumber(nTid),
Qty = tonumber(nCount)
})
end
end
end
local mapChangeInfo = UTILS.DecodeChangeInfo(mapData.Change)
local tbAcquire = mapChangeInfo["proto.Acquire"]
if tbAcquire ~= nil then
tbAcquire = tbAcquire[1]
end
if tbAcquire == nil then
tbAcquire = {}
end
local GetRewardItem = function(nIdx, nTid)
local ret = {}
local nNumber = 0
for _, mapAcq in ipairs(tbAcquire.List) do
if mapAcq.Tid == nTid then
nNumber = mapAcq.Begin
end
end
for i = 1, nIdx do
if mapData.Cards[i].Card.Tid == nTid then
nNumber = nNumber + 1
end
end
local mapItemCfgData = ConfigTable.GetData_Item(nTid)
if mapItemCfgData == nil then
return ret
end
local nMaxCount = self._mapMaxAcquireReward[mapItemCfgData.Stype][mapItemCfgData.Rarity]
if nMaxCount == nil then
nMaxCount = 1
end
nNumber = math.min(nMaxCount, nNumber)
local nId = mapItemCfgData.Stype * 1000 + mapItemCfgData.Rarity * 100 + nNumber
local mapCfg = ConfigTable.GetData("AcquireReward", nId)
if not mapCfg or mapCfg.ItemNum == 0 then
return ret
end
table.insert(ret, {
Tid = mapCfg.ItemId,
Qty = mapCfg.ItemNum
})
return ret
end
for nIdx, v in ipairs(mapData.Cards) do
local tbAcReward = GetRewardItem(nIdx, v.Card.Tid)
for _, mapReward in ipairs(tbAcReward) do
table.insert(v.Rewards, mapReward)
end
table.insert(tbReward, {
id = v.Card.Tid,
count = v.Card.Qty,
rewardItem = v.Rewards,
bNew = v.Card.bNew,
exItem = tbGiveItems
})
local mapItem = ConfigTable.GetData_Item(v.Card.Tid)
if mapItem ~= nil then
if rare > mapItem.Rarity then
rare = mapItem.Rarity
end
if mapItem.Stype == GameEnum.itemStype.Char then
PlayerData.Talent:UpdateCharTalentRedDot(v.Card.Tid)
end
end
if v.Rewards ~= nil and #v.Rewards > 0 then
for _, mapItem in ipairs(v.Rewards) do
if mapRewardItem[mapItem.Tid] == nil then
mapRewardItem[mapItem.Tid] = 0
end
mapRewardItem[mapItem.Tid] = mapRewardItem[mapItem.Tid] + mapItem.Qty
end
end
end
local OnGachaDragOpenDoor = function()
WwiseManger.Instance:PostEvent("music_recruit_rarity_3s")
end
local function OnShowFinish()
EventManager.Remove("GaChaShowVideoEnd", self, OnShowFinish)
EventManager.Remove("GachaDragOpenDoor", self, OnGachaDragOpenDoor)
self.bGachaProcess = false
if nStorage == GameEnum.gachaStorageType.DiscCardPool or nStorage == GameEnum.gachaStorageType.DiscUpCardPool then
WwiseManger.Instance:SetState("recruit_rarity", "diskR")
else
WwiseManger.Instance:SetState("recruit_rarity", "R")
end
self:RefreshCover()
self._mapNode.GachaShow:ShowResults(tbReward, tbGiveItems)
PlayerData.SideBanner:TryOpenSideBanner()
end
local function OnShowItemEnd()
EventManager.Remove("GachaShowItemEnd", self, OnShowItemEnd)
if #mapData.Cards < 10 then
CS.WwiseAudioManager.Instance:SetState("recruit_rarity", "None")
PlayerData.Item:TryOpenFragmentsOverflow(function()
PlayerData.Phone:CheckNewChat()
end)
return
end
self._mapNode.GachaShowResult.gameObject:SetActive(true)
for _, mapItem in ipairs(tbGiveItems) do
mapItem.Qty = mapItem.Qty * #tbReward
if bGetFirstTenReward ~= nil and not bGetFirstTenReward and mapGachaData ~= nil then
local nTimes = mapGachaData.FirstTenShow == 0 and 1 or mapGachaData.FirstTenShow
mapItem.Qty = mapItem.Qty * nTimes
end
end
self._mapNode.GachaShowResult:ShowResult(tbReward, mapRewardItem, tbGiveItems)
end
EventManager.Add("GachaDragOpenDoor", self, OnGachaDragOpenDoor)
EventManager.Add("GaChaShowVideoEnd", self, OnShowFinish)
EventManager.Add("GachaShowItemEnd", self, OnShowItemEnd)
if not self:CheckGachaVideoRes() then
OnShowFinish()
else
WwiseManger.Instance:SetState("recruit_rarity", "transition")
if nStorage == GameEnum.gachaStorageType.DiscCardPool or nStorage == GameEnum.gachaStorageType.DiscUpCardPool then
local sup = math.random(0, 2) > 1
NovaAPI.PlayGachaDisc(self._mapNode.GachaOpenDoor, #mapData.Cards, rare, sup)
else
local sup = math.random(0, 100)
local nType = 3
if sup <= 5 then
nType = 0
elseif sup <= 10 then
nType = 2
elseif sup <= 55 then
nType = 1
else
nType = 3
end
NovaAPI.PlayGachaOpenDoor(self._mapNode.GachaOpenDoor, rare, nType)
end
end
end
function GachaCtrl:CheckGachaVideoRes()
local ProVideoManager = CS.ProVideoManager
local File = CS.System.IO.File
local path = ProVideoManager.GetVideoResourcePath("Gacha_001.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_002_loop.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_003.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_003_r.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_003_r_1.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_car_001.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("Gacha_car_001_r.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc_10_g.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc_10_r.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc_10_r_1.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc_g.mp4")
if not File.Exists(path) then
return false
end
path = ProVideoManager.GetVideoResourcePath("gacha_disc_r.mp4")
if not File.Exists(path) then
return false
end
return true
end
function GachaCtrl:OnEvent_GachaProcessStart(bStart)
self.bGachaProcess = bStart
end
function GachaCtrl:GetGachaNewbieItem(mapData)
local tbReward = {}
local rare = 3
local CheckNew = function(nTid)
local mapItemCfgData = ConfigTable.GetData_Item(nTid)
if mapItemCfgData == nil then
return false
end
if mapItemCfgData.Type == GameEnum.itemType.Char then
local mapChar = PlayerData.Char:GetCharDataByTid(nTid)
return mapChar == nil
elseif mapItemCfgData.Type == GameEnum.itemType.Disc then
local mapDisc = PlayerData.Disc:GetDiscById(nTid)
return mapDisc == nil
else
return false
end
end
local curItem = {}
for _, v in ipairs(mapData.Cards) do
local mapItem = ConfigTable.GetData_Item(v)
local bForceJump = mapItem == nil or mapItem.Rarity ~= GameEnum.itemRarity.SSR
table.insert(tbReward, {
id = v,
count = 1,
rewardItem = {},
bForceJump = bForceJump,
bNew = CheckNew(v) and 1 > table.indexof(curItem, v),
exItem = {}
})
local mapItem = ConfigTable.GetData_Item(v)
if mapItem ~= nil and rare > mapItem.Rarity then
rare = mapItem.Rarity
end
table.insert(curItem, v)
end
local OnGachaDragOpenDoor = function()
WwiseManger.Instance:PostEvent("music_recruit_rarity_3s")
end
local function OnShowFinish()
EventManager.Remove("GaChaShowVideoEnd", self, OnShowFinish)
EventManager.Remove("GachaDragOpenDoor", self, OnGachaDragOpenDoor)
self.bGachaProcess = false
self:RefreshCover()
self._mapNode.GachaShow:ShowResults(tbReward, {})
PlayerData.SideBanner:TryOpenSideBanner()
end
local function OnShowItemEnd()
EventManager.Remove("GachaShowItemEnd", self, OnShowItemEnd)
WwiseManger.Instance:SetState("recruit_rarity", "R")
if #mapData.Cards < 10 then
CS.WwiseAudioManager.Instance:SetState("recruit_rarity", "None")
PlayerData.Item:TryOpenFragmentsOverflow(function()
PlayerData.Phone:CheckNewChat()
end)
return
end
self._mapNode.GachaNewBieShowResult.gameObject:SetActive(true)
self._mapNode.GachaNewBieShowResult:ShowResult(tbReward, self.curPoolId)
end
EventManager.Add("GachaDragOpenDoor", self, OnGachaDragOpenDoor)
EventManager.Add("GaChaShowVideoEnd", self, OnShowFinish)
EventManager.Add("GachaShowItemEnd", self, OnShowItemEnd)
if not self:CheckGachaVideoRes() then
OnShowFinish()
else
WwiseManger.Instance:SetState("recruit_rarity", "transition")
local sup = math.random(0, 100)
local nType = 3
if sup <= 5 then
nType = 0
elseif sup <= 10 then
nType = 2
elseif sup <= 55 then
nType = 1
else
nType = 3
end
NovaAPI.PlayGachaOpenDoor(self._mapNode.GachaOpenDoor, rare, nType)
end
end
function GachaCtrl:OnEvent_GachaNewbieSpin()
self:OnBtnClick_NewBieJump()
end
function GachaCtrl:OnEvent_GachaNewbieRecord()
self:OnBtnClick_NewBieJumpRecord()
end
function GachaCtrl:OnEvent_GachaNewbieObtainRecord(idx, items)
self._mapNode.GachaNewBieObtainResult:SetItems(self.curPoolId, idx, items)
self._mapNode.GachaNewBieObtainResult.gameObject:SetActive(true)
end
function GachaCtrl:OnEvent_GachaNewbieSaveRecord()
local newbie = ConfigTable.GetData("GachaNewbie", self.curPoolId)
if newbie == nil then
return
end
local newbieData = PlayerData.Gacha:GetGachaNewbieData(self.curPoolId)
if newbieData == nil then
return
end
if #newbieData.Temp == 0 then
return
end
if #newbieData.Cards < newbie.SaveCount then
local GachaCallback = function(mapData)
self:RefreshInfo()
self._mapNode.GachaNewBieShowResult:RefreshInfo()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Gacha_NewBieSaveTip"))
end
PlayerData.Gacha:SendGachaNewbieSaveReq(self.curPoolId, 0, GachaCallback)
return
end
self._mapNode.GachaNewBieSaveRecord:SetItems(self.curPoolId)
self._mapNode.GachaNewBieSaveRecord.gameObject:SetActive(true)
end
function GachaCtrl:OnEvent_GachaNewbieReplaceRecord(idx)
self._mapNode.GachaNewBieReplaceResult:SetItems(self.curPoolId, idx)
self._mapNode.GachaNewBieReplaceResult.gameObject:SetActive(true)
end
function GachaCtrl:OnEvent_GachaNewbieReplaceRecordOver()
self:RefreshInfo()
self._mapNode.GachaNewBieShowResult:RefreshInfo()
self._mapNode.GachaNewBieReplaceResult.gameObject:SetActive(false)
self._mapNode.GachaNewBieSaveRecord.gameObject:SetActive(false)
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Gacha_NewBieSaveTip"))
end
function GachaCtrl:OnEvent_GachaNewbieObtainRecordOver(changes, items, tbNew)
local tbReward = {}
local mapRewardItem = {}
local rare = 3
local tbGiveItems = {}
if tbNew == nil then
tbNew = {}
end
local mapGachaData = ConfigTable.GetData("Gacha", self.curPoolId)
if mapGachaData ~= nil then
local nStorage = mapGachaData.StorageId
local mapStorage = ConfigTable.GetData("GachaStorage", nStorage)
if mapStorage ~= nil then
local sGiveItem = mapStorage.GiveItems
local mapDecodeItems = decodeJson(sGiveItem)
for nTid, nCount in pairs(mapDecodeItems) do
table.insert(tbGiveItems, {
Tid = tonumber(nTid),
Qty = tonumber(nCount)
})
end
end
end
local mapChangeInfo = UTILS.DecodeChangeInfo(changes)
local tbAcquire = mapChangeInfo["proto.Acquire"]
if tbAcquire ~= nil then
tbAcquire = tbAcquire[1]
end
if tbAcquire == nil then
tbAcquire = {}
end
local GetRewardItem = function(nIdx, nTid)
local ret = {}
local nNumber = 0
for _, mapAcq in ipairs(tbAcquire.List) do
if mapAcq.Tid == nTid then
nNumber = mapAcq.Begin
end
end
for i = 1, nIdx do
if items[i] == nTid then
nNumber = nNumber + 1
end
end
local mapItemCfgData = ConfigTable.GetData_Item(nTid)
if mapItemCfgData == nil then
return ret
end
local nMaxCount = self._mapMaxAcquireReward[mapItemCfgData.Stype][mapItemCfgData.Rarity]
if nMaxCount == nil then
nMaxCount = 1
end
nNumber = math.min(nMaxCount, nNumber)
local nId = mapItemCfgData.Stype * 1000 + mapItemCfgData.Rarity * 100 + nNumber
local mapCfg = ConfigTable.GetData("AcquireReward", nId)
if not mapCfg or mapCfg.ItemNum == 0 then
return ret
end
table.insert(ret, {
Tid = mapCfg.ItemId,
Qty = mapCfg.ItemNum
})
return ret
end
for nIdx, v in ipairs(items) do
local tbAcReward = GetRewardItem(nIdx, v)
local rewards = {}
for _, mapReward in ipairs(tbAcReward) do
table.insert(rewards, mapReward)
end
table.insert(tbReward, {
id = v,
count = 1,
rewardItem = rewards,
bNew = tbNew[nIdx] or false,
exItem = tbGiveItems
})
local mapItem = ConfigTable.GetData_Item(v)
if mapItem ~= nil and rare > mapItem.Rarity then
rare = mapItem.Rarity
end
if rewards ~= nil and 0 < #rewards then
for _, mapItem in ipairs(rewards) do
if mapRewardItem[mapItem.Tid] == nil then
mapRewardItem[mapItem.Tid] = 0
end
mapRewardItem[mapItem.Tid] = mapRewardItem[mapItem.Tid] + mapItem.Qty
end
end
end
local function OnShowItemEnd()
EventManager.Remove("GachaShowItemEnd", self, OnShowItemEnd)
if #items < 10 then
CS.WwiseAudioManager.Instance:SetState("recruit_rarity", "None")
PlayerData.Item:TryOpenFragmentsOverflow(function()
PlayerData.Phone:CheckNewChat()
end)
return
end
self._mapNode.GachaShowResult.gameObject:SetActive(true)
for _, mapItem in ipairs(tbGiveItems) do
mapItem.Qty = mapItem.Qty * #tbReward
end
self._mapNode.GachaShowResult:ShowResult(tbReward, mapRewardItem, tbGiveItems)
self:RefreshAll()
end
EventManager.Add("GachaShowItemEnd", self, OnShowItemEnd)
self._mapNode.GachaNewBieObtainResult.gameObject:SetActive(false)
self._mapNode.GachaNewBieShowRecord.gameObject:SetActive(false)
self._mapNode.GachaNewBieShowResult.gameObject:SetActive(false)
self:RefreshCover()
self._mapNode.GachaShow:ShowResults(tbReward, tbGiveItems)
PlayerData.SideBanner:TryOpenSideBanner()
end
function GachaCtrl:OnEvent_GachaCoverEntranceGo()
if self.bGachaProcess then
return
end
local gachaData = ConfigTable.GetData("Gacha", self.curPoolId)
if gachaData ~= nil then
local nTrailId = gachaData.TrailId
if 0 < nTrailId then
do
local callback = function()
local mapTrialCfgData = ConfigTable.GetData("TrialControl", gachaData.TrailId)
if mapTrialCfgData ~= nil then
local nIdx = table.indexof(mapTrialCfgData.Gachas, self.curPoolId)
if 0 < nIdx then
PlayerData.Trial:SetTrialAct(nTrailId)
PlayerData.Trial:SetSelectTrialGroup(mapTrialCfgData.GroupIds[nIdx])
EventManager.Hit(EventId.OpenPanel, PanelId.TrialLevelSelect)
end
end
end
PlayerData.Activity:SendActivityDetailMsg(callback)
end
end
end
end
function GachaCtrl:OnBtnClick_NewBieJump()
if self.bGachaProcess then
return
end
local GachaCallback = function(mapData)
self:GetGachaNewbieItem(mapData)
self:RefreshInfo()
self:RefreshCover()
self._mapNode.GachaNewBieShowResult:RefreshInfo()
end
local newbieData = PlayerData.Gacha:GetGachaNewbieData(self.curPoolId)
if newbieData == nil then
return
end
local newbie = ConfigTable.GetData("GachaNewbie", self.curPoolId)
if newbie == nil then
return
end
if newbieData.Times < newbie.SpinCount then
PlayerData.Gacha:SendGachaNewbieReq(self.curPoolId, GachaCallback)
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Gacha_NewBieSummonLimit"))
end
end
function GachaCtrl:OnBtnClick_NewBieJumpRecord()
local newbieData = PlayerData.Gacha:GetGachaNewbieData(self.curPoolId)
if newbieData ~= nil then
if #newbieData.Cards == 0 and #newbieData.Temp == 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Gacha_NewBieNoRecordTip"))
else
self._mapNode.GachaNewBieShowRecord:SetPoolId(self.curPoolId)
self._mapNode.GachaNewBieShowRecord.gameObject:SetActive(true)
end
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Gacha_NewBieNoRecordTip"))
end
end
function GachaCtrl:OnEvent_Back(nPanelId)
if self._panel._nPanelId ~= nPanelId or self.bGachaProcess then
return
end
EventManager.Hit(EventId.CloesCurPanel)
end
function GachaCtrl:OnEvent_Home(nPanelId)
if self._panel._nPanelId ~= nPanelId or self.bGachaProcess then
return
end
PanelManager.Home()
end
return GachaCtrl