mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-16 09:21:36 +00:00
Lunatic: in event interface, pass actor, player, dist.
git-svn-id: https://svn.eduke32.com/eduke32@2746 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
0ac242293b
commit
90b169d8c8
4 changed files with 28 additions and 14 deletions
|
@ -97,8 +97,8 @@ void VM_ScriptInfo(void)
|
|||
int32_t VM_OnEvent(int32_t iEventID, int32_t iActor, int32_t iPlayer, int32_t lDist, int32_t iReturn)
|
||||
{
|
||||
#ifdef LUNATIC
|
||||
if (El_IsInitialized(&g_ElState))
|
||||
El_CallEvent(&g_ElState, iEventID);
|
||||
if (El_IsInitialized(&g_ElState) && El_HaveEvent(iEventID))
|
||||
El_CallEvent(&g_ElState, iEventID, iActor, iPlayer, lDist);
|
||||
#endif
|
||||
if (!apScriptGameEvent[iEventID])
|
||||
return iReturn;
|
||||
|
|
|
@ -10,12 +10,12 @@
|
|||
#include "osd.h"
|
||||
|
||||
#include "gameexec.h"
|
||||
#include "gamedef.h" // EventNames[]
|
||||
#include "gamedef.h" // EventNames[], MAXEVENTS
|
||||
#include "lunatic.h"
|
||||
|
||||
// this serves two purposes:
|
||||
// the values as booleans and the addresses as keys to the Lua registry
|
||||
static uint8_t g_elEvents[MAXEVENTS];
|
||||
uint8_t g_elEvents[MAXEVENTS];
|
||||
|
||||
|
||||
// forward-decls...
|
||||
|
@ -150,30 +150,33 @@ static int32_t SetEvent_luacf(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int32_t El_CallEvent(El_State *estate, int32_t eventidx)
|
||||
int32_t El_CallEvent(El_State *estate, int32_t eventidx, int32_t iActor, int32_t iPlayer, int32_t lDist)
|
||||
{
|
||||
// XXX: estate must be the one where the events were registered...
|
||||
// make a global?
|
||||
|
||||
int32_t i;
|
||||
|
||||
if (!g_elEvents[eventidx])
|
||||
return 0;
|
||||
lua_State *const L = estate->L;
|
||||
|
||||
lua_pushlightuserdata(estate->L, &g_elEvents[eventidx]); // push address
|
||||
lua_gettable(estate->L, LUA_REGISTRYINDEX); // get lua function
|
||||
lua_pushlightuserdata(L, &g_elEvents[eventidx]); // push address
|
||||
lua_gettable(L, LUA_REGISTRYINDEX); // get lua function
|
||||
|
||||
lua_pushinteger(L, iActor);
|
||||
lua_pushinteger(L, iPlayer);
|
||||
lua_pushinteger(L, lDist);
|
||||
|
||||
// -- call it! --
|
||||
|
||||
i = lua_pcall(estate->L, 0, 0, 0);
|
||||
i = lua_pcall(L, 3, 0, 0);
|
||||
if (i == LUA_ERRMEM) // XXX: should be more sophisticated. Clean up stack? Do GC?
|
||||
return -1;
|
||||
|
||||
if (i == LUA_ERRRUN)
|
||||
{
|
||||
OSD_Printf("event \"%s\" (state \"%s\") runtime error: %s\n", EventNames[eventidx].text,
|
||||
estate->name, lua_tostring(estate->L, 1)); // get err msg
|
||||
lua_pop(estate->L, 1);
|
||||
estate->name, lua_tostring(L, 1)); // get err msg
|
||||
lua_pop(L, 1);
|
||||
return 4;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,18 +5,23 @@
|
|||
|
||||
#include <lua.h>
|
||||
|
||||
#include "gamedef.h" // EventNames[], MAXEVENTS
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
lua_State *L;
|
||||
} El_State;
|
||||
|
||||
extern uint8_t g_elEvents[MAXEVENTS]; // shouldn't be used directly
|
||||
|
||||
// -- functions --
|
||||
int32_t El_CreateState(El_State *estate, const char *name);
|
||||
void El_DestroyState(El_State *estate);
|
||||
static inline int32_t El_IsInitialized(const El_State *estate) { return (estate->L != NULL); }
|
||||
static inline int32_t El_HaveEvent(int32_t eventidx) { return g_elEvents[eventidx]!=0; }
|
||||
int32_t El_RunOnce(El_State *estate, const char *fn);
|
||||
int32_t El_CallEvent(El_State *estate, int32_t eventidx);
|
||||
int32_t El_CallEvent(El_State *estate, int32_t eventidx, int32_t iActor, int32_t iPlayer, int32_t lDist);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
|
||||
print('---=== ELua Test script ===---')
|
||||
|
||||
local function printf(fmt, ...)
|
||||
print(string.format(fmt, ...))
|
||||
end
|
||||
|
||||
local function checkfail(funcstr)
|
||||
local status, res = pcall(DBG_.loadstring(funcstr))
|
||||
if (status) then
|
||||
|
@ -107,7 +111,9 @@ checkfail('string.dump(setevent)') -- string.dump is unavailable
|
|||
-- See http://luajit.org/ext_ffi_api.html#ffi_C about what stuff ffi.C contains.
|
||||
checkfail('gv.luaJIT_setmode(nil, 0, 0)')
|
||||
|
||||
setevent(gv.EVENT_JUMP, function() print("jump!") end)
|
||||
setevent(gv.EVENT_JUMP, function(actori, playeri, dist)
|
||||
printf("jump i=%d p=%d d=%d", actori, playeri, dist)
|
||||
end)
|
||||
|
||||
|
||||
print('---=== END TEST SCRIPT ===---')
|
||||
|
|
Loading…
Reference in a new issue