goto fix
This commit is contained in:
parent
1056fc1ef1
commit
7572673117
|
@ -1,4 +1,4 @@
|
||||||
go = function (self, where, back, forceenter)
|
go = function (self, where, back, noenter, noexit)
|
||||||
local was = self.where;
|
local was = self.where;
|
||||||
local need_scene = false;
|
local need_scene = false;
|
||||||
local ret
|
local ret
|
||||||
|
@ -29,7 +29,7 @@ go = function (self, where, back, forceenter)
|
||||||
|
|
||||||
local v, r, jump;
|
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
|
stead.in_exit_call = true -- to break recurse
|
||||||
v,r = call(ref(self.where), 'exit', ref(where));
|
v,r = call(ref(self.where), 'exit', ref(where));
|
||||||
stead.in_exit_call = nil
|
stead.in_exit_call = nil
|
||||||
|
@ -49,18 +49,17 @@ go = function (self, where, back, forceenter)
|
||||||
self.where = deref(where);
|
self.where = deref(where);
|
||||||
end
|
end
|
||||||
|
|
||||||
if not jump and (not back or forceenter or
|
if not jump and not noenter then
|
||||||
not isDialog(ref(was)) or isDialog(ref(where))) then
|
|
||||||
v, r = call(ref(where), 'enter', ref(was));
|
v, r = call(ref(where), 'enter', ref(was));
|
||||||
if r == false then
|
if r == false then
|
||||||
self.where = was;
|
self.where = was;
|
||||||
return par('^^', res, v), ret(r)
|
return par('^^', res, v), ret(r)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
need_scene = true;
|
|
||||||
if ref(where) ~= ref(self.where) then -- jump !!!
|
need_scene = true;
|
||||||
need_scene = false;
|
if ref(where) ~= ref(self.where) then -- jump !!!
|
||||||
end
|
need_scene = false;
|
||||||
end
|
end
|
||||||
|
|
||||||
res = par('^^',res,v);
|
res = par('^^',res,v);
|
||||||
|
@ -73,24 +72,29 @@ go = function (self, where, back, forceenter)
|
||||||
|
|
||||||
if not stead.in_goto_call then
|
if not stead.in_goto_call then
|
||||||
local to = self.where
|
local to = self.where
|
||||||
self.where = was
|
if not noexit then
|
||||||
|
self.where = was
|
||||||
stead.in_onexit_call = true
|
stead.in_onexit_call = true
|
||||||
v = call(ref(was), 'left', ref(to));
|
v = call(ref(was), 'left', ref(to));
|
||||||
stead.in_onexit_call = false
|
stead.in_onexit_call = false
|
||||||
res = par('^^',res,v);
|
res = par('^^',res,v);
|
||||||
|
end
|
||||||
|
|
||||||
self.where = deref(to)
|
self.where = deref(to)
|
||||||
|
|
||||||
stead.in_entered_call = true
|
if not noenter then
|
||||||
v = call(ref(to), 'entered', ref(was));
|
stead.in_entered_call = true
|
||||||
stead.in_entered_call = false
|
v = call(ref(to), 'entered', ref(was));
|
||||||
res = par('^^',res,v);
|
stead.in_entered_call = false
|
||||||
|
res = par('^^',res,v);
|
||||||
|
end
|
||||||
|
|
||||||
if tonumber(ref(to).__visited) then
|
if tonumber(ref(to).__visited) then
|
||||||
ref(to).__visited = ref(to).__visited + 1;
|
ref(to).__visited = ref(to).__visited + 1;
|
||||||
elseif here().__visited == nil then
|
elseif here().__visited == nil then
|
||||||
ref(to).__visited = 1
|
ref(to).__visited = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if isDialog(ref(to)) then
|
if isDialog(ref(to)) then
|
||||||
dialog_rescan(ref(to));
|
dialog_rescan(ref(to));
|
||||||
end
|
end
|
||||||
|
@ -122,12 +126,24 @@ function player_back(self) -- deprecated
|
||||||
end
|
end
|
||||||
|
|
||||||
function back()
|
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);
|
return me():goto(from(), true);
|
||||||
end
|
end
|
||||||
|
stead.back = back
|
||||||
|
|
||||||
function goback()
|
function goback()
|
||||||
return me():goto(from(), true, true);
|
return me():goto(from(), true);
|
||||||
end
|
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, ...)
|
game.ini = stead.hook(game.ini,function(f, ...)
|
||||||
if isRoom(here()) then
|
if isRoom(here()) then
|
||||||
|
|
|
@ -1012,7 +1012,7 @@ function phrase_action(self)
|
||||||
r = true;
|
r = true;
|
||||||
end
|
end
|
||||||
if isDialog(here()) and not dialog_rescan(here()) then
|
if isDialog(here()) and not dialog_rescan(here()) then
|
||||||
ret = stead.par(' ', ret, me():goto(from(), true));
|
ret = stead.par(' ', ret, stead.back());
|
||||||
end
|
end
|
||||||
|
|
||||||
ret = stead.par("^^", last, ret);
|
ret = stead.par("^^", last, ret);
|
||||||
|
@ -2109,7 +2109,7 @@ function vroom_save(self, name, h, need)
|
||||||
end
|
end
|
||||||
|
|
||||||
function vroom_enter(self, ...)
|
function vroom_enter(self, ...)
|
||||||
return me():goto(self.where);
|
return stead.goto(self.where);
|
||||||
end
|
end
|
||||||
|
|
||||||
function isVroom(v)
|
function isVroom(v)
|
||||||
|
@ -2125,10 +2125,12 @@ function goto(what)
|
||||||
me():tag();
|
me():tag();
|
||||||
return v,r;
|
return v,r;
|
||||||
end
|
end
|
||||||
|
stead.goto = goto;
|
||||||
|
|
||||||
function back()
|
function back()
|
||||||
return me():back();
|
return me():back();
|
||||||
end
|
end
|
||||||
|
stead.back = back;
|
||||||
|
|
||||||
function rnd(m)
|
function rnd(m)
|
||||||
return math.random(m);
|
return math.random(m);
|
||||||
|
|
Loading…
Reference in a new issue