raze-gles/polymer/eduke32/source/lunatic/test/damagehplane.lua

111 lines
2.9 KiB
Lua

local bit = require("bit")
local band = bit.band
local tostring = tostring
local gv = gv
local actor = actor
local sector, wall, sprite = sector, wall, sprite
local printf = printf
local sectorsofbunch = sectorsofbunch
local con = require("con")
local D = require("CON.DEFS")
----------
local TROR_GLASSBREAKER = 2959 -- red 'T'
-- Actor controlling the timing of a TROR hplane breaking.
gameactor
{
TROR_GLASSBREAKER,
function(aci, pli, dist)
local spr = sprite[aci]
if (not (spr.lotag == 712 and spr.hitag == 119)) then -- check BREAKER_MAGIC
sprite.changestat(aci, actor.STAT.DEFAULT)
return
end
local cnt = actor[aci]:get_count()
local finish = (cnt >= 6)
if (cnt == 0) then
-- NOTE: INTERNAL interface, DON'T USE!
con._sound(aci, D.GLASS_BREAKING)
end
local bunchnum = spr.extra
for sectnum, what in sectorsofbunch(bunchnum, gv.BOTH_CF) do
local cf = sector[sectnum][what]
cf:set_picnum(D.GLASS2 + cnt)
cf.statbits:clear(sector.STAT.BLOCK + sector.STAT.HITSCAN)
if (finish) then
cf.statbits:clear(sector.STAT.TRANS_BITMASK)
end
end
if (finish) then
con.killit()
end
end
}
local DHP = sector.DAMAGEHPLANE
gameevent
{
"DAMAGEHPLANE",
function(aci, pli, RETURN)
local what, sectnum = sector.damagehplane_whatsect(RETURN)
local sec = sector[sectnum]
-- Part I: make various screens breakable when it's a ceiling picnum.
if (what == "ceiling") then
-- hit ceiling
if (sec.ceilingpicnum >= 263 and sec.ceilingpicnum <= 275) then
sec:set_ceilingpicnum(D.W_SCREENBREAK + gv.krand()%3)
gv.RETURN = DHP.GLASSBREAK
return con.longjmp()
end
end
gv.RETURN = DHP.DEFAULT
end
}
gameevent
{
"DAMAGEHPLANE",
function(aci, pli, RETURN)
local what, sectnum = sector.damagehplane_whatsect(RETURN)
local sec = sector[sectnum]
-- Part II: breakable TROR hplanes
local cf = sec[what]
-- printf("damage %s of sector %d (pic %d, bunch %d, hittable: %s)", what, sectnum,
-- cf.picnum, cf.bunch, tostring(cf.statbits:test(sector.STAT.HITSCAN)))
if (cf.bunch >= 0 and (cf.picnum==198 or cf.picnum==D.GLASS2) and
cf.statbits:test(sector.STAT.HITSCAN)) then
local bi = con.insertsprite(TROR_GLASSBREAKER, wall[sec.wallptr], sectnum, actor.STAT.ACTOR)
local breaker = sprite[bi]
breaker.cstat = sprite.CSTAT.INVISIBLE
breaker.lotag, breaker.hitag = 712, 119 -- BREAKER_MAGIC
breaker.extra = cf.bunch
gv.RETURN = DHP.SUPPRESS
return con.longjmp()
end
gv.RETURN = DHP.DEFAULT
end
}