From 757267311746abd65b7a0c6bf4c377c417fdbc44 Mon Sep 17 00:00:00 2001 From: "p.kosyh" Date: Mon, 12 Jul 2010 07:50:13 +0000 Subject: [PATCH] goto fix --- stead/goto.lua | 56 +++++++++++++++++++++++++++++++------------------ stead/stead.lua | 6 ++++-- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/stead/goto.lua b/stead/goto.lua index 2bdd47f..e83338f 100644 --- a/stead/goto.lua +++ b/stead/goto.lua @@ -1,4 +1,4 @@ -go = function (self, where, back, forceenter) +go = function (self, where, back, noenter, noexit) local was = self.where; local need_scene = false; local ret @@ -29,7 +29,7 @@ go = function (self, where, back, forceenter) local v, r, jump; - if not isVroom(ref(where)) and not stead.in_exit_call then + if not isVroom(ref(where)) and not stead.in_exit_call and not noexit then stead.in_exit_call = true -- to break recurse v,r = call(ref(self.where), 'exit', ref(where)); stead.in_exit_call = nil @@ -49,18 +49,17 @@ go = function (self, where, back, forceenter) self.where = deref(where); end - if not jump and (not back or forceenter or - not isDialog(ref(was)) or isDialog(ref(where))) then + if not jump and not noenter then v, r = call(ref(where), 'enter', ref(was)); if r == false then self.where = was; return par('^^', res, v), ret(r) end - - need_scene = true; - if ref(where) ~= ref(self.where) then -- jump !!! - need_scene = false; - end + end + + need_scene = true; + if ref(where) ~= ref(self.where) then -- jump !!! + need_scene = false; end res = par('^^',res,v); @@ -73,24 +72,29 @@ go = function (self, where, back, forceenter) if not stead.in_goto_call then local to = self.where - self.where = was - - stead.in_onexit_call = true - v = call(ref(was), 'left', ref(to)); - stead.in_onexit_call = false - res = par('^^',res,v); + if not noexit then + self.where = was + stead.in_onexit_call = true + v = call(ref(was), 'left', ref(to)); + stead.in_onexit_call = false + res = par('^^',res,v); + end self.where = deref(to) - stead.in_entered_call = true - v = call(ref(to), 'entered', ref(was)); - stead.in_entered_call = false - res = par('^^',res,v); + if not noenter then + stead.in_entered_call = true + v = call(ref(to), 'entered', ref(was)); + stead.in_entered_call = false + res = par('^^',res,v); + end + if tonumber(ref(to).__visited) then ref(to).__visited = ref(to).__visited + 1; elseif here().__visited == nil then ref(to).__visited = 1 end + if isDialog(ref(to)) then dialog_rescan(ref(to)); end @@ -122,12 +126,24 @@ function player_back(self) -- deprecated end function back() + if isDialog(here()) and not isDialog(from()) then + local r, v = me():goto(from(), true, true); + NEED_SCENE = false + return r,v; + end return me():goto(from(), true); end +stead.back = back function goback() - return me():goto(from(), true, true); + return me():goto(from(), true); end +stead.goback = goback + +function goto(what, back, noenter, noexit, ...) + return me():goto(what, back, noenter, noexit, unpack(arg)); +end +stead.goto = goto game.ini = stead.hook(game.ini,function(f, ...) if isRoom(here()) then diff --git a/stead/stead.lua b/stead/stead.lua index 0f5f696..603f086 100644 --- a/stead/stead.lua +++ b/stead/stead.lua @@ -1012,7 +1012,7 @@ function phrase_action(self) r = true; end if isDialog(here()) and not dialog_rescan(here()) then - ret = stead.par(' ', ret, me():goto(from(), true)); + ret = stead.par(' ', ret, stead.back()); end ret = stead.par("^^", last, ret); @@ -2109,7 +2109,7 @@ function vroom_save(self, name, h, need) end function vroom_enter(self, ...) - return me():goto(self.where); + return stead.goto(self.where); end function isVroom(v) @@ -2125,10 +2125,12 @@ function goto(what) me():tag(); return v,r; end +stead.goto = goto; function back() return me():back(); end +stead.back = back; function rnd(m) return math.random(m);