HomeServer/Server/AllServer/GameServer/Activity/ActivityLabyrinth.lua

464 lines
23 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 activity = require "Activity"
local json = require "json"
local ActivityLabyrinth = oo.class()
ActivityLabyrinth.ActivityType = dataType.ActivityType_Labyrinth
ActivityLabyrinth.ChestType_award = 1 --奖励宝箱
ActivityLabyrinth.ChestType_punish = 2 --惩罚宝箱
--根据玩家的配置获取不同的数据
ActivityLabyrinth.ActivityInfo = {}
local configType = skynet.server.gameConfig:GetConfigType( "Main" , 1 )
ActivityLabyrinth.ActivityInfo[ configType ] = {}
ActivityLabyrinth.ActivityInfo[ configType ].ActivityId = 0 --该活动在配置中的id
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinPrice = 0 --蜗壳币购买机会价格
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinSkip = 0 --跳过惩罚的蜗壳币
ActivityLabyrinth.ActivityInfo[ configType ].StartTime = 0 --迷宫活动的开始时间
ActivityLabyrinth.ActivityInfo[ configType ].EndTime = 0 --迷宫活动的结束时间
configType = skynet.server.gameConfig:GetConfigType( "A" , 1 )
ActivityLabyrinth.ActivityInfo[ configType ] = {}
ActivityLabyrinth.ActivityInfo[ configType ].ActivityId = 0 --该活动在配置中的id
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinPrice = 0 --蜗壳币购买机会价格
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinSkip = 0 --跳过惩罚的蜗壳币
ActivityLabyrinth.ActivityInfo[ configType ].StartTime = 0 --迷宫活动的开始时间
ActivityLabyrinth.ActivityInfo[ configType ].EndTime = 0 --迷宫活动的结束时间
configType = skynet.server.gameConfig:GetConfigType( "B" , 1 )
ActivityLabyrinth.ActivityInfo[ configType ] = {}
ActivityLabyrinth.ActivityInfo[ configType ].ActivityId = 0 --该活动在配置中的id
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinPrice = 0 --蜗壳币购买机会价格
ActivityLabyrinth.ActivityInfo[ configType ].VoluteCoinSkip = 0 --跳过惩罚的蜗壳币
ActivityLabyrinth.ActivityInfo[ configType ].StartTime = 0 --迷宫活动的开始时间
ActivityLabyrinth.ActivityInfo[ configType ].EndTime = 0 --迷宫活动的结束时间
function ActivityLabyrinth:Init()
end
--设置活动信息
function ActivityLabyrinth:SetLabyrinthInfo( player , keyName , keyValue )
local configType = player.basicInfo.configType
self.ActivityInfo[ configType ][ keyName ] = tonumber(keyValue)
end
--获取活动信息
function ActivityLabyrinth:GetLabyrinthInfo( player , keyName )
local configType = player.basicInfo.configType
return self.ActivityInfo[ configType ][ keyName ]
end
--玩家礼包数据初始化
function ActivityLabyrinth:InitData( player , activityType )
--迷宫数据
local activityId,startTime,endTime = skynet.server.activity:GetActivityInfo( player , activityType )
if activityId > 0 then
self:SetLabyrinthInfo( player , "ActivityId" , activityId) --获取满足开放时间的迷宫id
self:SetLabyrinthInfo( player , "StartTime" , startTime) --迷宫开始时间
self:SetLabyrinthInfo( player , "EndTime" , endTime) --迷宫结束时间
end
--判断一下是否需要初始化玩家数据
if player.gameData.activity[ activityType ] == nil or activityId == 0 then
--玩家迷宫活动相关数据
player.gameData.activity[ activityType ] = {}
end
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg( player , "Activity")
local level = 0
for k , v in pairs(cfgActivity) do
if v.activityType == dataType.ActivityType_Labyrinth then --活动迷宫
level = v.level
break
end
end
if activityId > 0 and player.gameData.level >= level and next(player.gameData.activity[ activityType ]) == nil
and (player.gameData.activity[ activityType ].activityId == nil or player.gameData.activity[ activityType ].activityId ~= activityId) then
--玩家对应配置
local cfgMazeTreasure = skynet.server.gameConfig:GetPlayerAllCfg( player , "MazeTreasure")
local cfgMazeMap = skynet.server.gameConfig:GetPlayerAllCfg( player , "MazeMap")
local MazeTreasure = cfgMazeTreasure[ activityId ] --迷宫活动相关数据
self:SetLabyrinthInfo( player , "VoluteCoinPrice" , MazeTreasure.voluteCoinPrice ) --蜗壳币购买机会价格
for k , v in pairs(cfgMazeMap) do
if v.actId == activityId then
self:SetLabyrinthInfo( player , "VoluteCoinSkip" , v.voluteCoinSkip ) --跳过惩罚所需蜗壳币
break
end
end
player.gameData.activity[ activityType ].activityId = activityId
player.gameData.activity[ activityType ].labyrinthInfos = {} --玩家迷宫的相关信息
player.gameData.activity[ activityType ].compassCount = MazeTreasure.freeChance --玩家拥有的指南针
player.gameData.activity[ activityType ].nowLabyrinthData = {} --本次游玩迷宫的相关信息
player.gameData.activity[ activityType ].rewardInfos = {} --玩家迷宫的累计奖励信息
--玩家迷宫数据赋值
for i=1,#MazeTreasure.mazeMapId,1 do
player.gameData.activity[ activityType ].labyrinthInfos[ i ] = {}
player.gameData.activity[ activityType ].labyrinthInfos[ i ].labyrinthLevel = i --当前迷宫等级
player.gameData.activity[ activityType ].labyrinthInfos[ i ].status = 1 --当前迷宫状态 1-未解锁 2-已解锁
player.gameData.activity[ activityType ].labyrinthInfos[ i ].finishCount = 0 --当前迷宫的完成次数
end
local count = 1
for k ,v in pairs(MazeTreasure.accumulateReward) do
local rewardInfo = skynet.server.common:Split( v ,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
player.gameData.activity[ activityType ].rewardInfos[count] = {}
player.gameData.activity[ activityType ].rewardInfos[count].id = count
player.gameData.activity[ activityType ].rewardInfos[count].status = 0 --0 不可领取 1 可以领取 2 已经领取
player.gameData.activity[ activityType ].rewardInfos[count].needCount = rewardInfo[1]
player.gameData.activity[ activityType ].rewardInfos[count].rewardId = rewardInfo[2]
count = count + 1
end
--第一个难度默认解锁
player.gameData.activity[ activityType ].labyrinthInfos[ 1 ].status = 2 --当前迷宫状态 1-未解锁 2-已解锁
--开始走迷宫的数据
player.gameData.activity[ activityType ].nowLabyrinthData.level = 0 --本次游玩的迷宫等级
player.gameData.activity[ activityType ].nowLabyrinthData.labyrinthBags = {} --本次游玩奖励背包
player.gameData.activity[ activityType ].nowLabyrinthData.havePunish = false --本次游玩是否还有惩罚
player.gameData.activity[ activityType ].nowLabyrinthData.rewardIds = {} --本次游玩中宝箱的奖励id集合
end
end
--每次登录需要进行修改的数据
function ActivityLabyrinth:LoginInitData( player )
--重置迷宫红点
skynet.server.msgTips:Reset(player , 76)
skynet.server.msgTips:Reset(player , 77)
--检查应该初始还是结束活动
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg( player , "Activity")
local level = 0
for k , v in pairs(cfgActivity) do
if v.activityType == dataType.ActivityType_Labyrinth then --活动迷宫
level = v.level
break
end
end
if self:GetLabyrinthInfo( player , "ActivityId" ) == 0 and player.gameData.level >= level then
self:InitData(player , self.ActivityType)
else
--判断当前时间是否应该结束迷宫活动
if skynet.GetTime() > self:GetLabyrinthInfo( player , "EndTime" ) then
self:SetLabyrinthInfo( player , "ActivityId" , 0) --获取满足开放时间的迷宫id
self:SetLabyrinthInfo( player , "StartTime" , 0) --迷宫开始时间
self:SetLabyrinthInfo( player , "EndTime" , 0) --迷宫结束时间
--初始玩家数据
player.gameData.activity[ self.ActivityType ] = {}
end
end
--红点系统
if player.gameData.activity[ self.ActivityType ] and next(player.gameData.activity[ self.ActivityType ]) ~= nil then
--有指南针可以使用 添加对应红点
if player.gameData.activity[ self.ActivityType ].compassCount > 0 then
skynet.server.msgTips:AddNoNotice(player , 77)
end
--有累计奖励可以使用 添加对应红点
for k , v in pairs(player.gameData.activity[ self.ActivityType ].rewardInfos) do
if v.status == 1 then
skynet.server.msgTips:AddNoNotice(player , 76)
end
end
end
end
--迷途寻宝 展示
function ActivityLabyrinth:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthShow", c2sData.data ))
local data = {}
--判断一下是否需要初始化玩家数据
if player.gameData.activity[ self.ActivityType] == nil or next(player.gameData.activity[ self.ActivityType]) == nil then
self:InitData(player , self.ActivityType)
end
--重置一下游玩数据
if next(player.gameData.activity[ self.ActivityType ]) ~= nil then
player.gameData.activity[ self.ActivityType ].nowLabyrinthData = {}
data.compassCount = player.gameData.activity[ self.ActivityType ].compassCount
data.labyrinthInfo = player.gameData.activity[ self.ActivityType ].labyrinthInfos
data.rewardInfos = player.gameData.activity[ self.ActivityType ].rewardInfos
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthShow")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthShow", data))
end
--迷途寻宝 购买指南针
function ActivityLabyrinth:BuyCompass( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthBuyCompass", c2sData.data ))
local data = {}
--判断是否需要添加红点
local canAddRedDot = false
if player.gameData.activity[ self.ActivityType ].compassCount == 0 then
canAddRedDot = true
end
--消耗玩家蜗壳币
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_87")
local isSuc = player:MoneyChange(dataType.GoodsType_Volute , - self:GetLabyrinthInfo( player , "VoluteCoinPrice" ) , eventId)
if false == isSuc then
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
else
--购买成功 增加指南针
player.gameData.activity[ self.ActivityType ].compassCount = player.gameData.activity[ self.ActivityType ].compassCount + 1
--红点
if canAddRedDot then
skynet.server.msgTips:Add(player , 77)
end
end
data.compassCount = player.gameData.activity[ self.ActivityType ].compassCount
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthBuyCompass")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthBuyCompass", data))
end
--迷途寻宝 开始走迷宫
function ActivityLabyrinth:Start( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthStart", c2sData.data ))
local labyrinthLevel = c2sData.data.labyrinthLevel --迷宫等级
local data = {}
local cfgMazeMap = skynet.server.gameConfig:GetPlayerAllCfg( player , "MazeMap")
--判断该玩家迷宫等级是否解锁
if 2 == player.gameData.activity[ self.ActivityType ].labyrinthInfos[ labyrinthLevel ].status then
--给玩家当前游玩数据进行赋值
local playerData = player.gameData.activity[ self.ActivityType ].nowLabyrinthData
if player.gameData.activity[ self.ActivityType ].compassCount > 0 then
--扣除玩家的指南针
player.gameData.activity[ self.ActivityType ].compassCount = player.gameData.activity[ self.ActivityType ].compassCount - 1
if player.gameData.activity[ self.ActivityType ].compassCount == 0 then
skynet.server.msgTips:Reduce(player , 77)
end
playerData.level = labyrinthLevel --本次游玩的迷宫等级
playerData.labyrinthBags = {} --本次游玩奖励背包
playerData.rewardIds = {} --本次游玩奖励id
for k ,v in pairs(cfgMazeMap) do
if v.actId == self:GetLabyrinthInfo( player , "ActivityId" ) and v.difficultyOrder == labyrinthLevel then
for k1 ,v1 in pairs(v.treasureReward) do
table.insert(playerData.rewardIds , v1) --本次游玩奖励背包
end
break
end
end
else
s2cData.code = errorInfo.ErrorCode.NoCompassCount
end
--返回玩家数据
data.labyrinthBags = playerData.labyrinthBags
data.compassCount = player.gameData.activity[ self.ActivityType ].compassCount
else
s2cData.code = errorInfo.ErrorCode.NoMazeGameLevel
end
--设置购买步数
player.gameData.activity[ self.ActivityType ].buyStepCount=0
player.gameData.activity[ self.ActivityType ].isAdBuy=false
local playerData =player.gameData.activity[ self.ActivityType ]
data.conBuyStepCount=(playerData.buyStepCount and playerData.buyStepCount >= 4) and 0 or 4 - playerData.buyStepCount
data.isAdBuy=playerData.isAdBuy and playerData.isAdBuy or false
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthStart")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthStart", data))
end
--迷途寻宝 获取宝箱
function ActivityLabyrinth:GetChest( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthGetChest", c2sData.data ))
local chestId = c2sData.data.chestId --宝箱id
local data = {}
local playerData = player.gameData.activity[ self.ActivityType ].nowLabyrinthData
--随机该宝箱是奖励还是惩罚
local rand = math.random(1,5)
data.chestType = self.ChestType_award
local rewardId = 0
--奖励从奖励池中随机
if #playerData.rewardIds > 0 then
local count = math.random(1,#playerData.rewardIds)
rewardId = playerData.rewardIds[count]
-- --将对应奖励移除奖励池
-- table.remove(playerData.rewardIds , count)
end
if rewardId > 0 then
--将对应奖励存入奖励背包中
local award = skynet.server.playerLand:GetRewardInfo(player , rewardId)
for k ,v in pairs(award) do
table.insert(playerData.labyrinthBags , v)
end
data.rewardId = rewardId
end
data.labyrinthBags = playerData.labyrinthBags
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthGetChest")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthGetChest", data))
end
--迷途寻宝 完成迷宫
function ActivityLabyrinth:Finish( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthFinish", c2sData.data ))
local isFinish = c2sData.data.isFinish --是否完成迷宫
local data = {}
local cfgMazeMap = skynet.server.gameConfig:GetPlayerAllCfg( player , "MazeMap")
local playerData = player.gameData.activity[ self.ActivityType ]
local labyrinthLevel = playerData.nowLabyrinthData.level
--判断玩家是否成功
if isFinish then
playerData.labyrinthInfos[ labyrinthLevel ].finishCount = playerData.labyrinthInfos[ labyrinthLevel ].finishCount + 1
--代表是第一次完成
if 1 == playerData.labyrinthInfos[ labyrinthLevel ].finishCount then
--找到对应奖励id
local rewardId = 0
for k ,v in pairs(cfgMazeMap) do
if v.actId == self:GetLabyrinthInfo( player , "ActivityId" ) and v.difficultyOrder == labyrinthLevel then
rewardId = v.finishReward
break
end
end
if rewardId > 0 then
--发放对应奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_89")
player:GiveReward(rewardId , eventId , 1)
data.firstRewardId = rewardId
--将下一个等级的迷宫状态修改为已解锁
if labyrinthLevel < #playerData.labyrinthInfos then
playerData.labyrinthInfos[ labyrinthLevel + 1 ].status = 2
end
end
end
--发放背包中的奖励
for k ,v in pairs(playerData.nowLabyrinthData.labyrinthBags) do
if v.type < dataType.GoodsType_Furniture then
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_89")
player:MoneyChange(v.type , v.count , eventId)
else
skynet.server.bag:AddGoods(player , v.type , v.id , v.count)
end
end
--判断完成次数是否达到领取累积奖励的次数
local allFinishCount = 0 --存储玩家所有迷宫等级的总完成次数
for k , v in pairs(playerData.labyrinthInfos) do
allFinishCount = allFinishCount + v.finishCount
end
for k ,v in pairs(playerData.rewardInfos) do
if v.needCount <= allFinishCount and 0 == v.status then
v.status = 1
--对应红点
skynet.server.msgTips:Add(player , 76)
break
end
end
else
--失败只发放迷宫背包中的奖励
for k ,v in pairs(playerData.nowLabyrinthData.labyrinthBags) do
if v.type < dataType.GoodsType_Furniture then
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_89")
player:MoneyChange(v.type , v.count , eventId)
else
skynet.server.bag:AddGoods(player , v.type , v.id , v.count)
end
end
end
--返回玩家数据
data.compassCount = playerData.compassCount
data.labyrinthInfo = playerData.labyrinthInfos
data.labyrinthBags = playerData.nowLabyrinthData.labyrinthBags
data.rewardInfos = playerData.rewardInfos
--将本次游玩信息初始化
player.gameData.activity[ self.ActivityType ].nowLabyrinthData = {}
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthFinish")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthFinish", data))
end
--迷途寻宝 领取累计奖励
function ActivityLabyrinth:SumGet( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthSumGet", c2sData.data ))
local id = c2sData.data.id --累签id
local data = {}
for k ,v in pairs(player.gameData.activity[ self.ActivityType ].rewardInfos) do
if v.id == id and v.status == 1 then
--发放对应奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_90")
player:GiveReward(v.rewardId , eventId , 1)
v.status = 2
data.rewardId = v.rewardId
skynet.server.msgTips:Reduce(player , 76)
break
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthSumGet")
s2cData.data = assert(pb.encode("S2CActivityLabyrinthSumGet", data))
end
--购买步数
function ActivityLabyrinth:BuyStep( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityLabyrinthBuyStep", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityLabyrinthBuyStep")
local type = c2sData.data.type --购买类型 1:广告 2:金币
local data = {}
local playerData = player.gameData.activity[ self.ActivityType ]
local labyrinthLevel = playerData.nowLabyrinthData.level
--是否可以购买-购买次数 4次
if playerData.buyStepCount and playerData.buyStepCount>=4 then
log.info("迷宫活动 购买步数不足:",playerData.buyStepCount)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local cfgMazeMapList = skynet.server.gameConfig:GetPlayerAllCfg( player , "MazeMap")
local cfgMazeMap={}
for k ,v in pairs(cfgMazeMapList) do
if v.actId == self:GetLabyrinthInfo( player , "ActivityId" ) and v.difficultyOrder == labyrinthLevel then
cfgMazeMap = v
break
end
end
--处理消耗资源
if type == 1 then--广告
--广告,不消耗资源
if playerData.isAdBuy then
log.info("迷宫活动 购买步数 广告不足",player.buyStepCount)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
playerData.isAdBuy = true
elseif type == 2 then
--奖励索引
local rewardIndex= not playerData.buyStepCount and 1 or playerData.buyStepCount+1
if playerData.isAdBuy then
rewardIndex=rewardIndex-1
end
--是否存在奖励,不存在奖励 次数已用完
if not cfgMazeMap.buyStepCoin[rewardIndex] then
log.info("迷宫活动 购买步数 广告不足",player.buyStepCount)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_142")
--消耗金币
if not player:MoneyChange(dataType.MoneyType_Coin , -cfgMazeMap.buyStepCoin[rewardIndex] , eventId) then
log.info("迷宫活动 购买步数 金币不足")
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
return
end
else
log.info("迷宫活动 购买步数类型错误:",type)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
playerData.buyStepCount= not playerData.buyStepCount and 1 or playerData.buyStepCount+1
data.conBuyStepCount=playerData.buyStepCount >= 4 and 0 or 4 - playerData.buyStepCount
data.isAdBuy = playerData.isAdBuy and true or false
s2cData.data = assert(pb.encode("S2CActivityLabyrinthBuyStep", data))
end
skynet.server.activityLabyrinth = ActivityLabyrinth
return ActivityLabyrinth