AdvTask.lua 4.78 KB
local AdvTask = {}


function AdvTask.bind(Adv)
	Adv.TaskType = {
		Arrive 		= 1, --到达N层
		Kill		= 2, --消灭指定怪物N个
		Item		= 3, --获得指定道具N个
		Choose		= 4, --完成指定抉择点N次
		Shop		= 5, --和指定商人交易N次
		Build		= 6, --和指定建筑交互N次
		KillAll		= 7, --消灭本层所有怪物
	}

	-- 检查任务状态 在新领取任务的时候回进行检查
	local function checkTaskStatus(self, taskData, status, count, cond)
		count = count or 0
		if status == -1 or not taskData then
			return
		end
		local function checkCondValue()
			if taskData.value2 ~= "" then
				local conds = taskData.value2:toArray(true, "=")
				for _, one in pairs(conds) do
					if one == cond then
						return true
					end
				end
			end
			return true
		end	

		local checkTaskFunc = {}
		checkTaskFunc[Adv.TaskType.Arrive] = function()
			if self.level > status then
				if self.level >= taskData.value1 then
					return -1
				else
					return self.level
				end
			end
		end
		checkTaskFunc[Adv.TaskType.KillAll] = function()
			if  #self.battle.player:getTeam(2) == 0 then
				return -1
			end
		end

		if checkTaskFunc[taskData.condition] then
			status = checkTaskFunc[taskData.condition]()
		else
			if count == 0 or not checkCondValue() then return end --没有变化
			status = status + count
			if status >= taskData.value1 then
				status = -1
			end
		end
		return status
	end 

	function Adv:initLayerTask()
		self.advTask = {}
		if not next(self.advMTask) then
			self.advMTask = {
				id = 1,
				status = 0,
				lock = 1,
			}
			self.advTaskChange = true
		end
		self.advMTask.id = self.advMTask.id or 1
		local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id]
		if mainTaskData and self.advMTask.lock then 
			if math.floor(self.chapterId / 100) % 100 == mainTaskData.chapter and self.level >= mainTaskData.level then --到达指定关卡解锁当前任务
				self.advMTask.lock = nil
				self.advMTask.status = 0
				local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, 0)
				if ts then
					self.advMTask.status = ts
				end
				self.advTaskChange = true
			end
		end
	end

	function Adv:checkTask(taskType, count, cond)
		local chapter = math.floor(self.chapterId / 100) % 100
		for taskId, status in pairs(self.advTask) do
			local taskData = csvdb["event_questCsv"][taskId]
			if taskData and taskData.levelchapter == chapter and taskType == taskData.condition then
				local ts = checkTaskStatus(self, taskData, status, count, cond)
				if ts then
					self.advTask[taskId] = ts
					self.advTaskChange = true
				end
			end
		end

		local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id]
		if not self.advMTask.lock and mainTaskData and mainTaskData.chapter == chapter and taskType == mainTaskData.condition then
			local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, count, cond)
			if ts then
				self.advMTask.status = ts
				self.advTaskChange = true
			end
		end
	end

	-- 点击任务地块领取任务
	function Adv:addTask(taskId)
		local taskData = csvdb["event_questCsv"][taskId]
		if taskData then
			self.advTask[taskId] = 0
			local ts = checkTaskStatus(self, taskData, self.advTask[taskId], 0)
			if ts then
				self.advTask[taskId] = ts
			end

			self.advTaskChange = true
			return true
		end
	end

	--完成层任务
	function Adv:finishTask(taskId)
		local ok, reward
		if self.advTask[taskId] and self.advTask[taskId] == -1 then
			local taskData = csvdb["event_questCsv"][taskId]
			if not taskData then return end
			if taskData.reward == 1 then
				reward = self.owner:award(taskData.rewardValue)
			end
			self.advTask[taskId] = nil
			self.owner:updateProperty({field = "advTask", value = self.advTask})
			ok = true
		end
		return ok, reward
	end

	-- 完成主线任务
	function Adv:finishMTask()
		local ok, reward
		if self.advMTask.status == -1 then  --已完成带领取
			local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id]
			if not mainTaskData then return end
			if mainTaskData.reward == 1 then
				reward = self.owner:award(mainTaskData.rewardValue)
			end
			self.advMTask.id = self.advMTask.id + 1
			self.advMTask.status = 0
			local nextTaskData = csvdb["adv_questCsv"][self.advMTask.id]
			if not nextTaskData or math.floor(self.chapterId / 100) % 100 ~= nextTaskData.chapter or self.level < nextTaskData.level then
				self.advMTask.lock = true
			else
				local ts = checkTaskStatus(self, nextTaskData, self.advMTask.status, 0)
				if ts then
					self.advMTask.status = ts
				end
			end

			self.owner:updateProperty({field = "advMTask", value = self.advMTask})
			ok = true
		end
		return ok, reward
	end

	function Adv:updateTask(notNotify)
		if self.advTaskChange then
			self.owner:updateProperties({advTask = self.advTask, advMTask = self.advMTask}, notNotify)
		end
		self.advTaskChange = false
	end
end


return AdvTask