diff -r 2e836bebb518 -r 453917e94e55 hedgewars/uScript.pas --- 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