From d3e9c1b8635ba867b19c5544112cdd0d8593ec54 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 24 Oct 2010 03:12:02 +0000
Subject: [PATCH] Leaving the level while an escort quest is going on will doom
 the escort

git-svn-id: http://svn.net-core.org/repos/t-engine4@1614 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Game.lua              |  2 ++
 game/modules/tome/class/Player.lua            | 10 ++++++++++
 game/modules/tome/data/quests/escort-duty.lua | 11 +++++++++++
 3 files changed, 23 insertions(+)

diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 7db83860a1..a149de4d7b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -352,6 +352,8 @@ function _M:changeLevel(lev, zone, keep_old_lev, force_down)
 		if nz then zone = nz end
 	end
 
+	if self.zone and self.level then self.player:onLeaveLevel(self.zone, self.level) end
+
 	local old_lev = (self.level and not zone) and self.level.level or -1000
 	if keep_old_lev then old_lev = self.level.level end
 	if zone then
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 1b16a19b8a..248857ad40 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -110,6 +110,16 @@ function _M:onEnterLevel(zone, level)
 	end
 end
 
+function _M:onLeaveLevel(zone, level)
+	-- Fail past escort quests
+	local eid = "escort-duty-"..zone.short_name.."-"..level.level
+	if self.quests and self.quests[eid] then
+		local q = self.quests[eid]
+		q.abandoned = true
+		self:setQuestStatus(eid, q.FAILED)
+	end
+end
+
 function _M:move(x, y, force)
 	local moved = mod.class.Actor.move(self, x, y, force)
 	if moved then
diff --git a/game/modules/tome/data/quests/escort-duty.lua b/game/modules/tome/data/quests/escort-duty.lua
index 6464504935..a88bd8a4ec 100644
--- a/game/modules/tome/data/quests/escort-duty.lua
+++ b/game/modules/tome/data/quests/escort-duty.lua
@@ -258,6 +258,17 @@ desc = function(self, who)
 	return table.concat(desc, "\n")
 end
 
+on_status_change = function(self, who, status, sub)
+	if status == self.FAILED then
+		for uid, e in pairs(game.level.entities) do
+			if e.quest_id and e.quest_id == self.id then
+				e:disappear()
+				e:removed()
+			end
+		end
+	end
+end
+
 local function getPortalSpot(npc, dist, min_dist)
 	local astar = Astar.new(game.level.map, npc)
 	local poss = {}
-- 
GitLab