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);