From 2cd111b7e43710a232c70f4fb15a1d3387e021fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Ko=C5=82odziejski?= Date: Sun, 19 Jun 2022 09:28:11 +0200 Subject: [PATCH] GRIM: Restore LUA W/A for release. It might still needed for old save games. --- engines/grim/lua/ldo.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/grim/lua/ldo.cpp b/engines/grim/lua/ldo.cpp index 1d2a309bfd2..1189598a3b8 100644 --- a/engines/grim/lua/ldo.cpp +++ b/engines/grim/lua/ldo.cpp @@ -233,8 +233,18 @@ int32 luaD_call(StkId base, int32 nResults) { firstResult = callC(fvalue(funcObj), base); } else { TObject *im = luaT_getimbyObj(funcObj, IM_FUNCTION); - if (ttype(im) == LUA_T_NIL) - lua_error("call expression not a function"); + if (ttype(im) == LUA_T_NIL) { + // NOTE: Originally this throwed the lua_error. Anyway it is commented here because + // when in year 4 bi.exit() calls bi.book.act:free(). But bi.book.act is nil, + // hence it enters this branch and the error blocks the game. + // Now we try instead to survive and go on with the function. + lua_Task *t = lua_state->task; + lua_state->task = t->next; + lua_state->prevTask = tmpTask; + luaM_free(t); + warning("Lua: call expression not a function"); + return 1; + } luaD_callTM(im, (lua_state->stack.top - lua_state->stack.stack) - (base - 1), nResults); continue; }