From 35802d7e41bf564d496f59ae493beaa252127e43 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 10 Feb 2013 16:23:59 +0000 Subject: [PATCH] Lunatic: [gs]et{player,actor}var, access to protected projectile members. git-svn-id: https://svn.eduke32.com/eduke32@3469 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/con_lang.lua | 6 +- polymer/eduke32/source/lunatic/defs.ilua | 57 +++++++++++++------ polymer/eduke32/source/lunatic/lunacon.lua | 56 +++++++++++++----- polymer/eduke32/source/lunatic/test.elua | 4 +- .../source/lunatic/test/weaponvars.con | 2 +- 5 files changed, 89 insertions(+), 36 deletions(-) diff --git a/polymer/eduke32/source/lunatic/con_lang.lua b/polymer/eduke32/source/lunatic/con_lang.lua index 5f76bf9e2..5e425c91b 100644 --- a/polymer/eduke32/source/lunatic/con_lang.lua +++ b/polymer/eduke32/source/lunatic/con_lang.lua @@ -740,12 +740,12 @@ local ProjectileLabels = { hitradius = PROJ".hitradius", range = PROJ".range", flashcolor = PROJ".flashcolor", - spawns = { PROJ".spawns" }, + spawns = { PROJ".spawns", PROJ":set_spawns(%%s)" }, sound = PROJ".sound", isound = PROJ".isound", vel = PROJ".vel", - decal = { PROJ".decal" }, - trail = { PROJ".trail" }, + decal = { PROJ".decal", PROJ":set_decal(%%s)" }, + trail = { PROJ".trail", PROJ":set_trail(%%s)" }, tnum = PROJ".tnum", drop = PROJ".drop", offset = PROJ".offset", diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index 93881ef76..0c240d743 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -254,6 +254,25 @@ __attribute__((packed)) struct { } ]] +local PROJECTILE_STRUCT = [[ +struct { + int32_t workslike, cstat; + int32_t hitradius, range, flashcolor; + const int16_t spawns; + int16_t sound, isound, vel; + const int16_t decal, trail; + int16_t tnum, drop; + int16_t offset, bounces, bsound; + int16_t toffset; + int16_t extra, extra_rand; + int8_t sxrepeat, syrepeat, txrepeat, tyrepeat; + int8_t shade, xrepeat, yrepeat, pal; + int8_t movecnt; + uint8_t clipdist; + int8_t filler[6]; +} +]] + local randgen = require("randgen") local geom = require("geom") @@ -329,22 +348,9 @@ typedef struct { int32_t shade; } hudweapon_t; -typedef struct { - int32_t workslike, cstat; - int32_t hitradius, range, flashcolor; - const int16_t spawns; - int16_t sound, isound, vel; - const int16_t decal, trail; - int16_t tnum, drop; - int16_t offset, bounces, bsound; - int16_t toffset; - int16_t extra, extra_rand; - int8_t sxrepeat, syrepeat, txrepeat, tyrepeat; - int8_t shade, xrepeat, yrepeat, pal; - int8_t movecnt; - uint8_t clipdist; - int8_t filler[6]; -} projectile_t; +typedef +]].. PROJECTILE_STRUCT ..[[ +projectile_t; typedef struct { uint32_t flags; @@ -620,6 +626,7 @@ end -- An unrestricted actor_t pointer, for internal use: local actor_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(ACTOR_STRUCT))) local player_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(DUKEPLAYER_STRUCT))) +local projectile_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(PROJECTILE_STRUCT))) local con_action_ct = ffi.typeof("con_action_t") local con_move_ct = ffi.typeof("con_move_t") local con_ai_ct = ffi.typeof("con_ai_t") @@ -916,6 +923,24 @@ local player_mt = { } ffi.metatype("DukePlayer_t", player_mt) +local function GenProjectileSetFunc(Member) + return function(self, picnum) + if (picnum >= 0) then + check_tile_idx(picnum) + end + ffi.cast(projectile_ptr_ct, self)[Member] = picnum + end +end + +local projectile_mt = { + __index = { + set_spawns = GenProjectileSetFunc "spawns", + set_decal = GenProjectileSetFunc "decal", + set_trail = GenProjectileSetFunc "trail", + }, +} +ffi.metatype("projectile_t", projectile_mt) + --- CUSTOM "gv" VARIABLES local camera_mt = { -- TODO: "set position" method, which also updates the sectnum diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index c9f7b104f..64e8e860e 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -890,7 +890,8 @@ function Cmd.gamevar(identifier, initval, flags) end end -function lookup.gamevar(identifier, writable) +-- : code for actor or player index +function lookup.gamevar(identifier, aorpvar, writable) local gv = g_gamevar[identifier] if (gv == nil) then @@ -903,8 +904,8 @@ function lookup.gamevar(identifier, writable) return "_READONLYGV" end - if (gv.flags==GVFLAG.PERACTOR) then - return format("%s[_aci]", gv.name) + if (bit.band(gv.flags, GVFLAG.PERACTOR)~=0) then + return format("%s[%s]", gv.name, aorpvar) else return gv.name end @@ -912,7 +913,7 @@ end local function maybe_gamevar_Cmt(subj, pos, identifier) if (g_gamevar[identifier]) then - return true, lookup.gamevar(identifier) + return true, lookup.gamevar(identifier, "_aci", false) end end @@ -1125,10 +1126,10 @@ local getstructcmd = -- get[]. ()? <> local setstructcmd = -- set[].<> ()? arraypat * bothmemberpat * sp1 * tok.rvar -local getperxvarcmd = -- getvar[]. <> +local getperxvarcmd = -- getvar[]. <> arraypat * singlememberpat * sp1 * tok.wvar -local setperxvarcmd = -- setvar[].<> +local setperxvarcmd = -- setvar[].<> arraypat * singlememberpat * sp1 * tok.rvar -- Function generating code for a struct read/write access. @@ -1198,14 +1199,17 @@ local Access = } local function GetStructCmd(accessfunc) - local pattern = getstructcmd / function(idx, memb, var) + local pattern = getstructcmd / + function(idx, memb, var) return format("%s=%s", var, accessfunc(false, idx, memb)) - end + end return pattern end local function SetStructCmd(accessfunc) - local pattern = setstructcmd / function(idx, memb, var) + local pattern = setstructcmd + + local function capfunc(idx, memb, var) local membercode, ismethod = accessfunc(true, idx, memb) if (ismethod) then -- METHOD_MEMBER syntax @@ -1221,7 +1225,29 @@ local function SetStructCmd(accessfunc) return format("%s=%s", membercode, var) end end - return pattern + + return pattern / capfunc +end + +-- : whether the perxvar is set +local function GetOrSetPerxvarCmd(Setp, Actorp) + local EXPECTED_PERX_BIT = Actorp and GVFLAG.PERACTOR or GVFLAG.PERPLAYER + local pattern = (Setp and setperxvarcmd or getperxvarcmd) + + local function capfunc(idx, perxvarname, var) + local gv = g_gamevar[perxvarname] + if (gv and bit.band(gv.flags, GVFLAG.PERX_MASK)~=EXPECTED_PERX_BIT) then + errprintf("variable `%s' is not per-%s", perxvarname, Actorp and "actor" or "player") + end + + if (Setp) then + return format("%s=%s", lookup.gamevar(perxvarname, idx, true), var) + else + return format("%s=%s", var, lookup.gamevar(perxvarname, idx, false)) + end + end + + return pattern / capfunc end @@ -1306,8 +1332,8 @@ local Cinner = { -- these. getuserdef = (arraypat + sp1)/{} * singlememberpat * sp1 * tok.wvar / handle.NYI, - getactorvar = getperxvarcmd / handle.NYI, - getplayervar = getperxvarcmd / handle.NYI, + getplayervar = GetOrSetPerxvarCmd(false, false), + getactorvar = GetOrSetPerxvarCmd(false, true), setsector = SetStructCmd(Access.sector), setwall = SetStructCmd(Access.wall), @@ -1320,8 +1346,8 @@ local Cinner = { settspr = SetStructCmd(Access.tspr), setuserdef = (arraypat + sp1)/{} * singlememberpat * sp1 * tok.rvar / handle.NYI, - setactorvar = setperxvarcmd, - setplayervar = setperxvarcmd, + setplayervar = GetOrSetPerxvarCmd(true, false), + setactorvar = GetOrSetPerxvarCmd(true, true), setsprite = cmd(R,R,R,R), @@ -2136,7 +2162,7 @@ local Grammar = Pat{ -- For written-to vars, only (non-parm2) array exprs and writable gamevars -- are permitted. NOTE: C-CON doesn't support inline array exprs here. t_wvar = Var("t_singlearrayexp") / function() errprintf("t_wvar: array exprs NYI") return "_NYIVAR" end - + (tok.identifier / function(id) return lookup.gamevar(id, true) end), + + (tok.identifier / function(id) return lookup.gamevar(id, "_aci", true) end), t_move = POS()*tok.identifier / function(...) return lookup.composite(LABEL.MOVE, ...) end + diff --git a/polymer/eduke32/source/lunatic/test.elua b/polymer/eduke32/source/lunatic/test.elua index 191425ce8..42e4fadaf 100644 --- a/polymer/eduke32/source/lunatic/test.elua +++ b/polymer/eduke32/source/lunatic/test.elua @@ -264,7 +264,9 @@ gameevent(gv.EVENT_ENTERLEVEL, -- MORTER2 from test/weaponvars.con player[0].weapon.SHOTGUN.shoots = 1653 - projectile[1653].drop = 0 + local proj = projectile[1653] + proj.drop = 0 + proj:set_trail(2329) -- SMALLSMOKE t = gv.gethitickms() local N=1 diff --git a/polymer/eduke32/source/lunatic/test/weaponvars.con b/polymer/eduke32/source/lunatic/test/weaponvars.con index ce907f5c9..4c74572c1 100644 --- a/polymer/eduke32/source/lunatic/test/weaponvars.con +++ b/polymer/eduke32/source/lunatic/test/weaponvars.con @@ -18,7 +18,7 @@ defineprojectile MORTER2 PROJ_HITRADIUS 2800 defineprojectile MORTER2 PROJ_BOUNCES 4 defineprojectile MORTER2 PROJ_OFFSET 128 defineprojectile MORTER2 PROJ_CLIPDIST 24 -defineprojectile MORTER2 PROJ_TRAIL SMALLSMOKE +defineprojectile MORTER2 PROJ_TRAIL -1 // overridden in test.elua defineprojectile MORTER2 PROJ_TNUM 6 onevent EVENT_GAME