Initial version - 1.2.0.60

EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
This commit is contained in:
SL1900
2025-12-03 01:00:00 +09:00
commit 5e0d58cfad
3595 changed files with 9373562 additions and 0 deletions
@@ -0,0 +1,476 @@
local FixedRoguelikeRewardGachaCtrl = class("FixedRoguelikeRewardGachaCtrl", BaseCtrl)
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResType = GameResourceLoader.ResType
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
FixedRoguelikeRewardGachaCtrl._mapNodeConfig = {
uieffectBg = {sComponentName = "GameObject"},
goGacha = {sComponentName = "GameObject"},
btnClose = {
sComponentName = "Button",
callback = "OnBtnClick_Close"
},
rtContent = {
sComponentName = "RectTransform"
},
ItemRoot = {
sComponentName = "RectTransform"
}
}
FixedRoguelikeRewardGachaCtrl._mapEventConfig = {}
local HULF_PAGE = 6
local FULL_PAGE = 12
local FALLIN_TIME = 0.03
local LINE_SPACE_TIME = 0.1
local OPEN_R_TIME = 0.2
local OPEN_SSR_TIME = 1
local FALLIN_ALL_TIME = 0.5
local RewardGachaIconType = {
A = "a",
B = "b",
C = "c",
D = "d"
}
function FixedRoguelikeRewardGachaCtrl:ProcessResult(mapResult)
local tbRarityItem = self:ReallocateRarity(mapResult.tbItem)
local tbRarityPresents = self:ReallocateRarity(mapResult.tbPresents)
local tbRarityOutfit = self:ReallocateRarity(mapResult.tbOutfit)
local tbRarityGacha = mapResult.tbRarityCount
local tbAllRarity = {}
for nRarity, _ in pairs(tbRarityGacha) do
table.insert(tbAllRarity, nRarity)
end
table.sort(tbAllRarity, function(a, b)
return a < b
end)
local nAllRarity = #tbAllRarity
for j = 1, nAllRarity - 1 do
local nRarity = tbAllRarity[j]
local nItem = 0
for _, mapItem in pairs(tbRarityItem[nRarity]) do
nItem = nItem + mapItem.nCount
end
local nPresents = #tbRarityPresents[nRarity]
local nOutfit = #tbRarityOutfit[nRarity]
local nNeed = tbRarityGacha[nRarity] - nItem - nPresents - nOutfit
nNeed = 0 < nNeed and nNeed or 0
if tbRarityItem[nRarity + 1] and #tbRarityItem[nRarity + 1] > 0 and 0 < nNeed then
local nCount = #tbRarityItem[nRarity + 1]
for i = nCount, 1, -1 do
if nNeed <= 0 then
break
end
local mapItem = tbRarityItem[nRarity + 1][i]
if nNeed < mapItem.nCount then
table.insert(tbRarityItem[nRarity], {
nTid = mapItem.nTid,
nCount = nNeed
})
mapItem.nCount = mapItem.nCount - nNeed
nNeed = 0
else
table.insert(tbRarityItem[nRarity], mapItem)
table.remove(tbRarityItem[nRarity + 1], i)
nNeed = nNeed - mapItem.nCount
end
end
end
if tbRarityPresents[nRarity + 1] and #tbRarityPresents[nRarity + 1] > 0 and 0 < nNeed then
local nCount = #tbRarityPresents[nRarity + 1]
for i = nCount, 1, -1 do
if nNeed <= 0 then
break
end
local mapItem = tbRarityPresents[nRarity + 1][i]
table.insert(tbRarityPresents[nRarity], mapItem)
table.remove(tbRarityPresents[nRarity + 1], i)
nNeed = nNeed - 1
end
end
if tbRarityOutfit[nRarity + 1] and #tbRarityOutfit[nRarity + 1] > 0 and 0 < nNeed then
local nCount = #tbRarityOutfit[nRarity + 1]
for i = nCount, 1, -1 do
if nNeed <= 0 then
break
end
local mapItem = tbRarityOutfit[nRarity + 1][i]
table.insert(tbRarityOutfit[nRarity], mapItem)
table.remove(tbRarityOutfit[nRarity + 1], i)
nNeed = nNeed - 1
end
end
end
local tbRarityReward = {}
local tbPresentsToNext = {}
local tbOutfitToNext = {}
local tbItemToNext = {}
for i = 5, 1, -1 do
local nRarity = i
if not tbRarityGacha[nRarity] then
local add_next = function(tbItem, tbNext)
if not tbItem then
return
end
for _, mapItem in pairs(tbItem) do
table.insert(tbNext, mapItem)
end
end
add_next(tbRarityPresents[nRarity], tbPresentsToNext)
add_next(tbRarityOutfit[nRarity], tbOutfitToNext)
add_next(tbRarityItem[nRarity], tbItemToNext)
else
tbRarityReward[nRarity] = {}
do
local nItem = #tbRarityItem[nRarity]
local nPresents = #tbRarityPresents[nRarity]
local nOutfit = #tbRarityOutfit[nRarity]
local nHas = nItem + nPresents + nOutfit + #tbPresentsToNext + #tbOutfitToNext + #tbItemToNext
local bFull = nHas >= tbRarityGacha[nRarity]
local add_previous = function(tbNext)
for _, mapItem in pairs(tbNext) do
table.insert(tbRarityReward[nRarity], mapItem)
tbRarityGacha[nRarity] = tbRarityGacha[nRarity] - 1
end
end
add_previous(tbPresentsToNext)
tbPresentsToNext = {}
add_previous(tbOutfitToNext)
tbOutfitToNext = {}
if bFull then
add_previous(tbItemToNext)
else
for _, mapItem in pairs(tbItemToNext) do
table.insert(tbRarityItem[nRarity], mapItem)
end
end
tbItemToNext = {}
local bClear = false
local add_cur = function(tbItem, tbNext)
for _, mapItem in pairs(tbItem) do
if 0 < tbRarityGacha[nRarity] then
table.insert(tbRarityReward[nRarity], mapItem)
tbRarityGacha[nRarity] = tbRarityGacha[nRarity] - 1
else
bClear = true
end
if bClear then
table.insert(tbNext, mapItem)
end
end
end
add_cur(tbRarityPresents[nRarity], tbPresentsToNext)
add_cur(tbRarityOutfit[nRarity], tbOutfitToNext)
if bFull then
add_cur(tbRarityItem[nRarity], tbItemToNext)
else
do
local tbAfter = self:ReallocateGacha(tbRarityItem[nRarity], tbRarityGacha[nRarity])
for _, mapItem in pairs(tbAfter) do
table.insert(tbRarityReward[nRarity], mapItem)
end
end
end
end
end
end
local tbReward = {}
for _, nRarity in pairs(tbAllRarity) do
local tbRandom = self:RandomTable(tbRarityReward[nRarity])
for _, mapItem in ipairs(tbRandom) do
table.insert(tbReward, {
nTid = mapItem.nTid,
nCount = mapItem.nCount,
nRarity = nRarity
})
end
end
return tbReward
end
function FixedRoguelikeRewardGachaCtrl:ReallocateRarity(tbItem)
local tbRarity = {}
for i = 1, 5 do
if not tbRarity[i] then
tbRarity[i] = {}
end
end
for _, mapItem in pairs(tbItem) do
local mapCfg = ConfigTable.GetData_Item(mapItem.nTid)
local nRarity = mapCfg.Rarity
table.insert(tbRarity[nRarity], mapItem)
end
return tbRarity
end
function FixedRoguelikeRewardGachaCtrl:ReallocateGacha(tbItem, nAllGachaCount)
if nAllGachaCount == nil or nAllGachaCount == 0 then
return {}
end
for _, mapItem in ipairs(tbItem) do
mapItem.nRarity = ConfigTable.GetData_Item(mapItem.nTid).Rarity
end
local comp = function(a, b)
if a.nRarity ~= b.nRarity then
return a.nRarity < b.nRarity
else
return a.nTid > b.nTid
end
end
table.sort(tbItem, comp)
local tbAllocation = {}
local nTypeCount = #tbItem
local nRemainGacha = nAllGachaCount - nTypeCount
for i = 1, nTypeCount do
if not tbAllocation[i] then
tbAllocation[i] = 0
end
end
local bFail = false
local nFailTimes = 0
while 0 < nRemainGacha do
if nFailTimes == 2 then
nRemainGacha = 0
printError("掉落扭蛋分配错误")
end
if bFail then
nFailTimes = nFailTimes + 1
end
bFail = true
for i = 1, nTypeCount do
if tbItem[i].nCount > tbAllocation[i] + 1 and 0 < nRemainGacha then
tbAllocation[i] = tbAllocation[i] + 1
nRemainGacha = nRemainGacha - 1
bFail = false
end
end
end
local tbAfter = {}
for i = 1, nTypeCount do
local nItemCount = tbItem[i].nCount
local tbItemCount = {nItemCount}
for _ = 1, tbAllocation[i] do
table.sort(tbItemCount, function(a, b)
return b < a
end)
local nMax = tbItemCount[1]
local nAllocation = math.random(math.ceil(nMax / 4), math.floor(nMax / 2))
tbItemCount[1] = nMax - nAllocation
table.insert(tbItemCount, nAllocation)
end
for _, value in pairs(tbItemCount) do
table.insert(tbAfter, {
nTid = tbItem[i].nTid,
nCount = value
})
end
end
return tbAfter
end
function FixedRoguelikeRewardGachaCtrl:RandomTable(tb)
local tbRandom = {}
local nCount = #tb
while 0 < nCount do
local nRandomIndex = math.random(1, nCount)
local mapItem = tb[nRandomIndex]
table.insert(tbRandom, mapItem)
table.remove(tb, nRandomIndex)
nCount = nCount - 1
end
return tbRandom
end
function FixedRoguelikeRewardGachaCtrl:ProcessListData(tbReward)
self.tbRewardList = {}
local nAllRewardCount = #tbReward
local nFullListCount = math.floor(nAllRewardCount / FULL_PAGE)
for _ = 1, nFullListCount do
local tbSubReward = {}
for _ = 1, FULL_PAGE do
table.insert(tbSubReward, tbReward[1])
table.remove(tbReward, 1)
end
table.insert(self.tbRewardList, tbSubReward)
end
table.insert(self.tbRewardList, tbReward)
end
function FixedRoguelikeRewardGachaCtrl:RefreshListItem(tbReward, bHulfPage)
local bHasItem = true
if self.tbGoItem == nil then
self.tbGoItem = {}
bHasItem = false
end
for key, v in ipairs(tbReward) do
local nItemId = v.nTid
local cfgDataItem = ConfigTable.GetData_Item(nItemId)
local goItem
if bHasItem then
goItem = self.tbGoItem[key].go
elseif bHulfPage then
goItem = instantiate(self._mapNode.goGacha, self._mapNode.ItemRoot)
else
goItem = instantiate(self._mapNode.goGacha, self._mapNode.rtContent)
end
local tr = goItem.transform
local imgFrame = tr:Find("goIcon/imgFrame"):GetComponent("Image")
local imgIcon = tr:Find("goIcon/imgFrame/imgIcon"):GetComponent("Image")
local imgFull = tr:Find("imgFull"):GetComponent("Image")
local imgSplitB = tr:Find("goSplit/imgSplitB"):GetComponent("Image")
local imgSplitC = tr:Find("goSplit/imgSplitB/imgSplitC"):GetComponent("Image")
local imgSplitD = tr:Find("goSplit/imgSplitD"):GetComponent("Image")
local txtCount = tr:Find("goIcon/imgFrame/ItemCount"):GetComponent("TMP_Text")
self:SetAtlasSprite(imgFrame, "12_rare", AllEnum.FrameType_New.Item .. AllEnum.FrameColor_New[cfgDataItem.Rarity], true)
if cfgDataItem.Type == GameEnum.itemType.Outfit or cfgDataItem.Type == GameEnum.itemType.Disc then
self:SetPngSprite(imgIcon, cfgDataItem.Icon .. AllEnum.OutfitIconSurfix.Item)
else
self:SetPngSprite(imgIcon, cfgDataItem.Icon)
end
self:SetPngSprite(imgFull, "UI/big_sprites/" .. string.format(AllEnum.RewardGachaType[v.nRarity], RewardGachaIconType.A))
self:SetPngSprite(imgSplitB, "UI/big_sprites/" .. string.format(AllEnum.RewardGachaType[v.nRarity], RewardGachaIconType.B))
self:SetPngSprite(imgSplitC, "UI/big_sprites/" .. string.format(AllEnum.RewardGachaType[v.nRarity], RewardGachaIconType.C))
self:SetPngSprite(imgSplitD, "UI/big_sprites/" .. string.format(AllEnum.RewardGachaType[v.nRarity], RewardGachaIconType.D))
NovaAPI.SetTMPText(txtCount, v.nCount > 1 and "×" .. v.nCount or "")
if not bHasItem then
table.insert(self.tbGoItem, {
go = goItem,
bSSR = cfgDataItem.Rarity == GameEnum.itemRarity.SSR
})
else
self.tbGoItem[key].bSSR = cfgDataItem.Rarity == GameEnum.itemRarity.SSR
end
NovaAPI.SetCanvasGroupAlpha(tr:GetComponent("CanvasGroup"), 0)
goItem:SetActive(true)
end
end
function FixedRoguelikeRewardGachaCtrl:PlayListAni(nPageCount, bLast, bOnePage, callback)
local nLine = math.ceil(nPageCount / HULF_PAGE)
local nLastLine = math.fmod(nPageCount, HULF_PAGE)
if nLastLine == 0 then
nLastLine = HULF_PAGE
end
self.sequence = DOTween.Sequence()
if nLine == 1 then
local nTime = 0
if bOnePage then
nTime = FALLIN_ALL_TIME / nLastLine
else
nTime = FALLIN_TIME
end
for i = 1, nLastLine do
self.sequence:AppendCallback(function()
NovaAPI.SetCanvasGroupAlpha(self.tbGoItem[i].go.transform:GetComponent("CanvasGroup"), 1)
self.tbGoItem[i].go:GetComponent("Animator"):Play("gacha_fall_in")
if i == 1 then
if nLastLine == 1 then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_fall_1")
elseif nLastLine == 2 then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_fall_2")
elseif 2 < nLastLine and nLastLine <= 6 then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_fall_3")
end
end
end)
self.sequence:AppendInterval(nTime)
end
elseif nLine == 2 then
local nTime = 0
if bOnePage then
nTime = FALLIN_ALL_TIME / nPageCount
else
nTime = FALLIN_TIME
end
for i = 1, HULF_PAGE do
self.sequence:AppendCallback(function()
NovaAPI.SetCanvasGroupAlpha(self.tbGoItem[i].go.transform:GetComponent("CanvasGroup"), 1)
self.tbGoItem[i].go:GetComponent("Animator"):Play("gacha_fall_in")
if i == 1 then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_fall_4")
end
end)
self.sequence:AppendInterval(nTime)
end
self.sequence:AppendInterval(LINE_SPACE_TIME)
for i = HULF_PAGE + 1, HULF_PAGE + nLastLine do
self.sequence:AppendCallback(function()
NovaAPI.SetCanvasGroupAlpha(self.tbGoItem[i].go.transform:GetComponent("CanvasGroup"), 1)
self.tbGoItem[i].go:GetComponent("Animator"):Play("gacha_fall_in")
end)
self.sequence:AppendInterval(nTime)
end
end
for i = 1, nPageCount do
self.sequence:AppendCallback(function()
if self.tbGoItem[i].bSSR then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_specialOpen")
else
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_commonOpen")
end
end)
self.sequence:AppendInterval(0.05)
self.sequence:AppendCallback(function()
if self.tbGoItem[i].bSSR then
self.tbGoItem[i].go:GetComponent("Animator"):Play("gacha_open_ssr")
else
self.tbGoItem[i].go:GetComponent("Animator"):Play("gacha_open_r")
end
end)
self.sequence:AppendInterval(self.tbGoItem[i].bSSR and OPEN_SSR_TIME or OPEN_R_TIME)
end
self.sequence:AppendInterval(bLast and 1 or 0.5)
self.sequence:Append(self._mapNode.rtContent:DOAnchorPos(Vector2(0, 1000), 0.3))
for i = 1, nPageCount do
self.sequence:AppendCallback(function()
NovaAPI.SetCanvasGroupAlpha(self.tbGoItem[i].go.transform:GetComponent("CanvasGroup"), 0)
end)
end
function self.sequence.onComplete()
callback()
end
self.sequence:SetUpdate(true)
end
function FixedRoguelikeRewardGachaCtrl:ShowReward(mapResult)
local tbReward = self:ProcessResult(clone(mapResult))
if #tbReward == 0 then
self:OnBtnClick_Close(nil, false)
return
end
local nListCount = math.ceil(#tbReward / FULL_PAGE)
self:ProcessListData(tbReward)
self.gameObject:SetActive(true)
self:ShowList(nListCount)
end
function FixedRoguelikeRewardGachaCtrl:ShowList(nListCount)
local nShowOrder = 0
local function func_ShowList()
nShowOrder = nShowOrder + 1
if nShowOrder > nListCount then
self:OnBtnClick_Close(nil, false)
return
end
local bHulfPage = nListCount == 1 and #self.tbRewardList[1] <= HULF_PAGE
local bOnePage = nListCount == 1
self:RefreshListItem(self.tbRewardList[nShowOrder], bHulfPage)
self:PlayListAni(#self.tbRewardList[nShowOrder], nShowOrder == nListCount, bOnePage, func_ShowList)
end
func_ShowList()
end
function FixedRoguelikeRewardGachaCtrl:Awake()
self.gameObject:SetActive(false)
self.tbGoItem = nil
self.tbRewardList = nil
end
function FixedRoguelikeRewardGachaCtrl:OnEnable()
end
function FixedRoguelikeRewardGachaCtrl:OnDisable()
end
function FixedRoguelikeRewardGachaCtrl:OnDestroy()
end
function FixedRoguelikeRewardGachaCtrl:OnBtnClick_Close(btn, bNeedStop)
if self.sequence then
self.sequence:Kill()
end
if bNeedStop then
WwiseAudioMgr:PlaySound("ui_roguelike_gacha_allStop")
end
self.gameObject:SetActive(false)
self.tbGoItem = nil
self.tbRewardList = nil
delChildren(self._mapNode.rtContent)
EventManager.Hit("CloseRewardGacha")
end
return FixedRoguelikeRewardGachaCtrl
@@ -0,0 +1,99 @@
local FRIndicators = class("FRIndicators", BaseCtrl)
FRIndicators._mapNodeConfig = {
canvasGroup = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "CanvasGroup"
},
IndictorArea = {sComponentName = "Transform"},
TemplateBoxIndicator = {},
TemplateTeleportIndicator = {},
TemplateBossIndicator = {},
TemplateNPCIndicator = {}
}
FRIndicators._mapEventConfig = {
SetIndicator = "OnEvent_SetIndicator",
FRRoomEnd = "OnEvent_LevelEnd",
SetIndicatorEnemy = "OnEvent_SetIndicatorEnemy",
LevelStateChanged = "OnEvent_LevelStateChanged",
InputEnable = "OnEvent_InputEnable"
}
function FRIndicators:Awake()
self.tbIndicators = {}
self.tbEnemyIndicators = {}
end
function FRIndicators:FadeIn()
end
function FRIndicators:FadeOut()
end
function FRIndicators:OnEnable()
end
function FRIndicators:OnDisable()
end
function FRIndicators:OnDestroy()
end
function FRIndicators:OnRelease()
end
function FRIndicators:OnEvent_SetIndicator(nType, rtTransform, v3Offset, sIconPath)
if #self.tbIndicators > 10 then
printError("箱子传送门指示器数量上限")
return
end
if nType == 1 then
local go = instantiate(self._mapNode.TemplateBoxIndicator, self._mapNode.IndictorArea)
local comp = go:GetComponent("FRIndicator")
go:SetActive(true)
if comp ~= nil then
comp:SetFollowTarget(rtTransform, v3Offset)
end
table.insert(self.tbIndicators, go)
elseif nType == 2 then
local go = instantiate(self._mapNode.TemplateTeleportIndicator, self._mapNode.IndictorArea)
local comp = go:GetComponent("FRIndicator")
go:SetActive(true)
if comp ~= nil then
comp:SetFollowTarget(rtTransform, v3Offset)
end
table.insert(self.tbIndicators, go)
elseif nType == 3 and sIconPath ~= nil and sIconPath ~= "" then
local go = instantiate(self._mapNode.TemplateNPCIndicator, self._mapNode.IndictorArea)
local comp = go:GetComponent("FRIndicator")
go:SetActive(true)
if comp ~= nil then
comp:SetFollowTarget(rtTransform, v3Offset)
end
local img = go.transform:Find("Icon")
self:SetAtlasSprite(img:GetComponent("Image"), "15_battle", sIconPath)
table.insert(self.tbIndicators, go)
end
end
function FRIndicators:OnEvent_SetIndicatorEnemy(nEntityId, v3Offset)
if #self.tbEnemyIndicators > 10 then
printError("敌人指示器数量上限")
return
end
local go = instantiate(self._mapNode.TemplateBossIndicator, self._mapNode.IndictorArea)
go:SetActive(true)
CS.AdventureModuleHelper.SetBossIndicatorTarget(nEntityId, go, v3Offset)
table.insert(self.tbEnemyIndicators, go)
end
function FRIndicators:OnEvent_LevelStateChanged()
for _, goIndicators in pairs(self.tbEnemyIndicators) do
destroy(goIndicators)
end
self.tbEnemyIndicators = {}
end
function FRIndicators:OnEvent_LevelEnd()
for _, goIndicators in pairs(self.tbIndicators) do
destroy(goIndicators)
end
for _, goIndicators in pairs(self.tbEnemyIndicators) do
destroy(goIndicators)
end
self.tbIndicators = {}
end
function FRIndicators:OnEvent_InputEnable(bEnable)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, bEnable == true and 1 or 0)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroup, bEnable == true)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.canvasGroup, bEnable == true)
end
return FRIndicators