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

990 lines
31 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 dataType = require "DataType"
local ActivityDailyRiddle = oo.class()
ActivityDailyRiddle.ActivityType = dataType.ActivityType_DailyRiddle
--构造函数
function ActivityDailyRiddle:Init()
end
--获取默认题目
function ActivityDailyRiddle:GetDefaultRiddle(player,riddleId)
local today= self:GetTodayOpenNum(player)
--默认题目
local data ={riddleId=riddleId,state= riddleId == today and 1 or 0,answerTime=0,buyTip = false,buyAnswer=false}
if riddleId < today then
data.state = 2
end
return data
end
-- 每次登录需要进行修改的数据
function ActivityDailyRiddle:LoginInitData(player)
--功能未开启
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityDailyRiddle ) then
log.debug("每日灯谜未开启-等级不足")
return
end
--结算
self:ActivitySettle(player)
--活动是否开启
if not self:CheckDataAndGetActivity(player) then
log.debug("每日灯谜未开启")
return
end
-- 处理红点
skynet.server.msgTips:Reset(player, 119)
skynet.server.msgTips:Reset(player, 120)
log.debug("每日灯谜活动进行中")
end
--初始玩家数据,返回活动信息,
function ActivityDailyRiddle:CheckDataAndGetActivity(player)
--默认空活动
local cfgRiddle = nil
if player==nil then
log.debug("每日灯谜未开启")
return cfgRiddle
end
--判断等级是否开启
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityDailyRiddle) then
log.debug("每日灯谜等级不足")
return cfgRiddle
end
--获取开启的活动
local activityId,_, _, _ = activity:GetActivityInfo(player, ActivityDailyRiddle.ActivityType)
--没有开启的活动
if activityId == 0 then
return cfgRiddle
end
--初始化
if player.gameData.DailyRiddleMap==nil then
player.gameData.DailyRiddleMap={}
end
--获取活动配置
local cfgRiddle=self:GetRiddleConfig(player,activityId)
--未获取到有效的活动
if cfgRiddle == nil then
log.debug("每日灯谜未开启-未获取到有效的活动2")
return cfgRiddle
end
--如果玩家已经存在活动不需要检查
if player.gameData.DailyRiddleMap[activityId] then
--是否跨天
if os.date("%Y-%m-%d",player.gameData.DailyRiddleMap[activityId].LoginDate) ~= os.date("%Y-%m-%d",skynet.GetTime()) then
player.gameData.DailyRiddleMap[activityId].adSkipCount=0
player.gameData.DailyRiddleMap[activityId].adAnswerCount=0
player.gameData.DailyRiddleMap[activityId].LoginDate=skynet.GetTime()
local day=self:GetTodayOpenNum(player)
for _, riddleInfo in ipairs(player.gameData.DailyRiddleMap[activityId].riddleInfoList) do
--过期的题目,没有购买,状态不是已完成的
if riddleInfo.riddleId<day and not riddleInfo.buyAnswer and riddleInfo.state == 1 then
riddleInfo.state = 2
end
end
end
--删除过期活动,减少数据产生
local removeKeyList = {}
for exceedActivityId, value in pairs(player.gameData.DailyRiddleMap) do
if exceedActivityId ~= activityId and value.id ~= cfgRiddle.id then
table.insert(removeKeyList, exceedActivityId)
end
end
if next(removeKeyList) then
for _, removeKey in ipairs(removeKeyList) do
player.gameData.DailyRiddleMap[removeKey]=nil
end
end
return cfgRiddle
end
--存在活动初始化玩家数据
local playerActivityDailyRiddle = {}
playerActivityDailyRiddle.id = cfgRiddle.id
--累计答题次数
playerActivityDailyRiddle.totalAnswerNum=0
--今日查看广告次数
playerActivityDailyRiddle.adSkipCount=0
--今日补答题广告次数
playerActivityDailyRiddle.adAnswerCount=0
--最近一次答题时间
playerActivityDailyRiddle.lastAnswerTime=0
--已答题的题目信息
playerActivityDailyRiddle.riddleInfoList = {}
--已领取的累计奖励信息
playerActivityDailyRiddle.rewardInfoList = {}
playerActivityDailyRiddle.LoginDate=skynet.GetTime()
--更新缓存
player.gameData.DailyRiddleMap[activityId] = playerActivityDailyRiddle
return cfgRiddle
end
--获取配置信息
function ActivityDailyRiddle:GetRiddleConfig(player,activityId)
local cfgRiddle=nil
--获取该活动的默认初始关卡
local cfgRiddles=skynet.server.gameConfig:GetPlayerAllCfg(player, "Riddle")
if cfgRiddles==nil then
log.debug("cfgRiddles is nil")
return cfgRiddle
end
for _, value in pairs(cfgRiddles) do
if value.id==activityId then
cfgRiddle=value
break
end
end
return cfgRiddle
end
--是否可以领取累计奖励
function ActivityDailyRiddle:isCanDraw( player)
--活动是否开启
local cfgDailyRiddle =self:CheckDataAndGetActivity(player)
if cfgDailyRiddle ==nil then
return false
end
--玩家每日灯谜信息
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgDailyRiddle.id]
for _, value in ipairs(cfgDailyRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
if playerDailyRiddle.totalAnswerNum >= rewardInfo[1] then
--是否领取
local ifDraw=false
for _, value in ipairs(playerDailyRiddle.rewardInfoList) do
if rewardInfo[1] == value then
ifDraw=true
break
end
end
--没有领取
if not ifDraw then
return true
end
end
end
return false
end
--获取当日是开启的多少天
function ActivityDailyRiddle:GetTodayOpenNum( player)
--获取开启的活动
local activityId, startTime, _, _ = activity:GetActivityInfo(player, ActivityDailyRiddle.ActivityType)
if activityId == 0 then
return 0
end
local startTimeDate = os.date("*t", startTime)
--由于活动开启时间是10点这里统计时间设置成0点
local startTimeTemp=os.time({ year = startTimeDate.year, month = startTimeDate.month, day=startTimeDate.day, hour=0, min=0, sec=0 })
--计算当前是哪天
local day =math.ceil((skynet.GetTime()-startTimeTemp)/dataType.OneDaySec)
--log.debug(string.format("获取每日灯谜开启天数 day:%d",day))
return day
end
--当日是否有灯谜可答
function ActivityDailyRiddle:isCanAnswer( player)
--活动是否开启
local cfgDailyRiddle =self:CheckDataAndGetActivity(player)
if cfgDailyRiddle ==nil then
return false
end
--玩家每日灯谜信息
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgDailyRiddle.id]
local openDay=self:GetTodayOpenNum(player)
for _, day in ipairs(cfgDailyRiddle.riddleId) do
--是否完成
local ifComplete=true
--是否存在
local ifExist=false
--如果是当日 可能为空数据
if day==openDay then
for _, playerData in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerData.riddleId then
ifExist = true
break
end
end
--当日未作答
if not ifExist then
return true
end
end
for _, playerData in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerData.riddleId
and (playerData.answerTime==0 or (playerData.answerTime+cfgDailyRiddle.answerCd ) <= skynet.GetTime())--未在cd中
and playerData.state == 1 then--可答题
ifComplete=false
break
end
end
if not ifComplete then
log.info("存在可答题的灯谜",ifComplete,ifExist)
return true
end
end
return false
end
--活动结束补发奖励
function ActivityDailyRiddle:ActivitySettle(player)
if player.gameData.DailyRiddleMap == nil or not next(player.gameData.DailyRiddleMap) then
return
end
local cfgActivitys = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
if cfgActivitys == nil then
return
end
--获取开启的活动
local openActivityId,_, _, _ = activity:GetActivityInfo(player, ActivityDailyRiddle.ActivityType)
--循环玩家活动数据
for activityId, dailyRiddle in pairs(player.gameData.DailyRiddleMap) do
--当前活动正在开启
if activityId == openActivityId or activityId == 0 then
goto continue
end
--获取配置
local cfgRiddle=self:GetRiddleConfig(player,activityId)
--配置不存在
if cfgRiddle== nil then
goto continue
end
if #cfgRiddle.limitReward == #dailyRiddle.rewardInfoList then
goto continue
end
--奖励列表
local award = {}
for _, value in ipairs(cfgRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
local rewardInfo1,rewardInfo2 = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
if dailyRiddle.totalAnswerNum >= rewardInfo1 then
--是否领取
local ifDraw=false
for _, value in ipairs(dailyRiddle.rewardInfoList) do
if value==rewardInfo1 then
ifDraw=true
break
end
end
if not ifDraw then
local reward = skynet.server.playerLand:GetRewardInfo(player , rewardInfo2)--对应的奖励信息
for _ ,v1 in pairs( reward ) do
table.insert(award , v1 )
end
table.insert(dailyRiddle.rewardInfoList,rewardInfo1)
end
end
end
--存在未领取的奖励
if next(award) then
skynet.server.mail:AddNewMail( player , skynet.server.mail.MailType_Award,"灯谜奖励补发", "本次灯谜活动已结束,小蜗们忘记领取的奖励已经通过邮件发放咯,请小蜗们及时领取!", award, true)
log.info(string.format("玩家 %d 每日灯谜奖励补发", player.userId ))
end
::continue::
end
end
--获取每日灯谜信息
function ActivityDailyRiddle:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleShow")
local data = {}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
data.curDay=self:GetTodayOpenNum(player)
data.totalAnswerNum=playerDailyRiddle.totalAnswerNum
data.adAnswerCount=playerDailyRiddle.adAnswerCount
data.adSkipCount=playerDailyRiddle.adSkipCount
data.riddleInfoList={}
--组装每日灯谜信息
for _, day in ipairs(cfgRiddle.riddleId) do
--默认未解锁
local dataInfo=self:GetDefaultRiddle(player,day)
--是否解锁
if day > data.curDay then
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
for playerDay, value in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerDay then
dataInfo.state=value.state
dataInfo.buyTip=value.buyTip
dataInfo.buyAnswer=value.buyAnswer
dataInfo.answerTime=value.answerTime
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
end
--不是今天的
if dataInfo.state == 0 then
dataInfo.state=2
end
table.insert(data.riddleInfoList,dataInfo)
::continue::
end
data.rewardInfoList={}
--组装累计奖励信息
for _, value in ipairs(cfgRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
--默认未解锁
local dataInfo={id = rewardInfo[1],status = 0,needCount=rewardInfo[1],rewardId=rewardInfo[2]}
--是否解锁
if playerDailyRiddle.totalAnswerNum < rewardInfo[1] then
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
for _, num in ipairs(playerDailyRiddle.rewardInfoList) do
if rewardInfo[1] == num then
dataInfo.status = 2
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
end
dataInfo.status = 1
table.insert(data.rewardInfoList,dataInfo)
::continue::
end
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleShow", data))
end
--购买提示
function ActivityDailyRiddle:BuyTip( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleBuyTip", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleBuyTip")
local riddleId =c2sData.data.riddleId
local data = {riddleId=riddleId}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
if playerDailyRiddle.riddleInfoList[riddleId] == nil then
playerDailyRiddle.riddleInfoList[riddleId]=self:GetDefaultRiddle(player,riddleId)
end
--是否已经购买
if playerDailyRiddle.riddleInfoList[riddleId].buyTip then
s2cData.code = errorInfo.ErrorCode.AlreadyBuyTip
return
end
--扣除奖励
local helpCoin=skynet.server.common:Split(cfgRiddle.helpCoin,"_" )
local type,num =tonumber(helpCoin[1]),tonumber(helpCoin[2])
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_139" )
if not player:MoneyChange( type,-num , eventId ) then
log.info(string.format("每日灯谜 购买提示 扣除物品失败 data:%s",cfgRiddle.helpCoin))
s2cData.code = errorInfo.ErrorCode.NotEnoughGoods
return
end
--修改数据
playerDailyRiddle.riddleInfoList[riddleId].buyTip = true
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleBuyTip", data))
end
--开始答题
function ActivityDailyRiddle:Start( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleStart", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleStart")
local riddleId =c2sData.data.riddleId
local answer =c2sData.data.answer
local answerType =c2sData.data.answerType
local data = {riddleId=riddleId}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取今日题目
local day = self:GetTodayOpenNum(player)
if riddleId > day then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
if playerDailyRiddle.riddleInfoList[riddleId] == nil then
playerDailyRiddle.riddleInfoList[riddleId]=self:GetDefaultRiddle(player,riddleId)
end
--是否已经购买
if playerDailyRiddle.riddleInfoList[riddleId].state ~=1 then-- 0:未解锁 1:可答题 2:补答题 3:已答对
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--判断CD
if playerDailyRiddle.riddleInfoList[riddleId].answerTime>skynet.GetTime() then
log.info(string.format("每日灯谜 开始答题 CD中 %d",playerDailyRiddle.riddleInfoList[riddleId].answerTime))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--答案错误
local cfgRiddleLevel=skynet.server.gameConfig:GetPlayerCurCfg(player, "RiddleLevel",riddleId)
if cfgRiddleLevel==nil then
log.info(string.format("每日灯谜 开始答题 未找到配置 %d",day))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--log.info(string.format("每日灯谜 开始答题 答题%s答案:%s",answer,cfgRiddleLevel.answer))
--判断答案
--回答错误
if answer ~= cfgRiddleLevel.answer then
playerDailyRiddle.riddleInfoList[riddleId].answerTime=skynet.GetTime()
else
--发奖
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_137")
player:GiveReward(cfgRiddleLevel.rewardId ,eventId,1)
playerDailyRiddle.riddleInfoList[riddleId].answerTime=0
playerDailyRiddle.riddleInfoList[riddleId].state = 3-- 0:未解锁 1:可答题 2:补答题 3:已答对
playerDailyRiddle.totalAnswerNum =playerDailyRiddle.totalAnswerNum + 1
end
if not self:isCanAnswer(player) then
skynet.server.msgTips:ReduceAll(player, 119)
end
if self:isCanDraw(player) then
skynet.server.msgTips:Add(player, 120)
end
data.curDay=day
data.totalAnswerNum=playerDailyRiddle.totalAnswerNum
data.riddleId=riddleId
data.isRight=answer == cfgRiddleLevel.answer
data.rewardId=cfgRiddleLevel.rewardId
data.riddleInfoList={}
--组装每日灯谜信息
for _, day in ipairs(cfgRiddle.riddleId) do
--默认未解锁
local dataInfo=self:GetDefaultRiddle(player,day)
--是否解锁
if day > data.curDay then
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
for playerDay, value in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerDay then
dataInfo.state=value.state
dataInfo.buyTip=value.buyTip
dataInfo.answerTime=value.answerTime
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
end
--不是今天的
if dataInfo.state == 0 then
dataInfo.state=2
end
table.insert(data.riddleInfoList,dataInfo)
::continue::
end
data.rewardInfoList={}
--组装累计奖励信息
for _, value in ipairs(cfgRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
--默认未解锁
local dataInfo={id = rewardInfo[1],status = 0,needCount=rewardInfo[1],rewardId=rewardInfo[2]}
--是否解锁
if playerDailyRiddle.totalAnswerNum < rewardInfo[1] then
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
for _, num in ipairs(playerDailyRiddle.rewardInfoList) do
if rewardInfo[1] == num then
dataInfo.status = 2
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
end
dataInfo.status = 1
table.insert(data.rewardInfoList,dataInfo)
::continue::
end
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleStart", data))
end
--领取累计奖励
function ActivityDailyRiddle:GetReward( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleGetReward", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleGetReward")
local totalNum =c2sData.data.num
local data = {}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
--判断进度
if playerDailyRiddle.totalAnswerNum < totalNum then
log.info(string.format("每日灯谜 领取奖励 未解锁 %d",totalNum))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
local ifExist =false
local rewardId =nil
--判断配置是否存在
for _, value in ipairs(cfgRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
if tonumber(rewardInfo[1]) == totalNum then
ifExist =true
rewardId=tonumber(rewardInfo[2])
break
end
end
if not ifExist then
log.info(string.format("每日灯谜 领取奖励 配置不存在 %d",totalNum))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--是否已经领取
for _, value in ipairs(playerDailyRiddle.rewardInfoList) do
if value == totalNum then
log.info(string.format("每日灯谜 领取奖励 已领取 %d",totalNum))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
end
--发奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_139")
player:GiveReward(rewardId ,eventId,1)
--添加领取内容
table.insert(playerDailyRiddle.rewardInfoList,totalNum)
--红点
if not self:isCanDraw(player) then
skynet.server.msgTips:ReduceAll(player, 120)
end
data.curDay=self:GetTodayOpenNum(player)
data.totalAnswerNum=playerDailyRiddle.totalAnswerNum
data.rewardId=rewardId
data.riddleInfoList={}
--组装每日灯谜信息
for _, day in ipairs(cfgRiddle.riddleId) do
--默认未解锁
local dataInfo=self:GetDefaultRiddle(player,day)
--是否解锁
if day > data.curDay then
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
for playerDay, value in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerDay then
dataInfo.state=value.state
dataInfo.buyTip=value.buyTip
dataInfo.answerTime=value.answerTime
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
end
--不是今天的
if dataInfo.state == 0 then
dataInfo.state=2
end
table.insert(data.riddleInfoList,dataInfo)
::continue::
end
data.rewardInfoList={}
--组装累计奖励信息
for _, value in ipairs(cfgRiddle.limitReward) do
local rewardInfo = skynet.server.common:Split(value,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
--默认未解锁
local dataInfo={id = rewardInfo[1],status = 0,needCount=rewardInfo[1],rewardId=rewardInfo[2]}
--是否解锁
if playerDailyRiddle.totalAnswerNum < rewardInfo[1] then
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
for _, num in ipairs(playerDailyRiddle.rewardInfoList) do
if rewardInfo[1] == num then
dataInfo.status = 2
table.insert(data.rewardInfoList,dataInfo)
goto continue
end
end
dataInfo.status = 1
table.insert(data.rewardInfoList,dataInfo)
::continue::
end
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleGetReward", data))
end
--跳过CD
function ActivityDailyRiddle:SkipCD( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleSkipCD", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleSkipCD")
local riddleId =c2sData.data.riddleId
local skipType =c2sData.data.skipType --跳过类型 1:广告 2:加速器 3:蜗壳币
local data = {}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
--判断是否存在CD,不在CD中
if playerDailyRiddle.riddleInfoList[riddleId] == nil
or playerDailyRiddle.riddleInfoList[riddleId].answerTime + cfgRiddle.answerCd < skynet.GetTime() then
log.info(string.format("每日灯谜 跳过CD 不存在/不在CD中 %d",riddleId))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取配置
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
if skipType ==1 then--广告
if playerDailyRiddle.adSkipCount >= cfgRiddle.limit then
log.info(string.format("每日灯谜 跳过CD 广告次数已用完 %d",riddleId))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
playerDailyRiddle.adSkipCount=playerDailyRiddle.adSkipCount+1
playerDailyRiddle.riddleInfoList[riddleId].answerTime=0
elseif skipType == 2 then--加速券
--指定加速券
local goodsId = 6
--是否正确
if skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop,goodsId) <= 0 then
s2cData.code = errorInfo.ErrorCode.NotEnoughGoods
return
end
--扣除资源
skynet.server.bag:RemoveGoods(player,dataType.GoodsType_Prop,goodsId,1)
--移除cd
playerDailyRiddle.riddleInfoList[riddleId].answerTime=playerDailyRiddle.riddleInfoList[riddleId].answerTime-(cfgSValue.speedCouponTime*60)
if playerDailyRiddle.riddleInfoList[riddleId].answerTime + cfgRiddle.answerCd < skynet.GetTime() then
playerDailyRiddle.riddleInfoList[riddleId].answerTime=0
end
else --蜗壳币
--剩余秒钟
local time = playerDailyRiddle.riddleInfoList[riddleId].answerTime+cfgRiddle.answerCd-skynet.GetTime()
if time<0 then
log.info(string.format("每日灯谜 跳过CD 秒数不足 %d",time))
return
end
--扣除奖励
local type,num =dataType.GoodsType_Volute,math.ceil(math.ceil(time/60)/cfgSValue.timeExchangeVoluteCoin[1])*cfgSValue.timeExchangeVoluteCoin[1]
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_139" )
if not player:MoneyChange( type,-num , eventId ) then
log.info(string.format("每日灯谜 跳过CD 蜗壳币不足 %d",num))
s2cData.code = errorInfo.ErrorCode.NotEnoughGoods
return
end
playerDailyRiddle.riddleInfoList[riddleId].answerTime=0
end
--红点
if not self:isCanAnswer(player) then
skynet.server.msgTips:Add(player, 119)
end
data.riddleInfoList={}
data.curDay=self:GetTodayOpenNum(player)
--组装每日灯谜信息
for _, day in ipairs(cfgRiddle.riddleId) do
--默认未解锁
local dataInfo=self:GetDefaultRiddle(player,day)
--是否解锁
if day > data.curDay then
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
for playerDay, value in pairs(playerDailyRiddle.riddleInfoList) do
if day == playerDay then
dataInfo.state=value.state
dataInfo.buyTip=value.buyTip
dataInfo.answerTime=value.answerTime
table.insert(data.riddleInfoList,dataInfo)
goto continue
end
end
--不是今天的,未初始化,直接就需要补卡
if dataInfo.state == 0 then
dataInfo.state=2
end
table.insert(data.riddleInfoList,dataInfo)
::continue::
end
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleSkipCD", data))
end
--购买补答题
function ActivityDailyRiddle:BuyAnswer( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityDailyRiddleBuyAnswer", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDailyRiddleBuyAnswer")
local riddleId =c2sData.data.riddleId
local answerType =c2sData.data.answerType --跳过类型 1:货币购买 2:广告购买
local data = {}
--检查并且获取活动信息
local cfgRiddle=self:CheckDataAndGetActivity(player)
if cfgRiddle == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local playerDailyRiddle=player.gameData.DailyRiddleMap[cfgRiddle.id]
--是否是当日题目
local todayRiddileId =self:GetTodayOpenNum(player)
if todayRiddileId <= riddleId then
log.info(string.format("每日灯谜 购买补答题 大于/等于当日题目 %d",riddleId))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
if playerDailyRiddle.riddleInfoList[riddleId] == nil then
playerDailyRiddle.riddleInfoList[riddleId]=self:GetDefaultRiddle(player,riddleId)
end
--判断是否是可答题
if playerDailyRiddle.riddleInfoList[riddleId].buyAnswer then--0:未解锁 1:可答题 2:补答题 3:已答对
log.info(string.format("每日灯谜 购买补答题 不可补答题 %d",riddleId))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
if answerType ==2 then--广告
if playerDailyRiddle.adAnswerCount >= cfgRiddle.limit then
log.info(string.format("每日灯谜 购买补答题 广告次数已用完 %d",riddleId))
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
playerDailyRiddle.adAnswerCount=playerDailyRiddle.adAnswerCount+1
else --蜗壳币
--资源是否足够
local answerCoin = skynet.server.common:Split(cfgRiddle.answerCoin,"_" )
local type,num = tonumber(answerCoin[1]),tonumber(answerCoin[2])
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_139" )
if not player:MoneyChange( type,-num , eventId ) then
s2cData.code = errorInfo.ErrorCode.NotEnoughGoods
return
end
end
playerDailyRiddle.riddleInfoList[riddleId].state=1
playerDailyRiddle.riddleInfoList[riddleId].buyAnswer=true
if self:isCanAnswer(player) then
skynet.server.msgTips:Add(player, 119)
end
data.riddleInfo=playerDailyRiddle.riddleInfoList[riddleId]
--返回信息
s2cData.data = assert(pb.encode("S2CActivityDailyRiddleBuyAnswer", data))
end
skynet.server.activityDailyRiddle = ActivityDailyRiddle
return ActivityDailyRiddle