LunaCON: implement dragpoint, clipmove*; fix gamearray serialization.

git-svn-id: https://svn.eduke32.com/eduke32@3812 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-05-24 13:54:37 +00:00
parent d0f538b283
commit 6f94af7399
5 changed files with 46 additions and 7 deletions

View file

@ -39,6 +39,7 @@ local cansee, hitscan, neartag = dc.cansee, dc.hitscan, dc.neartag
local inside = dc.inside
local sector, wall, sprite = dc.sector, dc.wall, dc.sprite
local wallsofsect = dc.wallsofsect
local spritesofsect, spritesofstat = dc.spritesofsect, dc.spritesofstat
local OUR_NAME = "_con"
@ -1284,6 +1285,16 @@ function _getzrange(x, y, z, sectnum, walldist, clipmask)
hit.f.z, hit.f.num + (hit.f.spritep and 49152 or 16384)
end
-- CON "clipmove" and "clipmovenoslide" commands
function _clipmovex(x, y, z, sectnum, xv, yv, wd, cd, fd, clipmask, noslidep)
check_sector_idx(sectnum)
local ipos = geom.ivec3(x, y, z)
local sect = ffi.new("int16_t [1]")
local ret = ffiC.clipmovex(ipos, sect, xv, yv, wd, cd, fd, clipmask, noslidep)
-- Return: clipmovex() return value; updated x, y, sectnum
return ret, ipos.x, ipos.y, sect[0]
end
function _sleepcheck(aci, dist)
local acs = actor[aci]
if (dist > MAXSLEEPDIST and acs.timetosleep == 0) then
@ -1960,7 +1971,7 @@ local gamearray_methods = {
end,
_serialize = function(gar)
local strtab = { OUR_NAME..".actorvar(", tostring(gar._size), ",{" }
local strtab = { OUR_NAME.."._gamearray(", tostring(gar._size), ",{" }
gar:_cleanup()
return serialize_array(gar, strtab, gar._size)
end,

View file

@ -408,9 +408,13 @@ int32_t cansee(int32_t x1, int32_t y1, int32_t z1, int16_t sect1,
void neartag(int32_t xs, int32_t ys, int32_t zs, int16_t sectnum, int16_t ange, int16_t *neartagsector, int16_t *neartagwall,
int16_t *neartagsprite, int32_t *neartaghitdist, int32_t neartagrange, uint8_t tagsearch,
int32_t (*blacklist_sprite_func)(int32_t));
void dragpoint(int16_t pointhighlight, int32_t dax, int32_t day, uint8_t flags);
void getzrange(const vec3_t *pos, int16_t sectnum,
int32_t *ceilz, int32_t *ceilhit, int32_t *florz, int32_t *florhit,
int32_t walldist, uint32_t cliptype);
int32_t clipmovex(vec3_t *pos, int16_t *sectnum, int32_t xvect, int32_t yvect,
int32_t walldist, int32_t ceildist, int32_t flordist, uint32_t cliptype,
uint8_t noslidep);
int32_t ldist(const spritetype *s1, const spritetype *s2);
int32_t dist(const spritetype *s1, const spritetype *s2);
@ -440,6 +444,7 @@ int32_t Mulscale(int32_t a, int32_t b, int32_t sh);
local bcheck = require("bcheck")
local check_sector_idx = bcheck.sector_idx
local check_wall_idx = bcheck.wall_idx
local check_sprite_idx = bcheck.sprite_idx
local check_tile_idx = bcheck.tile_idx
@ -544,7 +549,7 @@ local walltype_mt = {
-- NOTE: Allow setting a wall to white too, but no checking of the
-- consistency invariant ".nextwall>=0 iff .nextsector>=0".
if (not (nextwall < 0)) then
bcheck.wall_idx(nextwall)
check_wall_idx(nextwall)
end
ffi.cast(walltype_ptr_ct, w).nextwall = nextwall
end,
@ -793,6 +798,13 @@ sms._nextspritestat = creategtab(ffiC.nextspritestat, ffiC.MAXSPRITES, 'nextspri
sms._prevspritesect = creategtab(ffiC.prevspritesect, ffiC.MAXSPRITES, 'prevspritesect[]')
sms._prevspritestat = creategtab(ffiC.prevspritestat, ffiC.MAXSPRITES, 'prevspritestat[]')
function static_members.wall.dragto(wallnum, pos)
check_wall_idx(wallnum)
-- TODO: some kind of validation of the position?
ffiC.dragpoint(wallnum, pos.x, pos.y, 0)
end
function static_members.sprite.changesect(spritenum, sectnum, noerr)
check_sprite_idx(spritenum)
check_sector_idx(sectnum)

View file

@ -59,8 +59,10 @@ getangle;
Mulscale;
cansee;
hitscan;
dragpoint;
neartag;
getzrange;
clipmovex;
rotatesprite_;
setaspect;

View file

@ -59,8 +59,10 @@ getangle;
Mulscale;
cansee;
hitscan;
dragpoint;
neartag;
getzrange;
clipmovex;
rotatesprite_;
setaspect;

View file

@ -1743,6 +1743,18 @@ local handle =
unpack(vals))
end,
clipmove = function(noslidep, ...)
local v = {...}
assert(#v == 11) -- 3W 1R 1W 6R
local vals = {
v[1], v[2], v[3], v[5], -- outargs
v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], -- inargs
noslidep
}
return format("%s,%s,%s,%s=_con._clipmovex("..n_s_fmt(11)..")",
unpack(vals))
end,
palfrom = function(...)
local v = {...}
return format(PLS":_palfrom(%d,%d,%d,%d)",
@ -2228,17 +2240,17 @@ local Cinner = {
ldist = cmd(W,R,R)
/ "%1=_xmath.ldist(sprite[%2],sprite[%3])",
dragpoint = cmd(R,R,R)
/ handle.NYI,
/ "wall.dragto(%1,_IV(1,%2,%3,0))",
rotatepoint = cmd(R,R,R,R,R,W,W)
/ "%6,%7=_con._rotatepoint(%1,%2,%3,%4,%5)",
-- collision detection etc.
hitscan = cmd(R,R,R,R,R,R,R,W,W,W,W,W,W,R) -- 7R 6W 1R
/ handle.hitscan,
clipmove = cmd(W,W,W,R,W,R,R,R,R,R,R)
/ handle.NYI,
clipmovenoslide = cmd(W,W,W,R,W,R,R,R,R,R,R)
/ handle.NYI,
clipmove = cmd(W,W,W,R,W,R,R,R,R,R,R) -- 3W 1R 1W 6R
/ function(...) return handle.clipmove(0, ...) end,
clipmovenoslide = cmd(W,W,W,R,W,R,R,R,R,R,R) -- 3W 1R 1W 6R
/ function(...) return handle.clipmove(1, ...) end,
lineintersect = cmd(R,R,R,R,R,R,R,R,R,R,W,W,W,W) -- 10R 4W
/ handle.NYI,
rayintersect = cmd(R,R,R,R,R,R,R,R,R,R,W,W,W,W) -- 10R 4W