--- a/hedgewars/uScript.pas Wed Nov 14 00:23:29 2012 +0100
+++ b/hedgewars/uScript.pas Thu Nov 22 00:41:53 2012 +0100
@@ -81,7 +81,9 @@
uLandGraphics,
SDLh,
SysUtils,
- uIO;
+ uIO,
+ uPhysFSLayer
+ ;
var luaState : Plua_State;
ScriptAmmoLoadout : shortstring;
@@ -1594,7 +1596,7 @@
lua_pushnil(L);
end
else
- lua_pushstring(L, str2pchar(Pathz[ptData]));
+ lua_pushstring(L, str2pchar(cPathz[ptData]));
lc_getdatapath:= 1
end;
@@ -1606,7 +1608,7 @@
lua_pushnil(L);
end
else
- lua_pushstring(L, str2pchar(UserPathz[ptData]));
+ lua_pushstring(L, str2pchar(cPathz[ptData]));
lc_getuserdatapath:= 1
end;
@@ -1794,6 +1796,18 @@
lc_setaihintsongear:= 0
end;
+
+function lc_hedgewarsscriptload(L : Plua_State) : LongInt; Cdecl;
+begin
+ if lua_gettop(L) <> 1 then
+ begin
+ LuaError('Lua: Wrong number of parameters passed to HedgewarsScriptLoad!');
+ lua_pushnil(L)
+ end
+ else
+ ScriptLoad(lua_tostring(L, 1));
+ lc_hedgewarsscriptload:= 0;
+end;
///////////////////
procedure ScriptPrintStack;
@@ -1966,18 +1980,27 @@
ScriptCall('onScreenResize');
end;
+// custom script loader via physfs, passed to lua_load
+const BUFSIZE = 1024;
procedure ScriptLoad(name : shortstring);
var ret : LongInt;
s : shortstring;
+ f : PFSFile;
+ buf : array[0..Pred(BUFSIZE)] of byte;
begin
-s:= UserPathz[ptData] + '/' + name;
-if not FileExists(s) then
- s:= Pathz[ptData] + '/' + name;
-if not FileExists(s) then
+s:= cPathz[ptData] + name;
+if not pfsExists(s) then
exit;
-ret:= luaL_loadfile(luaState, Str2PChar(s));
+f:= pfsOpenRead(s);
+if f = nil then
+ exit;
+
+physfsReaderSetBuffer(@buf);
+ret:= lua_load(luaState, @physfsReader, f, Str2PChar(s));
+pfsClose(f);
+
if ret <> 0 then
begin
LuaError('Lua: Failed to load ' + name + '(error ' + IntToStr(ret) + ')');
@@ -2395,6 +2418,7 @@
lua_register(luaState, _P'TestRectForObstacle', @lc_testrectforobstacle);
lua_register(luaState, _P'SetGearAIHints', @lc_setaihintsongear);
+lua_register(luaState, _P'HedgewarsScriptLoad', @lc_hedgewarsscriptload);
ScriptClearStack; // just to be sure stack is empty