Lunatic (translator): more commands, add some "length" methods to vec* types.

git-svn-id: https://svn.eduke32.com/eduke32@3487 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-02-16 18:53:04 +00:00
parent 6816afe07e
commit b489a62a93
6 changed files with 149 additions and 33 deletions

View file

@ -271,6 +271,19 @@ function _myos(x, y, zoom, tilenum, shade, orientation, pal)
ffiC.G_DrawTileGeneric(x, y, zoom, tilenum, shade, orientation, pal) ffiC.G_DrawTileGeneric(x, y, zoom, tilenum, shade, orientation, pal)
end end
function _inittimer(ticspersec)
if (not (ticspersec >= 1)) then
error("ticspersec must be >= 1", 2)
end
ffiC.G_InitTimer(ticspersec)
end
function _gettimedate()
v = ffi.new("int32_t [8]")
ffiC.G_GetTimeDate(v)
return v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]
end
function rnd(x) function rnd(x)
return (bit.rshift(ffiC.krand(), 8) >= (255-x)) return (bit.rshift(ffiC.krand(), 8) >= (255-x))
end end
@ -295,6 +308,31 @@ function _mod(a,b)
return (math.fmod(a,b)) return (math.fmod(a,b))
end end
-- Sect_ToggleInterpolation() clone
function _togglesectinterp(sectnum, doset)
for w in wallsofsect(sectnum) do
ffiC.G_ToggleWallInterpolation(w, doset)
local nw = wall[w].nextwall
if (nw >= 0) then
ffiC.G_ToggleWallInterpolation(nw, doset)
ffiC.G_ToggleWallInterpolation(wall[nw].point2, doset)
end
end
end
--- player/actor/sprite searching functions ---
local function A_FP_ManhattanDist(ps, spr)
return (ps.pos - spr^(28*256)):blen1()
end
-- Returns: player index, distance
-- TODO: MP case
function _findplayer(ps, spritenum)
return 0, A_FP_ManhattanDist(ps, sprite[spritenum])
end
---=== Weapon stuff ===--- ---=== Weapon stuff ===---
@ -362,6 +400,7 @@ end
local D = { local D = {
-- TODO: dynamic tile remapping -- TODO: dynamic tile remapping
ACTIVATOR = 2, ACTIVATOR = 2,
MASTERSWITCH = 8,
RESPAWN = 9, RESPAWN = 9,
APLAYER = 1405, APLAYER = 1405,
@ -675,6 +714,35 @@ function _operate(spritenum)
end end
end end
function _operatesectors(sectnum, spritenum)
check_sector_idx(sectnum)
check_sprite_idx(spritenum) -- XXX: -1 permissible under certain circumstances?
ffiC.G_OperateSectors(sectnum, spritenum)
end
function _operateactivators(tag, playernum)
check_player_idx(playernum)
-- NOTE: passing oob playernum would be safe because G_OperateActivators
-- bound-checks it
ffiC.G_OperateActivators(tag, playernum)
end
function _activatebysector(sectnum, spritenum)
local didit = false
for i in spriteofsect(sectnum) do
if (sprite[i].picnum==D.ACTIVATOR) then
ffiC.G_OperateActivators(sprite[i].lotag, -1)
end
end
if (didit) then
_operatesectors(sectnum, spritenum)
end
end
function _checkactivatormotion(tag)
return ffiC.G_CheckActivatorMotion(tag)
end
function _endofgame(pli, timebeforeexit) function _endofgame(pli, timebeforeexit)
player[pli].timebeforeexit = timebeforeexit player[pli].timebeforeexit = timebeforeexit
player[pli].customexitsound = -1 player[pli].customexitsound = -1
@ -944,7 +1012,7 @@ function _flash(spr, ps)
ffiC.lastvisinc = ffiC.totalclock+32 ffiC.lastvisinc = ffiC.totalclock+32
end end
local function G_OperateRespawns(tag) function _G_OperateRespawns(tag)
for i in spritesofstat(ffiC.STAT_FX) do for i in spritesofstat(ffiC.STAT_FX) do
local spr = sprite[i] local spr = sprite[i]
@ -962,6 +1030,15 @@ local function G_OperateRespawns(tag)
end end
end end
function _G_OperateMasterSwitches(tag)
for i in spritesofstat(ffiC.STAT_STANDABLE) do
local spr = sprite[i]
if (spr.picnum==D.MASTERSWITCH and spr.lotag==tag and spr.yvel==0) then
spr:_set_yvel(1)
end
end
end
local RESPAWN_USE_YVEL = local RESPAWN_USE_YVEL =
{ {
[D.STATUE] = true, [D.STATUE] = true,
@ -982,10 +1059,10 @@ local RESPAWN_USE_YVEL =
function _respawnhitag(spr) function _respawnhitag(spr)
if (RESPAWN_USE_YVEL[spr.picnum]) then if (RESPAWN_USE_YVEL[spr.picnum]) then
if (spr.yvel ~= 0) then if (spr.yvel ~= 0) then
G_OperateRespawns(spr.yvel) _G_OperateRespawns(spr.yvel)
end end
else else
G_OperateRespawns(spr.hitag) _G_OperateRespawns(spr.hitag)
end end
end end

View file

@ -515,6 +515,8 @@ void VM_FallSprite(int32_t i);
int32_t VM_ResetPlayer2(int32_t snum); int32_t VM_ResetPlayer2(int32_t snum);
void A_RadiusDamage(int32_t i, int32_t r, int32_t, int32_t, int32_t, int32_t); void A_RadiusDamage(int32_t i, int32_t r, int32_t, int32_t, int32_t, int32_t);
void G_OperateSectors(int32_t sn, int32_t ii); void G_OperateSectors(int32_t sn, int32_t ii);
void G_OperateActivators(int32_t low,int32_t snum);
int32_t G_CheckActivatorMotion(int32_t lotag);
int32_t A_Dodge(spritetype *s); int32_t A_Dodge(spritetype *s);
int32_t A_InsertSprite(int32_t whatsect,int32_t s_x,int32_t s_y,int32_t s_z,int32_t s_pn,int32_t s_s, int32_t A_InsertSprite(int32_t whatsect,int32_t s_x,int32_t s_y,int32_t s_z,int32_t s_pn,int32_t s_s,
int32_t s_xr,int32_t s_yr,int32_t s_a,int32_t s_ve,int32_t s_zv,int32_t s_ow,int32_t s_ss); int32_t s_xr,int32_t s_yr,int32_t s_a,int32_t s_ve,int32_t s_zv,int32_t s_ow,int32_t s_ss);
@ -524,6 +526,9 @@ void P_DoQuote(int32_t q, DukePlayer_t *p);
void G_ClearCameraView(DukePlayer_t *ps); void G_ClearCameraView(DukePlayer_t *ps);
void G_DrawTileGeneric(int32_t x, int32_t y, int32_t zoom, int32_t tilenum, void G_DrawTileGeneric(int32_t x, int32_t y, int32_t zoom, int32_t tilenum,
int32_t shade, int32_t orientation, int32_t p); int32_t shade, int32_t orientation, int32_t p);
void G_InitTimer(int32_t ticspersec);
void G_GetTimeDate(int32_t *vals);
int32_t G_ToggleWallInterpolation(int32_t w, int32_t doset);
int32_t A_CheckAnySoundPlaying(int32_t i); int32_t A_CheckAnySoundPlaying(int32_t i);
int32_t A_PlaySound(uint32_t num, int32_t i); int32_t A_PlaySound(uint32_t num, int32_t i);

View file

@ -10,6 +10,7 @@ local ffiC = ffi.C
ffi.cdef "enum { _DEBUG_LUNATIC=1 }" ffi.cdef "enum { _DEBUG_LUNATIC=1 }"
local bit = require("bit") local bit = require("bit")
local math = require("math")
local string = require("string") local string = require("string")
local table = require("table") local table = require("table")
@ -280,16 +281,29 @@ local check_sector_idx = bcheck.sector_idx
local check_sprite_idx = bcheck.sprite_idx local check_sprite_idx = bcheck.sprite_idx
local check_tile_idx = bcheck.tile_idx local check_tile_idx = bcheck.tile_idx
local band = bit.band
local bor = bit.bor
local bnot = bit.bnot
local lshift = bit.lshift
local rshift = bit.rshift
local xor = bit.bxor
local ivec3_ local ivec3_
local ivec3_mt = { local ivec3_mt = {
-- '^' is the "translate upwards" operator -- '^' is the "translate upwards" operator
__pow = function(v, zofs) __pow = function(v, zofs)
return ivec3_(v.x, v.y, v.z-zofs) return ivec3_(v.x, v.y, v.z-zofs)
end, end,
__index = {
-- Manhattan distance with z right-shifted by 4 bits
blen1 = function(v)
return math.abs(v.x) + math.abs(v.y) + math.abs(bit.arshift(v.z,4))
end,
},
} }
ivec3_ = ffi.metatype(vec3_ct, ivec3_mt) ivec3_ = ffi.metatype(vec3_ct, ivec3_mt)
local xor = bit.bxor
local wallsofsec -- fwd-decl local wallsofsec -- fwd-decl
local sectortype_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(SECTOR_STRUCT))) local sectortype_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(SECTOR_STRUCT)))
@ -342,12 +356,6 @@ local sectortype_mt = {
} }
ffi.metatype("sectortype", sectortype_mt) ffi.metatype("sectortype", sectortype_mt)
local band = bit.band
local bor = bit.bor
local bnot = bit.bnot
local lshift = bit.lshift
local rshift = bit.rshift
local walltype_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(WALL_STRUCT))) local walltype_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(WALL_STRUCT)))
local walltype_mt = { local walltype_mt = {

View file

@ -133,6 +133,8 @@ VM_FallSprite;
VM_ResetPlayer2; VM_ResetPlayer2;
A_RadiusDamage; A_RadiusDamage;
G_OperateSectors; G_OperateSectors;
G_OperateActivators;
G_CheckActivatorMotion;
A_Dodge; A_Dodge;
A_InsertSprite; A_InsertSprite;
A_Spawn; A_Spawn;
@ -140,6 +142,9 @@ A_AddToDeleteQueue;
P_DoQuote; P_DoQuote;
G_ClearCameraView; G_ClearCameraView;
G_DrawTileGeneric; G_DrawTileGeneric;
G_InitTimer;
G_GetTimeDate;
G_ToggleWallInterpolation;
A_CheckAnySoundPlaying; A_CheckAnySoundPlaying;
A_PlaySound; A_PlaySound;

View file

@ -50,6 +50,8 @@ local vec2_mt = {
__index = { __index = {
lensq = function(a) return a.x*a.x + a.y*a.y end, lensq = function(a) return a.x*a.x + a.y*a.y end,
-- Manhattan distance:
len1 = function(a) return math.abs(a.x)+math.abs(a.y) end,
}, },
} }
@ -88,6 +90,8 @@ local vec3_mt = {
__index = { __index = {
lensq = function(a) return a.x*a.x + a.y*a.y + a.z*a.z end, lensq = function(a) return a.x*a.x + a.y*a.y + a.z*a.z end,
-- Manhattan distance:
len1 = function(a) return math.abs(a.x)+math.abs(a.y)+math.abs(a.z) end,
}, },
} }
@ -98,7 +102,8 @@ vec2_ = ffi.metatype(dvec2_t, vec2_mt)
vec2 = vec2_ vec2 = vec2_
-- Returns a vec2 from anything indexable with "x" and "y" -- Returns a vec2 from anything indexable with "x" and "y"
-- (vec2(t) works if t is such a table, but not if it's a vec2 or other cdata) -- (vec2(t) works if t is such a table, but not if it's a vec2 or a cdata of
-- different type)
function tovec2(t) return vec2(t.x, t.y) end function tovec2(t) return vec2(t.x, t.y) end
-- Same for vec3 -- Same for vec3

