ActivityAction.lua 4.07 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 = role:award(curData.reward, {log = {desc = "sudoku", int1 = id, int2 = phase}}) -- 任务奖励

	local reward = {}
	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 = role:award(reward, {log = {desc = "sudokuR", int1 = id, int2 = phase}})
	end

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

	role:log("act_action", {desc = "sudoku", int1 = id, int2 = phase})

	SendPacket(actionCodes.Activity_sudokuRpc, MsgPack.pack({task = task, reward = reward, 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 = 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})

	SendPacket(actionCodes.Activity_sudokuRewardRpc, MsgPack.pack(reward))
	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 = 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(reward))
	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 = {}
	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 = role:award(reward, {log = {desc = "actSign"}})
	end
	SendPacket(actionCodes.Activity_actSignRpc, MsgPack.pack(reward))
	return true
end



return _M