Lunatic: spritesof{stat,sect} iterators that allow deletion inside the loop.

Also,
 - an optimization for sprite[]:setpos(). Calls to get_sprite_index()
   seem to be pretty slow (at least when they're not compiled).
 - add getzrange to the dynsymlists

git-svn-id: https://svn.eduke32.com/eduke32@3560 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-03-15 16:56:03 +00:00
parent 83bc10791f
commit 0173c0908a
3 changed files with 46 additions and 5 deletions

View file

@ -542,7 +542,9 @@ function spritetype_mt.__index.setpos(spr, pos) -- setsprite() clone
return -1
end
if (spr.sectnum ~= newsect) then
ffiC.changespritesect(get_sprite_idx(spr), newsect)
end
return newsect
end
@ -757,10 +759,29 @@ local function iter_spritesofsect(sect, i)
if (i >= 0) then return i end
end
function spritesofsect(sect)
-- sprites of sectnum iterator that allows deleting the iterated sprite
local function iter_spritesofsect_safe(tab, i)
if (i < 0) then
i = ffiC.headspritesect[-i]
else
i = tab[1]
end
if (i >= 0) then
tab[1] = ffiC.nextspritesect[i]
return i
end
end
function spritesofsect(sect, maydelete)
check_sector_idx(sect)
if (maydelete) then
return iter_spritesofsect_safe, { -1 }, -sect
else
return iter_spritesofsect, sect, -1
end
end
local function iter_spritesofstat(stat, i)
if (i < 0) then
@ -772,13 +793,31 @@ local function iter_spritesofstat(stat, i)
if (i >= 0) then return i end
end
function spritesofstat(stat)
-- sprites of statnum iterator that allows deleting the iterated sprite
local function iter_spritesofstat_safe(tab, i)
if (i < 0) then
i = ffiC.headspritestat[-i]
else
i = tab[1]
end
if (i >= 0) then
tab[1] = ffiC.nextspritestat[i]
return i
end
end
function spritesofstat(stat, maydelete)
if (stat >= ffiC.MAXSTATUS+0ULL) then
error("passed invalid statnum to spritesofstat iterator", 2)
end
if (maydelete) then
return iter_spritesofstat_safe, { -1 }, -stat
else
return iter_spritesofstat, stat, -1
end
end
--== TROR iterators ==--
local function iter_sectorsofbunch(cf, i)

View file

@ -51,6 +51,7 @@ getangle;
cansee;
hitscan;
neartag;
getzrange;
rotatesprite;
dist;

View file

@ -51,6 +51,7 @@ getangle;
cansee;
hitscan;
neartag;
getzrange;
rotatesprite;
dist;