View file

@ -1353,8 +1353,7 @@ local Cinner = {
-- NOTE2: userdef has at least three members with a second parameter: -- NOTE2: userdef has at least three members with a second parameter:
-- user_name, ridecule, savegame. Then there's wchoice. Given that they're -- user_name, ridecule, savegame. Then there's wchoice. Given that they're
-- arrays, I highly doubt that they worked (much less were safe) in CON. -- arrays, I highly doubt that they worked (much less were safe) in CON.
-- We disallow them unless CONs in the wild crop up that actually used -- We disallow them, recent EDuke32 versions didn't expose them either.
-- these.
getuserdef = GetStructCmd(Access.userdef, userdef_common_pat * tok.wvar), getuserdef = GetStructCmd(Access.userdef, userdef_common_pat * tok.wvar),
getplayervar = GetOrSetPerxvarCmd(false, false), getplayervar = GetOrSetPerxvarCmd(false, false),
@ -1448,13 +1447,18 @@ local Cinner = {
/ "_con._A_RadiusDamage(_aci,%1,%2,%3,%4,%5)", / "_con._A_RadiusDamage(_aci,%1,%2,%3,%4,%5)",
-- some commands taking read vars -- some commands taking read vars
operaterespawns = cmd(R), operaterespawns = cmd(R)
operatemasterswitches = cmd(R), / "_con._G_OperateRespawns(%1)",
checkactivatormotion = cmd(R), operatemasterswitches = cmd(R)
/ "_con._G_OperateMasterSwitches(%1)",
checkactivatormotion = cmd(R)
/ CSV".RETURN=_con._checkactivatormotion(%1)",
time = cmd(R) -- no-op time = cmd(R) -- no-op
/ "", / "",
inittimer = cmd(R), inittimer = cmd(R)
lockplayer = cmd(R), / "_con._inittimer(%1)",
lockplayer = cmd(R)
/ PLS".transporter_hold=%1",
quake = cmd(R) quake = cmd(R)
/ "gv.doQuake(%1,81)", -- EARTHQUAKE / "gv.doQuake(%1,81)", -- EARTHQUAKE
jump = cmd(R) jump = cmd(R)
@ -1471,7 +1475,8 @@ local Cinner = {
/ "_con._echo(%1)", / "_con._echo(%1)",
starttrackvar = cmd(R), starttrackvar = cmd(R),
clearmapstate = cmd(R), clearmapstate = cmd(R),
activatecheat = cmd(R), activatecheat = cmd(R)
/ handle.NYI,
setgamepalette = cmd(R), setgamepalette = cmd(R),
-- Sound commands -- Sound commands
@ -1605,8 +1610,10 @@ local Cinner = {
/ PLS":wack()", / PLS":wack()",
-- player/sprite searching -- player/sprite searching
findplayer = cmd(W), findplayer = cmd(W)
findotherplayer = cmd(W), / CSV".RETURN,%1=_con._findplayer(_pli,_aci)", -- player index, distance
findotherplayer = cmd(W)
/ CSV".RETURN,%1=0,0x7fffffff", -- TODO: MP case
findnearspritezvar = cmd(D,R,R,W), findnearspritezvar = cmd(D,R,R,W),
findnearspritez = cmd(D,D,D,W), findnearspritez = cmd(D,D,D,W),
findnearsprite3dvar = cmd(D,R,W), findnearsprite3dvar = cmd(D,R,W),
@ -1632,8 +1639,11 @@ local Cinner = {
-- array stuff -- array stuff
copy = sp1 * tok.identifier * arraypat * sp1 * tok.identifier * arraypat * sp1 * tok.rvar, copy = sp1 * tok.identifier * arraypat * sp1 * tok.identifier * arraypat * sp1 * tok.rvar,
setarray = sp1 * tok.identifier * arraypat * sp1 * tok.rvar, setarray = sp1 * tok.identifier * arraypat * sp1 * tok.rvar,
resizearray = cmd(I,R),
getarraysize = cmd(I,W),
readarrayfromfile = cmd(I,D),
writearraytofile = cmd(I,D),
activatebysector = cmd(R,R),
addlogvar = cmd(R) addlogvar = cmd(R)
/ handle.addlogvar, / handle.addlogvar,
addlog = cmd() * #sp1 addlog = cmd() * #sp1
@ -1669,11 +1679,18 @@ local Cinner = {
savemapstate = cmd(), savemapstate = cmd(),
movesprite = cmd(R,R,R,R,R,W), movesprite = cmd(R,R,R,R,R,W),
neartag = cmd(R,R,R,R,R,W,W,W,W,R,R), neartag = cmd(R,R,R,R,R,W,W,W,W,R,R),
operateactivators = cmd(R,R),
operatesectors = cmd(R,R),
palfrom = (sp1 * tok.define)^-4 palfrom = (sp1 * tok.define)^-4
/ handle.palfrom, / handle.palfrom,
activatebysector = cmd(R,R)
/ "_con._activatebysector(%1,%2)",
operateactivators = cmd(R,R) -- THISACTOR
/ function(tag, pli)
return format("_con._operateactivators(%s,%s)", tag,
(pli=="_aci") and "_pli" or pli)
end,
operatesectors = cmd(R,R)
/ "_con._operatesectors(%1,%2)",
operate = cmd() * #sp1 operate = cmd() * #sp1
/ "_con._operate(_aci)", / "_con._operate(_aci)",
@ -1693,21 +1710,19 @@ local Cinner = {
prevspritesect = cmd(W,R), prevspritesect = cmd(W,R),
prevspritestat = cmd(W,R), prevspritestat = cmd(W,R),
readarrayfromfile = cmd(I,D),
writearraytofile = cmd(I,D),
redefinequote = sp1 * tok.define * newline_term_string redefinequote = sp1 * tok.define * newline_term_string
/ function(qnum, qstr) return format("_con._definequote(%d,%q)", qnum, stripws(qstr)) end, / function(qnum, qstr) return format("_con._definequote(%d,%q)", qnum, stripws(qstr)) end,
resizearray = cmd(I,R),
getarraysize = cmd(I,W),
rotatepoint = cmd(R,R,R,R,R,W,W), rotatepoint = cmd(R,R,R,R,R,W,W),
rotatesprite = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R rotatesprite = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R
/ handle.rotatesprite, / handle.rotatesprite,
rotatesprite16 = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R rotatesprite16 = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R
/ handle.rotatesprite16, / handle.rotatesprite16,
sectorofwall = cmd(W,R,R), sectorofwall = cmd(W,R,R)
sectclearinterpolation = cmd(R), / handle.NYI,
sectsetinterpolation = cmd(R), sectclearinterpolation = cmd(R)
/ "_con._togglesectinterp(%1,0)",
sectsetinterpolation = cmd(R)
/ "_con._togglesectinterp(%1,1)",
sectgethitag = cmd() sectgethitag = cmd()
/ (CSV".HITAG=sector["..SPS".sectnum].hitag"), / (CSV".HITAG=sector["..SPS".sectnum].hitag"),
@ -1756,7 +1771,8 @@ local Cinner = {
getpname = cmd(R,R), getpname = cmd(R,R),
getticks = cmd(W) getticks = cmd(W)
/ "%1=gv.getticks()", / "%1=gv.getticks()",
gettimedate = cmd(W,W,W,W,W,W,W,W), gettimedate = cmd(W,W,W,W,W,W,W,W)
/ "%1,%2,%3,%4,%5,%6,%7,%8=_con._gettimedate()",
getzrange = cmd(R,R,R,R,W,W,W,W,R,R), getzrange = cmd(R,R,R,R,W,W,W,W,R,R),
setaspect = cmd(R,R), setaspect = cmd(R,R),