ActivityAction.lua 6.37 KB
local ipairs = ipairs
local table = table
local math = math
local string = string
local redisproxy = redisproxy
local MsgPack = MsgPack
local string_format = string.format
local tonumber = tonumber
local table_insert = table.insert
local table_unpack = table.unpack
local table_find = table.find
local table_nums = table.nums
local math_random = math.randomInt


local _M = {}


function _M.sudokuRpc(agent, data)
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id

	local sudoku = role:getProperty("sudoku")
	local phase = sudoku[-1] or 1
	local curData = (csvdb["guide_sudokuCsv"][phase] or {})[id]
	if phase == -1 or not curData then return 1 end

	sudoku.task = sudoku.task or {}
	sudoku.task[phase] = sudoku.task[phase] or {}

	if (sudoku.task[phase][id] or 0) < curData.con1 then return 2 end

	sudoku.task[phase][id] = -1
	local task, tchange = role:award(curData.reward, {log = {desc = "sudoku", int1 = id, int2 = phase}}) -- 任务奖励

	local reward, rchange = {}
	local rId = {}
	for pid, pdata in pairs(csvdb["guide_sudoku_rewardCsv"][phase] or {}) do
		local pos = pdata.pos:toArray(true, "=")
		local ok, is = true, false
		for _, one in pairs(pos) do
			if one == id then
				is = true
			end
			if sudoku.task[phase][one] ~= -1 then
				ok = false
				break
			end
		end

		if ok and is then
			for itemId, count in pairs(pdata.reward:toNumMap()) do
				reward[itemId] = (reward[itemId] or 0) + count
			end
			table.insert(rId, pid)
		end
	end

	if not next(reward) then
		reward = nil
	else
		reward, rchange = role:award(reward, {log = {desc = "sudokuR", int1 = id, int2 = phase}})
	end

	role:updateProperty({field = "sudoku", value = sudoku})

	role:log("activity", {
		activity_id = id, -- 活动ID(或活动指定任务的ID)
		activity_type = 0, -- 活动类型,见活动类型枚举表
		activity_reward = reward or {}, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
	})
	role:mylog("act_action", {desc = "sudoku", int1 = id, int2 = phase})

	SendPacket(actionCodes.Activity_sudokuRpc, MsgPack.pack({task = role:packReward(task, tchange), reward = role:packReward(reward, rchange), rId = rId}))
	return true
end

function _M.sudokuRewardRpc(agent, data)
	local role = agent.role


	local sudoku = role:getProperty("sudoku")
	local phase = sudoku[-1] or 1

	local curData = csvdb["guide_sudokuCsv"][phase]
	if not curData then return end
	if not globalCsv.guide_sudoku_reward[phase] then return end

	local curTask = (sudoku.task or {})[phase] or {}

	for id, _ in pairs(curData) do
		if curTask[id] ~= -1 then
			return
		end
	end

	local reward, change = role:award(globalCsv.guide_sudoku_reward[phase], {log = {desc = "sudokuRP", int1 = phase}})

	sudoku[-1] = phase + 1
	sudoku.task[phase] = nil
	if not csvdb["guide_sudokuCsv"][sudoku[-1]] then
		sudoku[-1] = -1
		sudoku.task = nil
	end
	role:updateProperty({field = "sudoku", value = sudoku})

	role:log("activity", {
		activity_id = 10000 + phase, -- 活动ID(或活动指定任务的ID)
		activity_type = 0, -- 活动类型,见活动类型枚举表
		activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
	})

	SendPacket(actionCodes.Activity_sudokuRewardRpc, MsgPack.pack(role:packReward(reward, change)))
	return true
end


function _M.signRpc(agent, data)
	local role = agent.role

	local serverT = skynet.timex()
	local tm = os.date("*t", serverT)

	local curDay = tm.day
	
	local yearMonth = tm.year * 100 + tm.month
	local monthData = csvdb["daily_signInCsv"][yearMonth]
	if not monthData or not monthData[curDay] then
		return 1
	end

	local signs = role:getProperty("sign")
	if signs[curDay] == yearMonth then  -- 未重置的还可以签到正常(本月已经签到)
		return 2
	end
	signs[curDay] = yearMonth

	local reward, change = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}})
	role:changeUpdates({{type = "sign", field = curDay, value = yearMonth}})

	SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(role:packReward(reward, change)))
	return true
end


function _M.actSignRpc(agent, data)
	local role = agent.role
	if not role.activity:isOpen("Sign") then return 1 end

	local curData = role.activity:getActData("Sign")
	local reward, change = {}
	for day, csvData in ipairs(csvdb["new_signInCsv"]) do
		if day <= (curData[0] or 0) then
			if not curData[day] then
				curData[day] = -1
				-- 奖励
				for itemId, count in pairs(csvData.reward:toNumMap()) do
					reward[itemId] = (reward[itemId] or 0) + count
				end
			end
		else
			break
		end
	end
	if next(reward) then
		role.activity:updateActData("Sign", curData)
		reward, change = role:award(reward, {log = {desc = "actSign"}})
	end

	role:log("activity", {
		activity_id = curData[0], -- 活动ID(或活动指定任务的ID)
		activity_type = role.activity.ActivityType.Sign, -- 活动类型,见活动类型枚举表
		activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
	})

	SendPacket(actionCodes.Activity_actSignRpc, MsgPack.pack(role:packReward(reward, change)))
	return true
end


function _M.actPaySignRpc(agent, data)
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local actGoodsFlag = role.storeData:getProperty("actGoodsFlag")
	local index = GetActGoodsIndex("paySignIn")
	local flag = actGoodsFlag[index] or 0
	if flag == 0 then return 1 end

	if not role.activity:isOpen("PaySignIn") then return 2 end

	local diffDay = diffFromOpen() + 1

	local curData = role.activity:getActData("PaySignIn")
	local reward, change = {}
	for day, csvData in ipairs(csvdb["pay_signInCsv"]) do
		if day <= diffDay then
			if not curData[day] then
				curData[day] = 1
				-- 奖励
				for itemId, count in pairs(csvData.reward:toNumMap()) do
					reward[itemId] = (reward[itemId] or 0) + count
				end
			end
		else
			break
		end
	end
	if next(reward) then
		role.activity:updateActData("PaySignIn", curData)
		reward, change = role:award(reward, {log = {desc = "actPaySign"}})
	end

	role:log("activity", {
		activity_id = curData[0], -- 活动ID(或活动指定任务的ID)
		activity_type = role.activity.ActivityType.PaySignIn, -- 活动类型,见活动类型枚举表
		activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
	})

	SendPacket(actionCodes.Activity_actPaySignRpc, MsgPack.pack(role:packReward(reward, change)))
	return true
end

return _M