Lunatic: implement the non-local control flow needed for some commands.

git-svn-id: https://svn.eduke32.com/eduke32@3250 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2012-11-30 18:57:59 +00:00
parent 5b07f67627
commit 76b970e547
5 changed files with 42 additions and 6 deletions

View file

@ -5112,6 +5112,7 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
{
#ifdef LUNATIC
double t;
int32_t killit=0;
#endif
vmstate_t tempvm = { iActor, iPlayer, lDist, &actor[iActor].t_data[0],
&sprite[iActor], 0
@ -5176,7 +5177,7 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
t = gethitickms();
if (L_IsInitialized(&g_ElState) && El_HaveActor(vm.g_sp->picnum))
El_CallActor(&g_ElState, vm.g_sp->picnum, iActor, iPlayer, lDist);
killit = (El_CallActor(&g_ElState, vm.g_sp->picnum, iActor, iPlayer, lDist)==1);
#endif
insptr = 4 + (g_tile[vm.g_sp->picnum].execPtr);
@ -5188,7 +5189,11 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
g_actorCalls[vm.g_sp->picnum]++;
#endif
if (vm.g_flags & VM_KILL)
if ((vm.g_flags & VM_KILL)
#ifdef LUNATIC
|| killit
#endif
)
{
// if player was set to squish, first stop that...
if (vm.g_p >= 0 && g_player[vm.g_p].ps->actorsqu == vm.g_i)

View file

@ -159,6 +159,17 @@ end
--- Exported functions
-- Non-local control flow. These ones call the original error(), not our
-- redefinition in defs.ilua.
function longjmp()
error(false)
end
function killit()
-- TODO: guard against deletion of player sprite?
error(true)
end
-- The return value is true iff the ammo was at the weapon's max.
-- In that case, no action is taken.
function addammo(ps, weapon, amount)

View file

@ -670,7 +670,8 @@ local Ci = {
-- these can appear anywhere in the script
["break"] = cmd()
/ "do return end", -- TODO: more exact semantics
["return"] = cmd(),
["return"] = cmd()
/ "_con.longjmp()", -- TODO: test with code from Wiki "return" entry
state = cmd(I)
/ "%1()", -- TODO: mangle names
@ -846,7 +847,7 @@ local Ci = {
getlastpal = cmd(),
insertspriteq = cmd(),
killit = cmd()
/ "do return 2 end", -- exec SPECIAL HANDLING!
/ "_con.killit()", -- exec SPECIAL HANDLING!
mikesnd = cmd(),
nullop = cmd(),
pkick = cmd(),

View file

@ -190,10 +190,17 @@ int32_t El_CallEvent(L_State *estate, int32_t eventidx, int32_t iActor, int32_t
if (i == LUA_ERRRUN)
{
if (lua_isboolean(L, -1))
{
lua_pop(L, 1);
return 0;
}
Bassert(lua_type(L, -1)==LUA_TSTRING);
OSD_Printf("event \"%s\" (state \"%s\") runtime error: %s\n", EventNames[eventidx].text,
estate->name, lua_tostring(L, -1)); // get err msg
lua_pop(L, 1);
return 4;
return -1;
}
return 0;
@ -207,10 +214,18 @@ int32_t El_CallActor(L_State *estate, int32_t actortile, int32_t iActor, int32_t
if (i == LUA_ERRRUN)
{
if (lua_isboolean(L, -1))
{
int32_t killit = lua_toboolean(L, -1);
lua_pop(L, 1);
return killit;
}
Bassert(lua_type(L, -1)==LUA_TSTRING);
OSD_Printf("actor %d (sprite %d, state \"%s\") runtime error: %s\n", actortile, iActor,
estate->name, lua_tostring(L, -1)); // get err msg
lua_pop(L, 1);
return 4;
return -1;
}
return 0;

View file

@ -266,6 +266,10 @@ gameactor(1680, -- LIZTROOP
-- Duke Vader / Anakin Nukewalker?
actor[i]:set_action("TROOPFLINTCH")
actor[i]:set_move("SHRUNKVELS")
if (dist < 1024) then
con.killit()
end
end
end
)