441 lines
22 KiB
Lua
441 lines
22 KiB
Lua
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 |