diff --git a/polymer/eduke32/source/lunatic/control.lua b/polymer/eduke32/source/lunatic/control.lua index 4235ae837..44f092882 100644 --- a/polymer/eduke32/source/lunatic/control.lua +++ b/polymer/eduke32/source/lunatic/control.lua @@ -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, diff --git a/polymer/eduke32/source/lunatic/defs_common.lua b/polymer/eduke32/source/lunatic/defs_common.lua index d60e43bfa..bf4d924c9 100644 --- a/polymer/eduke32/source/lunatic/defs_common.lua +++ b/polymer/eduke32/source/lunatic/defs_common.lua @@ -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) diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index b8775daf8..e17162422 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -59,8 +59,10 @@ getangle; Mulscale; cansee; hitscan; +dragpoint; neartag; getzrange; +clipmovex; rotatesprite_; setaspect; diff --git a/polymer/eduke32/source/lunatic/dynsymlist_m32 b/polymer/eduke32/source/lunatic/dynsymlist_m32 index 75adf45b6..193e16621 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist_m32 +++ b/polymer/eduke32/source/lunatic/dynsymlist_m32 @@ -59,8 +59,10 @@ getangle; Mulscale; cansee; hitscan; +dragpoint; neartag; getzrange; +clipmovex; rotatesprite_; setaspect; diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index 0a66a4ec6..72f68cfde 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -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