HomeServer/lualib-src/Server-main/AllServer/GameServer/Shop/CoffeeShop.lua

549 lines
21 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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 CoffeeShop = oo.class(shop)
CoffeeShop.shopType = dataType.ShopType_Coffee
CoffeeShop.maxCDTime = 300 --60秒
CoffeeShop.MethodType_AD = 1 --广告
CoffeeShop.MethodType_Volute = 2 --蜗壳
--花店展示
function CoffeeShop:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeMergeShow", c2sData.data ))
--player.gameData.shop[ self.shopType ].currency[ 1 ] = 99 --测试要删
--player.gameData.shop[ self.shopType ].currency[ 2 ] = 99
--player.gameData.shop[ self.shopType ].currency[ 3 ] = 99
local curShop = player.gameData.shop[ self.shopType ]
local data = {}
data.supplierBoxes = curShop.supplierBoxes
data.grids = curShop.grids
data.currency = self:GetCurrency( player )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeMergeShow")
s2cData.data = assert(pb.encode("S2CCoffeeMergeShow", data))
end
--供应信息点击
function CoffeeShop:SupplyClick( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeMergeSupplyClick", c2sData.data ))
local shopType = dataType.ShopType_Coffee
local data = {}
local type = c2sData.data.type
local isVaild = self:IsVaildSupplierBoxes( type )
if not type or not isVaild then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local gridIndex = self:GetFreeGrid( player )
if not gridIndex then
s2cData.code = errorInfo.ErrorCode.CoffeeShopGridFull
else
local curSupplier = self:GetSupplierBoxes( player , type )
if curSupplier and curSupplier.count >= 1 then
--数量减1重新CD时间
curSupplier.count = curSupplier.count - 1
curSupplier.nextRefreshTime = skynet.GetTime() + self.maxCDTime
--放到格子里去
self:AddToFreeGrids( player , gridIndex , type , 1 )
skynet.server.passCheck:Modify( player , 13 , 1 )
data.supplierBox = curSupplier
data.gridTo = self:GetGrid( player , gridIndex ) --player.gameData.shop[ self.shopType ].grids[ gridIndex ]
else
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeMergeSupplyClick")
s2cData.data = assert(pb.encode("S2CCoffeeMergeSupplyClick", data))
end
--获取最新供货信息
function CoffeeShop:SupplyShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeMergeSupplyShow", c2sData.data ))
local data = {}
local type = c2sData.data.type
local isVaild = self:IsVaildSupplierBoxes( type )
if not type or not isVaild then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local curSupplier = self:GetSupplierBoxes( player , type )
if curSupplier then
data.supplierBox = curSupplier
else
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeMergeSupplyShow")
s2cData.data = assert(pb.encode("S2CCoffeeMergeSupplyShow", data))
end
--获取最新供货信息
function CoffeeShop:Sort( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeMergeSort", c2sData.data ))
local data = {}
--排序得第一优先级为type得升序(1-3,0), 第二优先级为level的降序(5-1)
local grids = player.gameData.shop[ self.shopType ].grids
table.sort( grids , function(a,b)
if a.type == b.type then
return a.level > b.level
else
return a.type < b.type
end
end)
--将有数据的格子先整理出来
local tmpGrids = {}
local count = 1
for k, v in pairs( grids ) do
if 0 ~= v.type then
table.insert( tmpGrids , { type = v.type , index = count , level = v.level })
count = count + 1
end
end
--填充剩余格子
for i = count, 30, 1 do
table.insert( tmpGrids , { type = 0 , index = i, level = 0 })
end
player.gameData.shop[ self.shopType ].grids = tmpGrids
data.grids = tmpGrids
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeMergeSort")
s2cData.data = assert(pb.encode("S2CCoffeeMergeSort", data))
end
--合并
function CoffeeShop:Merge( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeMergeAttempt", c2sData.data ))
local data = {}
data.addCurrencyType = dataType.CoffeeShopGoodsType_Empty
local gridFrom = c2sData.data.gridFrom
local gridTo = c2sData.data.gridTo
if not gridFrom or not gridTo or not self:IsVaildGridID( gridFrom ) or not self:IsVaildGridID( gridTo ) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
gridFrom = gridFrom
gridTo = gridTo
local grid1 = self:GetGrid( player , gridFrom ) --player.gameData.shop[ self.shopType ].grids[ gridFrom ]
local grid2 = self:GetGrid( player , gridTo ) --player.gameData.shop[ self.shopType ].grids[ gridTo ]
if not grid1 or not grid2 then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
if not self:IsFreeGrid( player , gridFrom ) and self:IsFreeGrid( player , gridTo ) then
--始非空格 终为空格 就移动过去
self:MoveGrid( player , gridFrom , gridTo )
else
---始非空格 终非空格 就合成过去
if self:IsSame( player , gridFrom , gridTo ) then
--开始合成
data.addCurrencyType = self:StartMerge( player ,gridFrom , gridTo )
if dataType.CoffeeShopGoodsType_Empty ~= data.addCurrencyType then
--有货币变化,向客户端同步下最新的货币数据
local currencyData = {}
currencyData.currency = {}
currencyData.currency.coffeeBean = player.gameData.shop[ self.shopType ].currency[1]
currencyData.currency.sugar = player.gameData.shop[ self.shopType ].currency[2]
currencyData.currency.milk = player.gameData.shop[ self.shopType ].currency[3]
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_CoffeeMergeCurrency" , currencyData )
end
skynet.server.levelTask:Modify( player , 49 , 1 )
else
--交换格子
self:ExchangeGrid( player , gridFrom , gridTo )
end
end
data.gridFrom = self:GetGrid( player , gridFrom ) --player.gameData.shop[ self.shopType ].grids[ gridFrom ]
data.gridTo = self:GetGrid( player , gridTo ) --player.gameData.shop[ self.shopType ].grids[ gridTo ]
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeMergeAttempt")
s2cData.data = assert(pb.encode("S2CCoffeeMergeAttempt", data))
end
--补充
function CoffeeShop:Replenish( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeSupplierReplenish", c2sData.data ))
local data = {}
data.addCurrencyType = dataType.CoffeeShopGoodsType_Empty
local supplierType = c2sData.data.supplierType
local methodType = c2sData.data.methodType
local coffeeAdCount = player.gameData.todayGain.coffeeReplenishAdCount
local isVaild = self:IsVaildSupplierBoxes( supplierType )
if not supplierType or not methodType or not isVaild then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local curSupplier = self:GetSupplierBoxes( player , supplierType )
local isSuc = false
if self.MethodType_AD == methodType then
if not coffeeAdCount[ supplierType ] then
coffeeAdCount[ supplierType ] = 0
end
coffeeAdCount[ supplierType ] = coffeeAdCount[ supplierType ] + 1
if coffeeAdCount[ supplierType ] <= 1 then --每天广告数量定额
--需要检测下该广告领取没有
skynet.server.ad:AddCount(player , 1)
isSuc = true
end
elseif self.MethodType_Volute == methodType then
local cfgCoffeeMakingPara = skynet.server.gameConfig.SValue.coffeeMakingPara
if player:MoneyChange( dataType.MoneyType_Volute , - cfgCoffeeMakingPara[4] ) then
isSuc = true
end
end
if isSuc then
if not coffeeAdCount[ supplierType ] then
curSupplier.adTimes = 0
else
curSupplier.adTimes = coffeeAdCount[ supplierType ]
end
local cfgCoffeeMakingPara = skynet.server.gameConfig.SValue.coffeeMakingPara
curSupplier.count = cfgCoffeeMakingPara[1]
data.supplierBox = curSupplier
log.info(string.format("玩家 %d 咖啡店 补充商品 补充类型 %d 补充商品类型 %d ", player.userId , methodType , supplierType))
else
s2cData.code = errorInfo.ErrorCode.TodayMaxLimit
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeSupplierReplenish")
s2cData.data = assert(pb.encode("S2CCoffeeSupplierReplenish", data))
end
--研发
function CoffeeShop:Research( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeResearch", c2sData.data ))
local data = {}
data.addCurrencyType = dataType.CoffeeShopGoodsType_Empty
local isNew = false --是否研发出新产品
--[[
local supplyIndex = { 0 , 0 ,0 } --保存3种必要供应品的索引
local curGrid = nil
for i = dataType.CoffeeShopGoodsType_CoffeeBean, dataType.CoffeeShopGoodsType_Milk , 1 do
for j = 1, 30, 1 do
curGrid = self:GetGrid( player , j ) --player.gameData.shop[ self.shopType ].grids[ j ]
if curGrid.type == i then
--找到该供应品的索引
supplyIndex[ i ] = j
log.info("1111111a")
break
end
end
end]]
local curShop = player.gameData.shop[ self.shopType ]
--[[
local currency = {}
currency.coffeeBean = curShop.currency[1]
currency.sugar = curShop.currency[2]
currency.milk = curShop.currency[3]
]]
--检查是否有效
local isVaild = true
for i = dataType.CoffeeShopGoodsType_CoffeeBean, dataType.CoffeeShopGoodsType_Milk , 1 do
if 0 == curShop.currency[i] then
isVaild = false
break
end
end
if not isVaild then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
else
--供应品足够,可以研发
--开始研发
--扣除货币
for i = dataType.CoffeeShopGoodsType_CoffeeBean, dataType.CoffeeShopGoodsType_Milk , 1 do
curShop.currency[i] = curShop.currency[i] - 1
end
local coffeeId = 1 --研发出来的咖啡ID
local randCoffee = self:GetRandCoffee( player , self.CoffeeType_Coffee , 1)
coffeeId = randCoffee[1]
--研发成功
skynet.server.levelTask:Modify( player , 29 , 1 )
skynet.server.achieveTask:Modify( player , 29 , 1 )
skynet.server.passCheck:Modify( player , 11 , 1 )
local curCoffees = player.gameData.shop[ self.shopType ].coffees
local isExist = false
for k, v in pairs( curCoffees ) do
if v == coffeeId then
isExist = true
end
end
if not isExist then
--研发出来了新的咖啡
isNew = true
table.insert( curCoffees , coffeeId )
--skynet.server.achieveTask:Modify( player , 8 , 1)
end
--发送奖励
local curCfgCoffeeType = skynet.server.gameConfig:GetCurCfg( "CoffeeType" , coffeeId )
player:GiveRewardNpc( curCfgCoffeeType.inventReward , 4 )
data.currency = self:GetCurrency( player )
data.inventedCoffee = coffeeId
data.isNew = isNew
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeResearch")
s2cData.data = assert(pb.encode("S2CCoffeeResearch", data))
end
--图鉴显示
function CoffeeShop:IllustrationShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeIllustrationShow", c2sData.data ))
local curShop = player.gameData.shop[ self.shopType ]
local data = {}
local cfg = {}
local cfgSValue = skynet.server.gameConfig.SValue
local cfgIllustationsReward = cfgSValue.coffeeIllustationReward
local cfgReward = skynet.server.gameConfig.Reward
data.rewards = {}
data.currentCoffees = curShop.coffees
local coffeeCount = #curShop.coffees
for k1, v1 in pairs( curShop.rewards ) do
for k2, v2 in pairs( cfgIllustationsReward ) do
local reward = skynet.server.common:Split( v2 ,"_" )
--满足条件就设置可领状态
if k2 == v1.id and dataType.Status_NoGain == v1.status and coffeeCount >= tonumber(reward[ 1 ]) then
v1.status = dataType.Status_CanGain
end
end
--能领和领取的发给客户端
if dataType.Status_CanGain == v1.status or dataType.Status_AlreadyGain == v1.status then
table.insert( data.rewards , v1 )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeIllustrationShow")
s2cData.data = assert(pb.encode("S2CCoffeeIllustrationShow", data))
end
--图鉴奖励
function CoffeeShop:IllustrationPrize( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SCoffeeIllustrationPrize", c2sData.data ))
local data = {}
local id = c2sData.data.id
if not id then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local curShop = player.gameData.shop[ self.shopType ]
data.id = id
data.awardMoney = {} --奖励的货币
data.awardGoods = {} --奖励的物品
data.rewards = {}
local rewardId = 0
local cfgSValue = skynet.server.gameConfig.SValue
for k, v in pairs( cfgSValue.coffeeIllustationReward ) do
local reward = skynet.server.common:Split( v ,"_" )
if id == k then
rewardId = tonumber(reward[2])
break
end
end
for k, v in pairs( curShop.rewards ) do
if id == v.id and dataType.Status_CanGain == v.status then
v.status = dataType.Status_AlreadyGain
--发奖
local cfgReward = skynet.server.gameConfig:GetCurCfg("Reward" , rewardId )
player:GiveReward( rewardId )
table.insert( data.awardMoney , { type = dataType.GoodsType_Clovers , count = cfgReward.mapCoin })
local cfgSceneObject = cfgReward.sceneObject
for k, v in pairs(cfgSceneObject) do
local tmp = skynet.server.common:Split( v ,"_" )
local goodsType = 0
if 1 == tonumber(tmp[ 1 ]) then
goodsType = dataType.GoodsType_Furniture
elseif 2 == tonumber(tmp[ 1 ]) then
goodsType = dataType.GoodsType_Decorate
end
table.insert( data.awardGoods , { goodsType = goodsType , goodsId = tonumber(tmp[ 2 ]) , goodsCount = 1})
end
end
--能领和领取的发给客户端
if dataType.Status_CanGain == v.status or dataType.Status_AlreadyGain == v.status then
table.insert( data.rewards , v )
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_CoffeeIllustrationPrize")
s2cData.data = assert(pb.encode("S2CCoffeeIllustrationPrize", data))
end
--添加格子商品
function CoffeeShop:AddToFreeGrids( player , index , type , level )
local curGrid = self:GetGrid( player , index ) --player.gameData.shop[ self.shopType ].grids[ index ]
curGrid.type = type
curGrid.level = level
log.info(string.format("玩家 %d 咖啡店 添加格子商品 格子索引 %d 商品类型 %d 等级 %d", player.userId , index , type , level ))
end
--获取空闲格子
function CoffeeShop:GetFreeGrid( player )
local grids = player.gameData.shop[ self.shopType ].grids
for i = 1, 30, 1 do
local curGrid = self:GetGrid( player , i )
if dataType.CoffeeShopGoodsType_Empty == curGrid.type then
return i
end
end
return nil
end
--设置为空闲格子
function CoffeeShop:SetFreeGrid( player , index )
local grid = self:GetGrid( player , index )
--local grid = player.gameData.shop[ self.shopType ].grids[ index ]
if grid then
grid.type = dataType.CoffeeShopGoodsType_Empty
grid.level = 0
end
end
--是否为空闲格子
function CoffeeShop:IsFreeGrid( player , index )
--local grid = player.gameData.shop[ self.shopType ].grids[ index ]
local grid = self:GetGrid( player , index )
if grid and dataType.CoffeeShopGoodsType_Empty == grid.type then
return true
else
return false
end
end
--是否相同
function CoffeeShop:IsSame( player , gridFrom , gridTo )
--local grid = self:GetGrid( player , index )
local curGridFrom = self:GetGrid( player , gridFrom )
local curGridTo = self:GetGrid( player , gridTo )
if curGridFrom.type == curGridTo.type and curGridFrom.level == curGridTo.level then
return true
else
return false
end
end
--开始合成
function CoffeeShop:StartMerge( player , gridFrom , gridTo )
local curGridFrom = self:GetGrid( player , gridFrom )
local curGridTo = self:GetGrid( player , gridTo )
local currencyType = dataType.CoffeeShopGoodsType_Empty
curGridTo.level = curGridTo.level + 1
if 6 == curGridTo.level then
--合成了最高等级
for k, v in pairs( player.gameData.shop[ self.shopType ].currency ) do
if curGridTo.type == k then
player.gameData.shop[ self.shopType ].currency[ k ] = player.gameData.shop[ self.shopType ].currency[ k ] + 1
player.gameData.shop[ self.shopType ].mergeCount = player.gameData.shop[ self.shopType ].mergeCount + 1
currencyType = k
break
end
end
self:SetFreeGrid( player , gridFrom )
self:SetFreeGrid( player , gridTo )
else
self:SetFreeGrid( player , gridFrom )
end
return currencyType
end
--移动格子
function CoffeeShop:MoveGrid( player , gridFrom , gridTo )
local curGridFrom = self:GetGrid( player , gridFrom )
local curGridTo = self:GetGrid( player , gridTo )
curGridTo.type = curGridFrom.type
curGridTo.level = curGridFrom.level
--清空原格子
self:SetFreeGrid( player , gridFrom )
end
--交换格子
function CoffeeShop:ExchangeGrid( player , gridFrom , gridTo )
local curGridFrom = self:GetGrid( player , gridFrom )
local curGridTo = self:GetGrid( player , gridTo )
curGridTo.type , curGridFrom.type = curGridFrom.type , curGridTo.type
curGridTo.level , curGridFrom.level = curGridFrom.level , curGridTo.level
end
--获取供应端信息
function CoffeeShop:GetSupplierBoxes( player , type )
for k, v in pairs( player.gameData.shop[ self.shopType ].supplierBoxes ) do
if type == v.type then
--如果CD时间到了就给他充满
if skynet.GetTime() > v.nextRefreshTime then
local cfgCoffeeMakingPara = skynet.server.gameConfig.SValue.coffeeMakingPara
v.count = cfgCoffeeMakingPara[1]
end
return v
end
end
return nil
end
--获取当前货币
function CoffeeShop:GetCurrency( player )
local curShop = player.gameData.shop[ self.shopType ]
local currency = {}
currency.coffeeBean = curShop.currency[1]
currency.sugar = curShop.currency[2]
currency.milk = curShop.currency[3]
return currency
end
function CoffeeShop:GetGrid( player , gridIndex )
for k, v in pairs( player.gameData.shop[ self.shopType ].grids ) do
if gridIndex == v.index then
return v
end
end
end
--是否有效的补充盒
function CoffeeShop:IsVaildSupplierBoxes( type )
if nil == type or type < dataType.CoffeeShopGoodsType_CoffeeBean or type > dataType.CoffeeShopGoodsType_Milk then
return false
end
return true
end
--是否有效的格子ID
function CoffeeShop:IsVaildGridID( id )
if nil == id or id < 1 and id >= 30 then
return false
end
return true
end
skynet.server.coffeeShop = CoffeeShop
return CoffeeShop