diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 7db83860a1d43a8773f369ecf7b65a56c133b16e..a149de4d7b9c1ade0df252cb0cc4dd1f6df100e5 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 1b16a19b8ad7b84e074166ac5ea4cb404dacbe8e..248857ad406142d7c1a2e54b63b575dd9e3d4293 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 646450493573faea335730e2e624a857e315b4a4..a88bd8a4ece73e4aa2cb2a9f768d54e36cd6697f 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 = {}