local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local shop = require "Shop" local Design = oo.class(shop) Design.lotteryType = dataType.LotteryType_LongTime Design.LotteryType_1= 1 --初级家具卡池 Design.LotteryType_2= 2 --高级家具卡池 Design.LotteryType_3= 3 --限时家具卡池 Design.TicketType_1= 1 --高级设计稿 Design.TicketType_2= 2 --初级设计稿 Design.TicketType_3= 3 --限时设计稿 Design.goldLotteryId = 0 Design.advancedLotteryId = 0 Design.limitedLotteryId = 0 Design.LotteryTimes_One = 1 --抽一次 Design.LotteryTimes_Ten = 2 --抽十次 --初始化数据 function Design:InitData( player , lotteryType ) end --设计抽奖展示 function Design:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignShow", c2sData.data )) local data = {} if not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local design = player.gameData.design local cfgRaffle = skynet.server.gameConfig.Raffle data.limitedLotteryId = 0 for k, v in pairs(cfgRaffle) do --目前初始和高级卡池不会变,只有限时卡池可能会根据时间来变 if self.LotteryType_1 == v.raffleType then self.goldLotteryId = v.id elseif self.LotteryType_2 == v.raffleType then self.advancedLotteryId = v.id end if "" ~= v.startTime and "" ~= v.endTime then local startTime = skynet.server.common:GetTime( v.startTime ) local endTime = skynet.server.common:GetTime( v.endTime ) if self.LotteryType_3 == v.raffleType and skynet.GetTime() >= startTime and skynet.GetTime() <= endTime then self.limitedLotteryId = v.id end end end data.goldLotteryId = self.goldLotteryId data.advancedLotteryId = self.advancedLotteryId data.limitedLotteryId = self.limitedLotteryId data.designCurrency = self:GetTicket( player ) data.basicFreeTime = design.basicFreeTime data.advancedFreeTime = design.advancedFreeTime data.isBuyStorePack8 = design.isBuyStorePack8 end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignShow") s2cData.data = assert(pb.encode("S2CDesignShow", data)) end --设计抽奖展示 function Design:Lottery( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignLottery", c2sData.data )) local data = {} local lotteryType = c2sData.data.lotteryType local lotteryTimes = c2sData.data.lotteryTimes if not lotteryType or not lotteryTimes or lotteryType < self.LotteryType_1 or lotteryType > self.LotteryType_3 or lotteryTimes < self.LotteryTimes_One or lotteryTimes > self.LotteryTimes_Ten then s2cData.code = errorInfo.ErrorCode.ErrRequestParam elseif self.LotteryType_3 == lotteryType and 0 == self.limitedLotteryId then s2cData.code = errorInfo.ErrorCode.ActivityClosed elseif not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local design = player.gameData.design local moneyType,moneyCount = 0,0 local reduceCount = 0 --扣除券数量 if self.LotteryTimes_One == lotteryTimes then --抽一次 reduceCount = 1 local cfgSValue = skynet.server.gameConfig.SValue if self.LotteryType_1 == lotteryType and skynet.GetTime() >= design.basicFreeTime then reduceCount = 0 design.basicFreeTime = skynet.GetTime() + (cfgSValue.goldRaffleTypeFreeTime * 60 ) --1天后再领 end if self.LotteryType_2 == lotteryType and skynet.GetTime() >= design.advancedFreeTime then reduceCount = 0 design.advancedFreeTime = skynet.GetTime() + (cfgSValue.voluteRaffleTypeFreeTime * 60 ) --1天后再领 end elseif self.LotteryTimes_Ten == lotteryTimes then --抽十次 reduceCount = 10 end log.info(string.format("玩家 %d 设计间 抽奖类型 %d 抽奖次数 %d 扣除前 金币数量 %d 蜗壳数量 %d 券数量 %d %d %d", player.userId , lotteryType,reduceCount, player.gameData.coin , player.gameData.volute ,design.ticket1 , design.ticket2 , design.ticket3 )) --开始计算扣除货币数量 local isEnoughMoney = false local lotteryId = 0 if self.LotteryType_1 == lotteryType then --初级家具卡池 if design.ticket1 - reduceCount >= 0 then design.ticket1 = design.ticket1 - reduceCount isEnoughMoney = true end lotteryId = self.goldLotteryId elseif self.LotteryType_2 == lotteryType then --高级家具卡池 if design.ticket2 - reduceCount >= 0 then design.ticket2 = design.ticket2 - reduceCount isEnoughMoney = true end lotteryId = self.advancedLotteryId elseif self.LotteryType_3 == lotteryType then --限时家具卡池 if design.ticket3 - reduceCount >= 0 then design.ticket3 = design.ticket3 - reduceCount isEnoughMoney = true end lotteryId = self.limitedLotteryId end if not isEnoughMoney then s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else log.info(string.format("玩家 %d 设计间 扣除券数量 %d 扣除后 金币数量 %d 蜗壳数量 %d 券数量 %d %d %d", player.userId , reduceCount , player.gameData.coin , player.gameData.volute , design.ticket1 , design.ticket2 , design.ticket3 )) local goods1 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Common ) --普通家具 local goods2 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Special ) --稀有家具 local goods3 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Rare ) --罕见家具 log.info(string.format("玩家 %d 设计间 商品数量 %d %d %d", player.userId , #goods1 , #goods2 , #goods3)) --开始抽奖 data.rewards = {} local goodsType = 0 local goodsId = 0 if self.LotteryTimes_One == lotteryTimes then --抽一次 goodsType,goodsId = self:StartLottery( player , lotteryType , false , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) if self.LotteryType_1 == lotteryType then skynet.server.msgTips:Reduce(player , 34) elseif self.LotteryType_2 == lotteryType then skynet.server.msgTips:Reduce(player , 31) end elseif self.LotteryTimes_Ten == lotteryTimes then --抽十次 local rand = math.random(1,10) --10连抽必出一个未拥有的罕见套间家具 for i = 1, 10, 1 do if rand == i and ( self.LotteryType_2 == lotteryType or self.LotteryType_3 == lotteryType ) then --只有高级和限时卡池才有保底 goodsType,goodsId = self:StartLottery( player , lotteryType , true , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) else goodsType,goodsId = self:StartLottery( player , lotteryType , false , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) end if dataType.GoodsType_Decorate == goodsType then self:DeleteAlreadyDec( goodsType , goodsId , goods1 , goods2 , goods3 ) end end skynet.server.achieveTask:Modify( player , 38 , 1) end --发放奖励 for k, v in pairs( data.rewards ) do log.info(string.format("玩家 %d 设计间 发放奖励 商品类型 %d 商品ID %d 商品数量 %d", player.userId , v.item.goodsType , v.item.goodsId , v.item.goodsCount )) skynet.server.bag:AddGoods( player , v.item.goodsType , v.item.goodsId , v.item.goodsCount ) end end end data.lotteryType = lotteryType data.designCurrency = self:GetTicket( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignLottery") s2cData.data = assert(pb.encode("S2CDesignLottery", data)) end --开始抽奖 function Design:StartLottery( player , lotteryType , isTenFloor , goods1 , goods2 , goods3 ) local cfgSValue = skynet.server.gameConfig.SValue local design = player.gameData.design local tenMustCount = cfgSValue.voluteRaffleRareNewGua --十连抽奖必出数量 --获取抽取概率 local rate = {} --1-普通 2-稀有 3-罕见 if self.LotteryType_1 == lotteryType then rate[1],rate[2],rate[3] = cfgSValue.goldRaffleFurnitureRatio[2] * 100,cfgSValue.goldRaffleFurnitureRatio[1] * 100,0 skynet.server.passCheck:Modify( player , 9 , 1 ) elseif self.LotteryType_2 == lotteryType or self.LotteryType_3 == lotteryType then if self.LotteryType_2 == lotteryType then skynet.server.levelTask:Modify( player , 48 , 1 ) skynet.server.passCheck:Modify( player , 10 , 1 ) end rate[1],rate[2],rate[3] = cfgSValue.voluteRaffleFurnitureRatio[3] * 100,cfgSValue.voluteRaffleFurnitureRatio[2] * 100,cfgSValue.voluteRaffleFurnitureRatio[1] * 100 end rate[1],rate[2],rate[3] = math.floor(rate[1]),math.floor(rate[2]),math.floor(rate[3]) --取个整 local allRate = 0 --统计总概率 for k, v in pairs( rate ) do allRate = allRate + v end local rand = math.random(1,allRate) --随机概率 local randIndex = 0 --对应概率索引 local allCount = 0 for k, v in pairs( rate ) do allCount = allCount + v if rand <= allCount then randIndex = k break end end log.info(string.format("玩家 %d 设计间 概率区间【1, %d】 分别抽取概率 %d %d %d 随机值 %d 商品品质 %d", player.userId , allRate , rate[1],rate[2],rate[3] ,rand ,randIndex)) local goodsType = 0 local goodsId = 0 if isTenFloor then --开启保底 local noBuyGoods = {} --把未购买的家具和装修选出来 for k, v in pairs( goods3 ) do if v.isSuit and not player:IsBuyGoods( v.type , v.id ) then table.insert( noBuyGoods , v ) end end --确实都是购买了的,那么只随机家具 if 0 == #noBuyGoods then for k, v in pairs( goods3 ) do --if v.isSuit and dataType.GoodsType_Furniture == v.type then if v.isSuit then table.insert( noBuyGoods , v ) end end end goodsType,goodsId = self:GetRandOneGoods( noBuyGoods ) else --不保底 if dataType.FurnitureQuality_Common == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods1 ) elseif dataType.FurnitureQuality_Special == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods2 ) elseif dataType.FurnitureQuality_Rare == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods3 ) end end design.curLotteryCount = design.curLotteryCount + 1 skynet.server.levelTask:Modify( player , 37 , 1 ) skynet.server.achieveTask:Modify( player , 37 , 1) return goodsType,goodsId end --通行证充值 function Design:Pay( player , storeId ) if 8 == storeId then local design = player.gameData.design design.isBuyStorePack8 = true end --[[ if not design.isBuyStorePack8 then local curCfgStorePack = nil local cfgStorePack = skynet.server.gameConfig.StorePack for k, v in pairs(cfgStorePack) do if storeId == v.id then local startTime = skynet.server.common:GetTime( v.startTime ) local endTime = skynet.server.common:GetTime( v.endTime ) if skynet.GetTime() >= startTime and skynet.GetTime() <= endTime then curCfgStorePack = v --获取当前通行证ID break end end end if curCfgStorePack then local rewardId = curCfgStorePack.rewardId player:GiveReward( rewardId ) design.isBuyStorePack8 = true end end ]] end --获取家具 function Design:GetFurniture( player , lotteryId , quality ) local cfgSValue = skynet.server.gameConfig.SValue local goods = {} --家具和装修 local cfgFur = {} local cfgDec = {} local cfgRaffle = skynet.server.gameConfig:GetCurCfg( "Raffle" , lotteryId ) if dataType.FurnitureQuality_Common == quality then cfgFur = cfgRaffle.ordinaryFurId cfgDec = cfgRaffle.ordinaryDecId elseif dataType.FurnitureQuality_Special == quality then cfgFur = cfgRaffle.rarityFurId cfgDec = cfgRaffle.rarityDecId elseif dataType.FurnitureQuality_Rare == quality and 0 ~= self.limitedLotteryId then cfgFur = cfgRaffle.rareFurId cfgDec = cfgRaffle.rareDecId end --获取家具 for k, v in pairs( cfgFur ) do table.insert( goods , { type = dataType.GoodsType_Furniture , id = v , isSuit = false }) end --获取装修 for k, v in pairs( cfgDec ) do if not player:IsBuyGoods( dataType.GoodsType_Decorate , v ) then --未购买的装修才加入进来 table.insert( goods , { type = dataType.GoodsType_Decorate , id = v , isSuit = false }) end end --套装家具 local cfgAllFurniture = skynet.server.gameConfig.Furniture for k1, v1 in pairs( cfgRaffle.suitId ) do for k2, v2 in pairs(cfgAllFurniture) do if v1 == v2.suitType and quality == v2.quality then table.insert( goods , { type = dataType.GoodsType_Furniture , id = v2.id , isSuit = true }) end end end --套装装修 local cfgAllDecoration = skynet.server.gameConfig.Decoration for k1, v1 in pairs( cfgRaffle.suitId ) do for k2, v2 in pairs(cfgAllDecoration) do if v1 == v2.suitType and quality == v2.quality and not player:IsBuyGoods( dataType.GoodsType_Decorate , v2.id ) then table.insert( goods , { type = dataType.GoodsType_Decorate , id = v2.id , isSuit = true }) end end end return goods end --获取券信息 function Design:GetTicket( player ) local design = player.gameData.design local data = {} data.basicBluePrint = design.ticket1 data.advancedBluePrint = design.ticket2 data.limitedBluePrint = design.ticket3 return data end --获取不重复的商品 function Design:GetRandOneGoods( cfgAllGoods) local randList = {} local randIndex = nil local newGoods = {} local whileCount = 0 local goodsType = 0 local goodsId = 0 while true do if 0 == #cfgAllGoods then break end randIndex = math.random( 1, #cfgAllGoods) if not randList[ randIndex ] then --不存在新的列表就添加进去 goodsType = cfgAllGoods[ randIndex ].type goodsId = cfgAllGoods[ randIndex ].id randList[ randIndex ] = true end --找够了数据或者循环了1000次就退出 if 0 ~= goodsType or whileCount >= 1000 then break end whileCount = whileCount + 1 end return goodsType,goodsId end --删除已购买的装修 function Design:DeleteAlreadyDec( goodsType , goodsId , goods1 , goods2 , goods3 ) for k, v in pairs(goods1) do if goodsType == v.type and goodsId == v.id then table.remove( goods1 , k) break end end for k, v in pairs(goods2) do if goodsType == v.type and goodsId == v.id then table.remove( goods2 , k) break end end for k, v in pairs(goods3) do if goodsType == v.type and goodsId == v.id then table.remove( goods3 , k) break end end end skynet.server.design = Design return Design