171 lines
5.9 KiB
Lua
171 lines
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
|