diff --git a/src/game/g_scripts.pas b/src/game/g_scripts.pas
index 31a8a0060623abb48fc99720a0af4147a27898c9..d1113c9e97eb9b7cc51b99dae2f46ff6c6d707a0 100644 (file)
--- a/src/game/g_scripts.pas
+++ b/src/game/g_scripts.pas
const
// reset levels
- RESET_ALL = 0;
- RESET_SRV = 1;
- RESET_WAD = 2;
- RESET_MAP = 3;
+ RESET_SRV_BIT = 4;
+ RESET_WAD_BIT = 2;
+ RESET_MAP_BIT = 1;
+ RESET_SRV = RESET_SRV_BIT or RESET_WAD_BIT or RESET_MAP_BIT;
+ RESET_WAD = RESET_WAD_BIT or RESET_MAP_BIT;
+ RESET_MAP = RESET_MAP_BIT;
+ RESET_ALL = 255;
type
PScriptContext = Plua_State;
gScriptInit: Boolean = False;
function g_Scripts_Init(): Boolean;
-procedure g_Scripts_Reset(What: Integer);
+procedure g_Scripts_Reset(What: Byte);
function g_Scripts_ProcExec(PName: string; const Args: array of const; Namespace: string = ''): Integer;
function g_Scripts_ProcExists(PName: string): Boolean;
function g_Scripts_ProcInstall(PName: string; PPtr: PScriptProc): Boolean;
SysUtils, g_console, g_scriptprocs;
type
- POpenFunc = function(L: Plua_State): LongBool; cdecl;
TLuaReg = record
name: PAnsiChar;
- func: POpenFunc;
+ func: lua_CFunction;
end;
const
- LUA_LIBS: array [0..3] of TLuaReg = (
+ LUA_LIBS: array [0..6] of TLuaReg = (
(name: ''; func: luaopen_base),
+ (name: LUA_LOADLIBNAME; func: luaopen_package),
(name: LUA_TABLIBNAME; func: luaopen_table),
- (name: LUA_STRLINAME; func: luaopen_string), // STRLINAME is actually a typo in fpc's lua module
- (name: LUA_MATHLIBNAME; func: luaopen_math)
+ (name: LUA_STRLIBNAME; func: luaopen_string),
+ (name: LUA_MATHLIBNAME; func: luaopen_math),
+ (name: LUA_OSLIBNAME; func: luaopen_os), // TODO: something to restrict these two
+ (name: LUA_IOLIBNAME; func: luaopen_io)
);
function LuaInstallGameFuncs(): Boolean;
Result := False;
if not g_Scripts_ProcInstall('conprint', SP_Lua_ConPrint) then Exit;
+ if not g_Scripts_ProcInstall('message', SP_Lua_Message) then Exit;
+ if not g_Scripts_ProcInstall('sound', SP_Lua_PlaySound) then Exit;
+ if not g_Scripts_ProcInstall('get_gamemode', SP_Lua_GetGameMode) then Exit;
+ if not g_Scripts_ProcInstall('get_gametype', SP_Lua_GetGameType) then Exit;
+ if not g_Scripts_ProcInstall('get_time', SP_Lua_GetTime) then Exit;
+
+ if not g_Scripts_ProcInstall('player_get_keys', SP_Lua_PlayerGetKeys) then Exit;
+ if not g_Scripts_ProcInstall('player_get_armor', SP_Lua_PlayerGetArmor) then Exit;
+ if not g_Scripts_ProcInstall('player_get_score', SP_Lua_PlayerGetScore) then Exit;
+ if not g_Scripts_ProcInstall('player_get_name', SP_Lua_PlayerGetName) then Exit;
+ if not g_Scripts_ProcInstall('player_get_team', SP_Lua_PlayerGetTeam) then Exit;
+
+ if not g_Scripts_ProcInstall('uid_get_health', SP_Lua_ActorGetHealth) then Exit;
+ if not g_Scripts_ProcInstall('uid_get_pos', SP_Lua_ActorGetPos) then Exit;
+ if not g_Scripts_ProcInstall('uid_get_state', SP_Lua_ActorGetState) then Exit;
+ if not g_Scripts_ProcInstall('uid_get_type', SP_Lua_ActorGetType) then Exit;
+ if not g_Scripts_ProcInstall('uid_nearest', SP_Lua_ActorNearest) then Exit;
+ if not g_Scripts_ProcInstall('uid_farthest', SP_Lua_ActorFarthest) then Exit;
+ if not g_Scripts_ProcInstall('uid_damage', SP_Lua_ActorDamage) then Exit;
+ if not g_Scripts_ProcInstall('uid_push', SP_Lua_ActorPush) then Exit;
+ if not g_Scripts_ProcInstall('uid_teleport', SP_Lua_ActorTeleport) then Exit;
+
+ if not g_Scripts_ProcInstall('trigger_get_enabled', SP_Lua_TriggerGetEnabled) then Exit;
+ if not g_Scripts_ProcInstall('trigger_set_enabled', SP_Lua_TriggerSetEnabled) then Exit;
+ if not g_Scripts_ProcInstall('trigger_activate', SP_Lua_TriggerActivate) then Exit;
+ if not g_Scripts_ProcInstall('trigger_get_pos', SP_Lua_TriggerGetPos) then Exit;
+ if not g_Scripts_ProcInstall('trigger_set_pos', SP_Lua_TriggerSetPos) then Exit;
+
+ if not g_Scripts_ProcInstall('panel_get_type', SP_Lua_PanelGetType) then Exit;
+ if not g_Scripts_ProcInstall('panel_get_pos', SP_Lua_PanelGetPos) then Exit;
+ if not g_Scripts_ProcInstall('panel_get_size', SP_Lua_PanelGetSize) then Exit;
+ if not g_Scripts_ProcInstall('panel_set_pos', SP_Lua_PanelSetPos) then Exit;
+ if not g_Scripts_ProcInstall('panel_switch_texture', SP_Lua_PanelSwitchTexture) then Exit;
+
+ if not g_Scripts_ProcInstall('door_get_open', SP_Lua_DoorGetState) then Exit;
+ if not g_Scripts_ProcInstall('door_close', SP_Lua_DoorClose) then Exit;
+ if not g_Scripts_ProcInstall('door_close_trap', SP_Lua_DoorCloseTrap) then Exit;
+ if not g_Scripts_ProcInstall('door_open', SP_Lua_DoorOpen) then Exit;
+ if not g_Scripts_ProcInstall('door_toggle', SP_Lua_DoorToggle) then Exit;
+ if not g_Scripts_ProcInstall('lift_get_dir', SP_Lua_LiftGetDir) then Exit;
+ if not g_Scripts_ProcInstall('lift_set_dir', SP_Lua_LiftSetDir) then Exit;
if not g_Scripts_ProcInstall('spawn_item', SP_Lua_SpawnItem) then Exit;
if not g_Scripts_ProcInstall('spawn_shot', SP_Lua_SpawnShot) then Exit;
// don't open all the libs
for i := 0 to High(LUA_LIBS) do
begin
- //lua_pushcfunction(gScriptCtx, LUA_LIBS[i].func);
+ lua_pushcfunction(gScriptCtx, LUA_LIBS[i].func);
lua_pushstring(gScriptCtx, LUA_LIBS[i].name);
- //lua_call(gScriptCtx, 1, 0);
- LUA_LIBS[i].func(gScriptCtx);
+ lua_call(gScriptCtx, 1, 0);
end;
// create a table for game-related functions
end;
// TODO: maybe actually put some fields into these?
-procedure g_Scripts_Reset(What: Integer);
+procedure g_Scripts_Reset(What: Byte);
begin
if not gScriptInit then Exit;
- if What in [RESET_ALL, RESET_SRV] then
+ if LongBool(What and RESET_SRV_BIT) then
begin
lua_newtable(gScriptCtx);
lua_setglobal(gScriptCtx, 'srv');
end;
- if What in [RESET_ALL, RESET_WAD] then
+ if LongBool(What and RESET_WAD_BIT) then
begin
lua_newtable(gScriptCtx);
lua_setglobal(gScriptCtx, 'wad');
end;
- if What in [RESET_ALL, RESET_MAP] then
+ if LongBool(What and RESET_MAP_BIT) then
begin
lua_newtable(gScriptCtx);
lua_setglobal(gScriptCtx, 'map');
+
+ // disable io and os modules on any kind of reset
+ lua_pushnil(gScriptCtx);
+ lua_pushnil(gScriptCtx);
+ lua_setglobal(gScriptCtx, 'os');
+ lua_setglobal(gScriptCtx, 'io');
end;
end;