171 lines
No EOL
5.9 KiB
Lua
171 lines
No EOL
5.9 KiB
Lua
XSpecialShopManagerCreator = function()
|
||
local XSpecialShopManager = {}
|
||
|
||
---
|
||
--- 根据商品数据,得到对应的配置Id
|
||
local function GetFashionId(shopGoodsData)
|
||
local templateId = 0
|
||
|
||
if type(shopGoodsData.RewardGoods) == "number" then
|
||
templateId = shopGoodsData.RewardGoods
|
||
else
|
||
templateId = (shopGoodsData.RewardGoods.TemplateId and shopGoodsData.RewardGoods.TemplateId > 0) and
|
||
shopGoodsData.RewardGoods.TemplateId or
|
||
shopGoodsData.RewardGoods.Id
|
||
end
|
||
|
||
local isWeaponFashion = XDataCenter.ItemManager.IsWeaponFashion(templateId)
|
||
local id = isWeaponFashion and XDataCenter.ItemManager.GetWeaponFashionId(templateId) or templateId
|
||
return id
|
||
end
|
||
|
||
---
|
||
--- 排序角色涂装数据
|
||
--- 涂装系列Id从小到大,0为最后
|
||
--- 可购买优于不可购买
|
||
--- 角色Id从小到大
|
||
local function Sort(a, b)
|
||
local aFashionId = GetFashionId(a)
|
||
local bFashionId = GetFashionId(b)
|
||
|
||
-- 涂装系列Id排序,从小到大,0为末尾
|
||
local aSeries = XDataCenter.FashionManager.GetFashionSeries(aFashionId)
|
||
local bSeries = XDataCenter.FashionManager.GetFashionSeries(bFashionId)
|
||
if aSeries ~= bSeries then
|
||
if aSeries == 0 then
|
||
return false
|
||
end
|
||
if bSeries == 0 then
|
||
return true
|
||
end
|
||
return aSeries < bSeries
|
||
end
|
||
|
||
-- 购买条件排序,满足条件的排前面
|
||
local aMeetCondition = 1
|
||
local bMeetCondition = 1
|
||
local aConditionIds = a.ConditionIds
|
||
if aConditionIds and #aConditionIds > 0 then
|
||
for _, id in pairs(aConditionIds) do
|
||
local ret = XConditionManager.CheckCondition(id)
|
||
if not ret then
|
||
aMeetCondition = 0
|
||
end
|
||
end
|
||
end
|
||
local bConditionIds = b.ConditionIds
|
||
if bConditionIds and #bConditionIds > 0 then
|
||
for _, id in pairs(bConditionIds) do
|
||
local ret = XConditionManager.CheckCondition(id)
|
||
if not ret then
|
||
bMeetCondition = 0
|
||
end
|
||
end
|
||
end
|
||
if aMeetCondition ~= bMeetCondition then
|
||
return aMeetCondition > bMeetCondition
|
||
end
|
||
|
||
-- 售罄排序,已售罄的排后面
|
||
local aSellOut = 0
|
||
local bSellOut = 0
|
||
if a.BuyTimesLimit > 0 then
|
||
if a.TotalBuyTimes >= a.BuyTimesLimit then
|
||
aSellOut = 1
|
||
end
|
||
end
|
||
if b.BuyTimesLimit > 0 then
|
||
if b.TotalBuyTimes >= b.BuyTimesLimit then
|
||
bSellOut = 1
|
||
end
|
||
end
|
||
if aSellOut ~= bSellOut then
|
||
return aSellOut < bSellOut
|
||
end
|
||
|
||
-- 角色Id排序,从小到大
|
||
-- local aCharacterId = XDataCenter.FashionManager.GetCharacterId(aFashionId)
|
||
-- local bCharacterId = XDataCenter.FashionManager.GetCharacterId(bFashionId)
|
||
-- return aCharacterId < bCharacterId
|
||
|
||
-- 按照商品Id(GoodsId)升序
|
||
return a.Id < b.Id
|
||
end
|
||
|
||
---
|
||
--- 将'fashionData'分成最大长度为'maxSegSize'的分段,每一段都是同一系列的涂装
|
||
---
|
||
--- 'fashionData'为 按涂装系列Id排序 的数组
|
||
--- 长度不足'maxSegSize'的分段,剩余的数据为nil
|
||
--- 'isSeries'是否要区分系列
|
||
local function Segment(fashionData, maxSegSize, isSeries)
|
||
local result = {}
|
||
local segmentation = {}
|
||
if next(fashionData) and isSeries then
|
||
segmentation.First = true -- 同系列的首个片段
|
||
end
|
||
|
||
local preSeries -- 当前片段上一个涂装所属的系列,如果为nil,说明当前片段为空
|
||
|
||
for _, data in ipairs(fashionData) do
|
||
if #segmentation == maxSegSize then
|
||
-- 到达最大长度
|
||
table.insert(result, segmentation)
|
||
segmentation = {}
|
||
preSeries = nil
|
||
end
|
||
|
||
local curFashionId = GetFashionId(data)
|
||
local curSeries = XDataCenter.FashionManager.GetFashionSeries(curFashionId)
|
||
|
||
-- 是否需要区分系列
|
||
if preSeries and isSeries then
|
||
if preSeries ~= curSeries then
|
||
-- 当前涂装与segmentation内的涂装不同系列,使用新的片段
|
||
table.insert(result, segmentation)
|
||
segmentation = {}
|
||
segmentation.First = true
|
||
preSeries = nil
|
||
end
|
||
end
|
||
|
||
if not segmentation.SeriesId then
|
||
segmentation.SeriesId = curSeries
|
||
end
|
||
|
||
table.insert(segmentation, data)
|
||
preSeries = curSeries
|
||
end
|
||
|
||
if next(segmentation) then
|
||
-- 把在循环中剩余的片段放入结果中
|
||
table.insert(result, segmentation)
|
||
segmentation = {}
|
||
preSeries = nil
|
||
end
|
||
|
||
return result
|
||
end
|
||
|
||
---
|
||
--- 得到商品行的数据,一行有 XSpecialShopConfigs.MAX_COUNT 个商品
|
||
--- 'groupId'筛选组Id
|
||
--- 'selectTag'筛选标签
|
||
--- 'isSeries'是否要区分系列,true区分,false不区分
|
||
function XSpecialShopManager.GetCommodityLineData(shopId, groupId, selectTag, isSeries)
|
||
local goodsList = XShopManager.GetScreenGoodsListByTag(shopId, groupId, selectTag)
|
||
table.sort(goodsList, Sort)
|
||
|
||
goodsList = Segment(goodsList, XSpecialShopConfigs.MAX_COUNT, isSeries)
|
||
return goodsList
|
||
end
|
||
|
||
---
|
||
--- 判断是否显示活动商店入口
|
||
function XSpecialShopManager:IsShowEntrance()
|
||
local timeId = XSpecialShopConfigs.GetTimeId()
|
||
return XFunctionManager.CheckInTimeByTimeId(timeId)
|
||
end
|
||
|
||
return XSpecialShopManager
|
||
end |