Lunatic: reset per-actor gamevars on actor spawn, untested.

git-svn-id: https://svn.eduke32.com/eduke32@3828 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-05-30 18:10:52 +00:00
parent ed5613bf57
commit 020be8d4b5

View file

@ -178,6 +178,29 @@ local function check_isnumber(...)
end end
end end
-- Table of all per-actor gamevars active in the system.
-- [<actorvar reference>] = true
local g_actorvar = setmetatable({}, { __mode="k" })
-- Reset per-actor gamevars for the sprite that would be inserted by an
-- insertsprite() call.
-- KEEPINSYNC with insertsprite() logic in engine.c!
-- TODO_MP (Net_InsertSprite() is not handled)
--
-- NOTE: usually, a particular actor's code doesn't use ALL per-actor gamevars,
-- so there should be a way to clear only a subset of them (maybe those that
-- were defined in "its" module?).
local function A_ResetVars()
local i = ffiC.headspritestat[ffiC.MAXSTATUS]
if (i < 0) then
return
end
for acv in pairs(g_actorvar) do
acv:_clear(i)
end
end
-- Lunatic's "insertsprite" is a wrapper around the game "A_InsertSprite", not -- Lunatic's "insertsprite" is a wrapper around the game "A_InsertSprite", not
-- the engine "insertsprite". -- the engine "insertsprite".
-- --
@ -222,6 +245,8 @@ function insertsprite(tab_or_tilenum, ...)
error("invalid 'statnum' argument to insertsprite: must be a status number (0 .. MAXSTATUS-1)", 2) error("invalid 'statnum' argument to insertsprite: must be a status number (0 .. MAXSTATUS-1)", 2)
end end
A_ResetVars()
return CF.A_InsertSprite(sectnum, pos.x, pos.y, pos.z, tilenum, return CF.A_InsertSprite(sectnum, pos.x, pos.y, pos.z, tilenum,
shade, xrepeat, yrepeat, ang, xvel, zvel, shade, xrepeat, yrepeat, ang, xvel, zvel,
owner, statnum) owner, statnum)
@ -242,6 +267,8 @@ function spawn(parentspritenum, tilenum, addtodelqueue)
return -1 return -1
end end
A_ResetVars()
local i = CF.A_Spawn(parentspritenum, tilenum) local i = CF.A_Spawn(parentspritenum, tilenum)
if (addtodelqueue) then if (addtodelqueue) then
CF.A_AddToDeleteQueue(i) CF.A_AddToDeleteQueue(i)
@ -2042,11 +2069,15 @@ local actorvar_methods = {
_cleanup = function(acv) _cleanup = function(acv)
for i=0,ffiC.MAXSPRITES-1 do for i=0,ffiC.MAXSPRITES-1 do
if (ffiC.sprite[i].statnum == ffiC.MAXSTATUS or rawget(acv, i)==acv._defval) then if (ffiC.sprite[i].statnum == ffiC.MAXSTATUS or rawget(acv, i)==acv._defval) then
rawset(acv, i, nil) acv:_clear(i)
end end
end end
end, end,
_clear = function(acv, i)
rawset(acv, i, nil)
end,
--- Serialization --- --- Serialization ---
@ -2086,5 +2117,6 @@ local actorvar_mt = {
-- <values>: optional, a table of <spritenum>=value -- <values>: optional, a table of <spritenum>=value
function actorvar(initval, values) function actorvar(initval, values)
local acv = setmetatable({ _defval=initval }, actorvar_mt) local acv = setmetatable({ _defval=initval }, actorvar_mt)
g_actorvar[acv] = true
return set_values_from_table(acv, values) return set_values_from_table(acv, values)
end end