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 GeneralShop = oo.class(shop) GeneralShop.MaxSpecialGoodsCount = 1 --特殊最大商品数量 GeneralShop.MaxGeneralGoodsCount = 6 --普通最大商品数量 GeneralShop.BuyStatus_Suc = 1 --成功 GeneralShop.BuyStatus_NoMoney = 2 --余额不足 GeneralShop.BuyStatus_NoExistShop = 3 --无法购买该家具 GeneralShop.RefreshStatus_Suc = 1 --成功 GeneralShop.RefreshStatus_NoMoney = 2 --余额不足 GeneralShop.RefreshStatus_NoExistShop = 3 --不存在商店类型 GeneralShop.FurnitureBuyType_Coin = 1 --家具金币购买类型 GeneralShop.FurnitureBuyType_AD = 2 --广告购买类型 GeneralShop.FurnitureBuyType_Clovers = 3 --家具四叶草购买类型 GeneralShop.FurnitureBuyType_Flower = 7 --花店购买类型 GeneralShop.DecorateBuyType_Coin = 1 --装修金币购买类型 GeneralShop.DecorateBuyType_Clovers = 2 --装修四叶草购买类型 function GeneralShop:Init() end --显示一种类型 function GeneralShop:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SShopShow", c2sData.data )) local shopType = c2sData.data.shopType local data = {} data.shopInfo = {} --只有花盆的特殊商品需要根据等级填充花盆数据 if dataType.ShopType_Seed == shopType then local unlockCount = player.gameData.plantCount local flowerpotList = self:GetUnLockFlowerpot( self.FlowerpotType_Seed , unlockCount ) for k1, v1 in pairs( flowerpotList ) do local isExistFlowerpot = false --是否存在花盆 for k2, v2 in pairs( player.gameData.shop[ shopType ].specialGoods ) do if v1 == v2.id then isExistFlowerpot = true break end end if not isExistFlowerpot then --玩家可以购买该花盆 table.insert( player.gameData.shop[ shopType ].specialGoods , { id = v1 , buyCount =0 } ) end end end --时间超过了,刷新新的一批 if skynet.GetTime() >= player.gameData.shop[ shopType ].nextRefreshTime then self:RefreshShop( player , shopType ) end local phoneId = 0 if dataType.ShopType_Furniture == shopType then phoneId = 5 elseif dataType.ShopType_Cinnabar == shopType then phoneId = 6 elseif dataType.ShopType_Seed == shopType then phoneId = 11 end skynet.server.msgTips:Reduce( player , phoneId) --获取最新的商店数据 data.shopInfo = self:GetShopData(player , shopType) data.plantCount = player.gameData.plantCount s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopShow") s2cData.data = assert(pb.encode("S2CShopShow", data)) end --刷新商店类型 function GeneralShop:Refresh( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SShopRefresh", c2sData.data )) local shopType = c2sData.data.shopType local data = {} data.shopInfo = {} local refreshPrice = self:GetRefreshShopPrice( shopType ) if refreshPrice then --扣除 if player:MoneyChange( dataType.MoneyType_Volute , -refreshPrice ) then self:RefreshShop( player , shopType ) data.shopInfo = self:GetShopData( player , shopType ) skynet.server.achieveTask:Modify( player , 34 , 1) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end else s2cData.code = errorInfo.ErrorCode.NoExistShopType end s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopRefresh") s2cData.data = assert(pb.encode("S2CShopRefresh", data)) end --刷新商店类型 function GeneralShop:RefreshShop( player , shopType ) local level = player.gameData.level local oldSpecialGoods = player.gameData.shop[ shopType ].specialGoods local oldGeneralGoods = player.gameData.shop[ shopType ].generalGoods player.gameData.shop[ shopType ].isBuySpecialGoods = false local randGoodsList = {} if dataType.ShopType_Furniture == shopType then --家具 randGoodsList = self:GetRandFurniture( oldSpecialGoods , level , 1 , self.FurnitureBuyType_Clovers ) --特别商品 self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , true) randGoodsList = {} local noBuyCount = math.random(1,3) --随机1~3个未购买的家具数量 log.info(string.format("玩家 %d 通用商店 随机未购买家具数量 %d" , player.userId , noBuyCount )) self:GetHistoryGoods( player , shopType , oldGeneralGoods ) local isSuc,tmpGoodsList = self:GetNoBuyFurniture( player , oldGeneralGoods , level , noBuyCount , self.FurnitureBuyType_Coin ) if isSuc then --成功刷出指定未购买的数量 for k, v in pairs(tmpGoodsList) do table.insert( randGoodsList , v ) table.insert( oldGeneralGoods , { id = v , buyCount = 0 } ) self:AddHistoryGoods( player , shopType , v ) log.info(string.format("玩家 %d 通用商店 未购买家具ID %d" , player.userId , v )) end self:GetHistoryGoods( player , shopType , oldGeneralGoods ) --剩余数量的可以随机刷 tmpGoodsList = self:GetRandFurniture( oldGeneralGoods , level , 6 - noBuyCount , self.FurnitureBuyType_Coin ) for k, v in pairs(tmpGoodsList) do table.insert( randGoodsList , v ) self:AddHistoryGoods( player , shopType , v ) log.info(string.format("玩家 %d 通用商店 纯随机家具ID %d" , player.userId , v )) end else --纯随机家具 randGoodsList = self:GetRandFurniture( oldGeneralGoods , level , 6 , self.FurnitureBuyType_Coin ) for k, v in pairs(randGoodsList) do log.info(string.format("玩家 %d 通用商店 纯随机家具ID %d" , player.userId , v )) end end self:RefreshHistoryGoods( player ,shopType ) self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , false) elseif dataType.ShopType_Cinnabar == shopType then --摆件 randGoodsList = self:GetRandCinnabar( oldSpecialGoods , level , 1 , self.FurnitureBuyType_Clovers ) --特别商品 self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , true) randGoodsList = {} local noBuyCount = math.random(1,3) --随机1~3个未购买的摆件数量 log.info(string.format("玩家 %d 通用商店 随机未购买摆件数量 %d" , player.userId , noBuyCount )) self:GetHistoryGoods( player , shopType , oldGeneralGoods ) local isSuc,tmpGoodsList = self:GetNoBuyCinnabar( player , oldGeneralGoods , level , noBuyCount , self.FurnitureBuyType_Coin ) if isSuc then --成功刷出指定未购买的数量 for k, v in pairs(tmpGoodsList) do table.insert( randGoodsList , v ) table.insert( oldGeneralGoods , { id = v , buyCount = 0 } ) self:AddHistoryGoods( player , shopType , v ) log.info(string.format("玩家 %d 通用商店 未购买摆件ID %d" , player.userId , v )) end self:GetHistoryGoods( player , shopType , oldGeneralGoods ) --剩余数量的可以随机刷 tmpGoodsList = self:GetRandCinnabar( oldGeneralGoods , level , 6 - noBuyCount , self.FurnitureBuyType_Coin ) for k, v in pairs(tmpGoodsList) do table.insert( randGoodsList , v ) self:AddHistoryGoods( player , shopType , v ) log.info(string.format("玩家 %d 通用商店 纯随机摆件ID %d" , player.userId , v )) end else randGoodsList = self:GetRandCinnabar( oldGeneralGoods , level , 6 , self.FurnitureBuyType_Coin ) for k, v in pairs(randGoodsList) do log.info(string.format("玩家 %d 通用商店 纯随机摆件ID %d" , player.userId , v )) end end self:RefreshHistoryGoods( player ,shopType ) self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , false) elseif dataType.ShopType_Seed == shopType then --种子相关 oldGeneralGoods = {} if player.gameData.shop[ shopType ].isFirstRefresh then --第一次刷新2这个种子不参与随机 table.insert( oldGeneralGoods , { id = 2 , buyCount =0 }) end randGoodsList = self:GetRandSeed( self.FlowerpotType_Seed , oldGeneralGoods , level , 5 ) --5个普通种子 if player.gameData.shop[ shopType ].isFirstRefresh then --第一次刷新第一个种子给指定的种子 player.gameData.shop[ shopType ].isFirstRefresh = false randGoodsList[ 1 ] = 2 end table.insert( randGoodsList , 11) --1个奇异种子 self:SetShopData( player , shopType , dataType.GoodsType_Flowerpot , randGoodsList , false) end local nextRefreshTime = 0 if level <= 6 then nextRefreshTime = 600 + skynet.GetTime() else nextRefreshTime = self:GetRefreshTime(shopType) + skynet.GetTime() end player.gameData.shop[ shopType ].nextRefreshTime = nextRefreshTime log.info(string.format("玩家 %d 通用商店 刷新时间 %s" , player.userId , skynet.server.common:GetStrTime(player.gameData.shop[ shopType ].nextRefreshTime))) end --商店购买 function GeneralShop:Buy( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SShopBuy", c2sData.data )) local shopType = c2sData.data.shopType local specialGoods = c2sData.data.specialGoods local generalGoods = c2sData.data.generalGoods local data = {} if not self:IsVaildShopType( shopType ) then s2cData.code = errorInfo.ErrorCode.NoExistShopType else local curShop = player.gameData.shop[ shopType ] local isBuySuc = false --特殊商品购买 if specialGoods then for k, v in pairs( curShop.specialGoods ) do --if specialGoods.id == v.id and not player.gameData.shop[ shopType ].isBuySpecialGoods then if specialGoods.id == v.id then --存在该商品 local goodsCount = math.abs(specialGoods.count) local moneyType , moneyCount = 0,0 if dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then --家具和摆件 moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , v.id ) local costCoin = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -costCoin ) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v.id , goodsCount ) --任务添加 if dataType.ShopType_Furniture == shopType then skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyFurniture , goodsCount) skynet.server.dailyTask:Modify( player , 1 , goodsCount) skynet.server.achieveTask:Modify( player , 1 , goodsCount) else skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyCinnabar , goodsCount) skynet.server.dailyTask:Modify( player , 2 , goodsCount) skynet.server.achieveTask:Modify( player , 2 , goodsCount) end skynet.server.passCheck:Modify( player , 2 , 1 ) --增加经验 local exp = skynet.server.bag:CalcExp( dataType.GoodsType_Furniture , v.id, goodsCount ) player:AddExp( exp ) player.gameData.shop[ shopType ].specialGoods[k].buyCount = 1 isBuySuc = true player.gameData.shop[ shopType ].isBuySpecialGoods = true end elseif dataType.ShopType_Seed == shopType then --花盆 moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Flowerpot" , v.id ) --self:GetFlowerpotPrice( v.id ) local costCoin = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -costCoin ) then player.gameData.shop[ shopType ].consumeCoin = player.gameData.shop[ shopType ].consumeCoin + (moneyCount * goodsCount) skynet.server.bag:AddGoods( player , dataType.GoodsType_Flowerpot , v.id , goodsCount ) --skynet.server.map:CheckUnlockFlowerShop( player , player.gameData.shop[ shopType ].consumeCoin ) --增加经验 local exp = math.ceil(moneyCount * 0.8) player:AddExp( exp ) player.gameData.shop[ shopType ].specialGoods[k].buyCount = 1 player.gameData.shop[ shopType ].isBuySpecialGoods = false isBuySuc = true end end if isBuySuc then data.shopType = shopType data.specialGoods = { id = v.id , buyCount = 1 } log.info(string.format("玩家 %d 通用商店 购买特殊商品成功 商品 %d 扣除四叶草 %d" , player.userId , v.id , moneyCount)) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end end end isBuySuc = false --普通商品购买 if generalGoods then for k, v in pairs( curShop.generalGoods ) do if generalGoods.id == v.id then --存在该商品 local goodsCount = math.abs(generalGoods.count) local moneyType , moneyCount = 0,0 if dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then --家具和摆件 moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , v.id ) local costCoin = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -costCoin ) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v.id , goodsCount ) --任务添加 if dataType.ShopType_Furniture == shopType then skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyFurniture , goodsCount) skynet.server.dailyTask:Modify( player , 1 , goodsCount) skynet.server.achieveTask:Modify( player , 1 , goodsCount) else skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyCinnabar , goodsCount) skynet.server.dailyTask:Modify( player , 2 , goodsCount) skynet.server.achieveTask:Modify( player , 2 , goodsCount) end skynet.server.passCheck:Modify( player , 1 , costCoin ) skynet.server.passCheck:Modify( player , 2 , 1 ) --增加经验 local exp = skynet.server.bag:CalcExp( dataType.GoodsType_Furniture , v.id, goodsCount ) player:AddExp( exp ) player.gameData.shop[ shopType ].generalGoods[k].buyCount = 1 isBuySuc = true end elseif dataType.ShopType_Seed == shopType then --种子 moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Seed" , v.id ) --self:GetSeedPrice( v.id ) local costCoin = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -costCoin ) then player.gameData.shop[ shopType ].consumeCoin = player.gameData.shop[ shopType ].consumeCoin + costCoin skynet.server.bag:AddGoods( player , dataType.GoodsType_Seed , v.id , goodsCount ) player.gameData.shop[ shopType ].generalGoods[k].buyCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Seed , v.id ) isBuySuc = true --skynet.server.map:CheckUnlockFlowerShop( player , player.gameData.shop[ shopType ].consumeCoin ) skynet.server.levelTask:Modify( player , 45 , 1 ) skynet.server.passCheck:Modify( player , 7 , 1 ) --解锁言叶 skynet.server.friend:InitNpc( player , 3 ) end end if isBuySuc then data.shopType = shopType data.generalGoods = { id = v.id , buyCount = goodsCount} log.info(string.format("玩家 %d 通用商店 购买普通商品成功 商品ID %d 扣除金币 %d" , player.userId , v.id , moneyCount)) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopBuy") s2cData.data = assert(pb.encode("S2CShopBuy", data)) end --设置商店数据 function GeneralShop:SetShopData( player , shopType , goodsType , randGoodsList , isSpecial ) --是否为特殊商品 if isSpecial then player.gameData.shop[ shopType ].specialGoods = {} else player.gameData.shop[ shopType ].generalGoods = {} end --是否购买 for k, v in pairs( randGoodsList ) do local buyCount = 0 if player:IsBuyGoods( goodsType , v ) then buyCount = 1 end if isSpecial then table.insert( player.gameData.shop[ shopType ].specialGoods , { id = v , buyCount = buyCount } ) log.info(string.format("玩家 %d 通用商店 设置特殊商店数据 商店类型 %d 商品ID %d 是否购买 %d" , player.basicInfo.userID , shopType , v , buyCount )) else table.insert( player.gameData.shop[ shopType ].generalGoods , { id = v , buyCount =buyCount } ) log.info(string.format("玩家 %d 通用商店 设置普通商店数据 商店类型 %d 商品ID %d 是否购买 %d" , player.basicInfo.userID , shopType , v , buyCount )) end end end --获取商店数据 function GeneralShop:GetShopData( player , shopType ) local shopInfo = {} shopInfo.shopType = shopType shopInfo.specialGoods = player.gameData.shop[ shopType ].specialGoods --种子计算下最新的数量 if dataType.ShopType_Seed == shopType then for k, v in pairs( player.gameData.shop[ shopType ].generalGoods ) do v.buyCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Seed , v.id ) end end shopInfo.generalGoods = player.gameData.shop[ shopType ].generalGoods shopInfo.nextRefreshTime = player.gameData.shop[ shopType ].nextRefreshTime return shopInfo end --增加历史商品 function GeneralShop:AddHistoryGoods( player , shopType , goodsId ) local goods = player.gameData.shop[ shopType ].historyGoods local isExistGoods = false for k, v in pairs( goods ) do if goodsId == v.id then isExistGoods = true break end end if not isExistGoods then table.insert( goods , { id = goodsId , count = 1}) end end --刷新历史商品 function GeneralShop:RefreshHistoryGoods( player , shopType ) local goods = player.gameData.shop[ shopType ].historyGoods for k, v in pairs( goods ) do --每个商品都加1 v.count = v.count + 1 --大于3次就置空 if v.count > 3 then goods[k] = nil end end end --获取历史商品 function GeneralShop:GetHistoryGoods( player , shopType , oldGeneralGoods) if not player.gameData.shop[ shopType ].historyGoods then player.gameData.shop[ shopType ].historyGoods ={} end local goods = player.gameData.shop[ shopType ].historyGoods for k, v in pairs( goods ) do table.insert( oldGeneralGoods , { id = v.id , buyCount = 0 } ) end end skynet.server.generalShop = GeneralShop return GeneralShop