HomeServer/Server/AllServer/GameServer/Activity/ActivityDailyRiddle.lua
2024-11-20 15:41:37 +08:00

990 lines
31 KiB
Lua
Raw 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 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