diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index 32c4bd831..45e419a94 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -2052,6 +2052,7 @@ static void C_Include(const char *confile) Bfree(mptr); } +#endif // !defined LUNATIC_ONLY #ifdef _WIN32 static void check_filename_case(const char *fn) @@ -2064,8 +2065,6 @@ static void check_filename_case(const char *fn) static void check_filename_case(const char *fn) { UNREFERENCED_PARAMETER(fn); } #endif -#endif // !defined LUNATIC_ONLY - void G_DoGameStartup(const int32_t *params) { int32_t j = 0; @@ -2107,6 +2106,30 @@ void G_DoGameStartup(const int32_t *params) } } +#ifdef LUNATIC +void C_DefineSound(int32_t sndidx, const char *fn, int32_t args[5]) +{ + Bassert((unsigned)sndidx < MAXSOUNDS); + + { + sound_t *const snd = &g_sounds[sndidx]; + + Bfree(snd->filename); + snd->filename = dup_filename(fn); + check_filename_case(snd->filename); + + snd->ps = args[0]; + snd->pe = args[1]; + snd->pr = args[2]; + snd->m = args[3]; + snd->vo = args[4]; + + if (sndidx > g_maxSoundPos) + g_maxSoundPos = sndidx; + } +} +#endif + #if !defined LUNATIC_ONLY static int32_t C_ParseCommand(int32_t loop) { diff --git a/polymer/eduke32/source/gamevars.h b/polymer/eduke32/source/gamevars.h index 5fcf61d9a..140d49a5a 100644 --- a/polymer/eduke32/source/gamevars.h +++ b/polymer/eduke32/source/gamevars.h @@ -105,7 +105,7 @@ int32_t __fastcall Gv_GetVarX(register int32_t id); void __fastcall Gv_SetVarX(register int32_t id,register int32_t lValue); #ifdef LUNATIC_ONLY -# define Gv_GetVarByLabel(szGameLabel, lDefault, iActor, iPlayer) (-1) +# define Gv_GetVarByLabel(szGameLabel, lDefault, iActor, iPlayer) (lDefault) #else int32_t Gv_GetVarByLabel(const char *szGameLabel,int32_t lDefault,int32_t iActor,int32_t iPlayer); int32_t Gv_NewArray(const char *pszLabel,void *arrayptr,intptr_t asize,uint32_t dwFlags); diff --git a/polymer/eduke32/source/lunatic/control.lua b/polymer/eduke32/source/lunatic/control.lua index 360f585c9..9ff0bd2b5 100644 --- a/polymer/eduke32/source/lunatic/control.lua +++ b/polymer/eduke32/source/lunatic/control.lua @@ -21,6 +21,7 @@ local inside = dc.inside local sector, wall, sprite = dc.sector, dc.wall, dc.sprite local spritesofsect = dc.spritesofsect + module(...) @@ -161,12 +162,12 @@ function insertsprite(tab_or_tilenum, ...) tilenum, pos, sectnum = unpack(tab, 1, 3) owner = tab[4] or tab.owner or -1 statnum = tab[5] or tab.statnum or 0 - shade = shade and tab.shade - xrepeat = xrepeat and tab.xrepeat - yrepeat = yrepeat and tab.yrepeat - ang = ang and (tab.ang % 2048) - xvel = xvel and tab.xvel - zvel = zvel and tab.zvel + shade = tab.shade or shade + xrepeat = tab.xrepeat or xrepeat + yrepeat = tab.yrepeat or yrepeat + ang = tab.ang or ang + xvel = tab.xvel or xvel + zvel = tab.zvel or zvel else tilenum = tab_or_tilenum local args = {...} @@ -311,7 +312,7 @@ function _A_DoGuts(i, gutstile, n) local smallguts = spr.xrepeat < 16 and spr:isenemy() local xsz = smallguts and 8 or 32 local ysz = xsz - local z = math.min(spr, sector[spr.sectnum]:floorzat(spr)) - 8*256 + local z = math.min(spr.z, sector[spr.sectnum]:floorzat(spr)) - 8*256 if (spr.picnum == D.COMMANDER) then z = z - (24*256) @@ -346,7 +347,7 @@ function _debris(i, dtile, n) shade=spr.shade, xrepeat=32+krandand(15), yrepeat=32+krandand(15), ang=krandand(2047), xvel=32+krandand(127), zvel=-krandand(2047) } -- NOTE: BlimpSpawnSprites[14] (its array size if 15) will never be chosen - sprite[jj].yvel = isblimpscrap and ffiC.BlimpSpawnSprites[math.mod(jj, 14)] or -1 + sprite[jj]:set_yvel(isblimpscrap and ffiC.BlimpSpawnSprites[math.mod(jj, 14)] or -1) sprite[jj].pal = spr.pal end end @@ -498,7 +499,7 @@ function _testkey(pli, synckey) if (synckey >= 32ULL) then error("Invalid argument #2 to _testkey: must be in [0..31]", 2) end - local bits = ffiC.player[pli].sync.bits + local bits = ffiC.g_player[pli].sync.bits return (bit.band(bits, bit.lshift(1,synckey)) ~= 0) end @@ -568,7 +569,7 @@ local BANG2RAD = math.pi/1024 local function cossinb(bang) -- XXX: better use the precalc'd arrays instead? - local ang = BANG2RAD*(bang) + local ang = BANG2RAD*bang return 16384*math.cos(ang), 16384*math.sin(ang) end @@ -681,7 +682,7 @@ function _canshoottarget(dist, aci) for i=1,3 do if (i > 1) then - hitspr, hitdist = A_CheckHitSprite(aci, angdifs[i]) + hitspr, hitdist = A_CheckHitSprite(spr, angdifs[i]) end if (hitspr >= 0 and sprite[hitspr].picnum == spr.picnum) then diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index f070bc064..03badcd84 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -484,6 +484,7 @@ int32_t kread(int32_t handle, void *buffer, int32_t leng); const char *G_ConFile(void); void G_DoGameStartup(const int32_t *params); +int32_t C_DefineSound(int32_t sndidx, const char *fn, int32_t args[5]); ]] diff --git a/polymer/eduke32/source/lunatic/defs_common.lua b/polymer/eduke32/source/lunatic/defs_common.lua index ac4f9e025..0e263f6f3 100644 --- a/polymer/eduke32/source/lunatic/defs_common.lua +++ b/polymer/eduke32/source/lunatic/defs_common.lua @@ -256,11 +256,11 @@ ivec3_ = ffi.metatype("vec3_t", ivec3_mt) local sectortype_mt = { __index = { ceilingzat = function(s, pos) - return ffiC.getceilzofslope(s, pos.x, pos.y) + return ffiC.getceilzofslopeptr(s, pos.x, pos.y) end, floorzat = function(s, pos) - return ffiC.getflorzofslope(s, pos.x, pos.y) + return ffiC.getflorzofslopeptr(s, pos.x, pos.y) end, } } @@ -300,7 +300,12 @@ spritetype_mt = { error("attempt to set invalid picnum "..tilenum, 2) end ffi.cast(spritetype_ptr_ct, s).picnum = tilenum - end + end, + + set_yvel = function(s, yvel) + -- XXX: for now, no checking + ffi.cast(spritetype_ptr_ct, s).yvel = yvel + end, }, } -- The user of this module can insert additional "spritetype" metamethods and diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index 3d05d8a43..4ee2bf989 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -65,6 +65,7 @@ kread; G_ConFile; G_DoGameStartup; +C_DefineSound; actor; ud; diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index 96de5c83e..cd3cddfb3 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -24,9 +24,13 @@ local unpack = unpack -- non-nil if running from EDuke32 -- (read_into_string~=nil iff string.dump==nil) local read_into_string = read_into_string +local ffi, ffiC if (string.dump) then require("strict") +else + ffi = require("ffi") + ffiC = ffi.C end @@ -511,12 +515,9 @@ local function cmd_gamestartup(...) return end - if (string.dump == nil) then + if (ffi) then -- running from EDuke32 - local ffi = require("ffi") - local ffiC = ffi.C - - if (args == 30) then + if (#args == 30) then ffiC.g_scriptVersion = 14 end local params = ffi.new("int32_t [30]", args) @@ -527,12 +528,17 @@ local function cmd_gamestartup(...) end local function cmd_definesound(sndnum, fn, ...) - if (sndnum < 0 or sndnum >= conl.MAXSOUNDS) then + if (sndnum >= conl.MAXSOUNDS+0ULL) then errprintf("sound number is or exceeds sound limit of %d", conl.MAXSOUNDS) return end local params = {...} -- TODO: sanity-check them + if (ffi) then + local cparams = ffi.new("int32_t [5]", params) + assert(type(fn)=="string") + ffiC.C_DefineSound(sndnum, fn, cparams) + end g_data.sound[sndnum] = { fn=fn, params=params } end @@ -880,7 +886,7 @@ local Ci = { spritepal = cmd(D), hitradius = cmd(D,D,D,D,D) - / "_con._A_RadiusDamage(%1,%2,%3,%4,%5)", + / "_con._A_RadiusDamage(_aci,%1,%2,%3,%4,%5)", hitradiusvar = cmd(R,R,R,R,R), -- some commands taking read vars @@ -1230,7 +1236,7 @@ local Cif = { ifinouterspace = cmd() / format("_con._checkspace(%s,true)", SPS".sectnum"), ifhitweapon = cmd() - / "_con._A_IncurDamage(_aci)", + / "_con._A_IncurDamage(_aci)>=0", ifhitspace = cmd() / "_con._testkey(_pli,29)", -- XXX ifdead = cmd()