HomeServer/lualib-src/Server-main/AllServer/GameServer/Shop/CoffeeShop.lua
2024-11-20 15:41:37 +08:00

549 lines
21 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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