mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-24 10:40:46 +00:00
Lunatic: allow indexing some weapon/inventory arrays with their names.
git-svn-id: https://svn.eduke32.com/eduke32@3564 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
9285a9054b
commit
ef464f2a1d
3 changed files with 57 additions and 34 deletions
|
@ -26,11 +26,19 @@ module(...)
|
|||
-- For example, for 4 elements,
|
||||
-- "const $ _r1, _f2, _u3, _n4;"
|
||||
function flatten_array(nelts, rng)
|
||||
local strtab = { "const $ " }
|
||||
local strtab = { "$ " }
|
||||
|
||||
for i=1,nelts do
|
||||
local ch = 97 + (rng and (rng:getu32() % 25) or 0) -- 'a'..'z'
|
||||
strtab[i+1] = string.format("_%c%x%s", ch, i, (i<nelts) and "," or ";")
|
||||
if (rng and rng.getu32==nil) then
|
||||
assert(type(rng)=="table")
|
||||
|
||||
for i=1,#rng do
|
||||
strtab[i+1] = rng[i]..((i<#rng) and "," or ";")
|
||||
end
|
||||
else
|
||||
for i=1,nelts do
|
||||
local ch = 97 + (rng and (rng:getu32() % 25) or 0) -- 'a'..'z'
|
||||
strtab[i+1] = string.format("_%c%x%s", ch, i, (i<nelts) and "," or ";")
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(strtab)
|
||||
|
@ -44,6 +52,7 @@ end
|
|||
-- <typename>: If non-nil, the name under which the derived type is typedef'd
|
||||
-- <rng>: Random generator state + method :getu32(). If nil, then members are
|
||||
-- named _a1, _a2, ...
|
||||
-- It also may be a table containing member names at numeric indices 1..#rng.
|
||||
-- <mtadd>: A table containing functions __index and/or __newindex. They are
|
||||
-- called first and the bound-checking ones are tail-called then.
|
||||
function new(basetype, numelts, showname, typename, rng, mtadd)
|
||||
|
@ -72,6 +81,7 @@ function new(basetype, numelts, showname, typename, rng, mtadd)
|
|||
local addindexf, addnewindexf = mtadd.__index, mtadd.__newindex
|
||||
|
||||
if (addindexf) then
|
||||
-- Additional __index metamethod given.
|
||||
mt.__index = function(ar, idx)
|
||||
addindexf(ar, idx)
|
||||
return curindexf(ar, idx)
|
||||
|
@ -79,6 +89,7 @@ function new(basetype, numelts, showname, typename, rng, mtadd)
|
|||
end
|
||||
|
||||
if (addnewindexf) then
|
||||
-- Additional __newindex metamethod given.
|
||||
mt.__newindex = function(ar, idx, val)
|
||||
addnewindexf(ar, idx, val)
|
||||
return curnewindexf(ar, idx, val)
|
||||
|
|
|
@ -63,43 +63,51 @@ local print = print
|
|||
|
||||
---=== EDuke32 game definitions ===---
|
||||
|
||||
local INV_NAMES = {
|
||||
"STEROIDS",
|
||||
"SHIELD",
|
||||
"SCUBA",
|
||||
"HOLODUKE",
|
||||
"JETPACK",
|
||||
"DUMMY1",
|
||||
"ACCESS",
|
||||
"HEATS",
|
||||
"DUMMY2",
|
||||
"FIRSTAID",
|
||||
"BOOTS",
|
||||
}
|
||||
|
||||
local WEAPON_NAMES = {
|
||||
"KNEE",
|
||||
"PISTOL",
|
||||
"SHOTGUN",
|
||||
"CHAINGUN",
|
||||
"RPG",
|
||||
"HANDBOMB",
|
||||
"SHRINKER",
|
||||
"DEVISTATOR",
|
||||
"TRIPBOMB",
|
||||
"FREEZE",
|
||||
"HANDREMOTE",
|
||||
"GROW",
|
||||
}
|
||||
|
||||
---- game structs ----
|
||||
ffi.cdef[[
|
||||
ffi.cdef([[
|
||||
enum dukeinv_t {
|
||||
GET_STEROIDS,
|
||||
GET_SHIELD,
|
||||
GET_SCUBA,
|
||||
GET_HOLODUKE,
|
||||
GET_JETPACK,
|
||||
GET_DUMMY1,
|
||||
GET_ACCESS,
|
||||
GET_HEATS,
|
||||
GET_DUMMY2,
|
||||
GET_FIRSTAID,
|
||||
GET_BOOTS,
|
||||
]].. "GET_"..table.concat(INV_NAMES, ",GET_") ..[[,
|
||||
GET_MAX
|
||||
};
|
||||
|
||||
enum dukeweapon_t {
|
||||
KNEE_WEAPON,
|
||||
PISTOL_WEAPON,
|
||||
SHOTGUN_WEAPON,
|
||||
CHAINGUN_WEAPON,
|
||||
RPG_WEAPON,
|
||||
HANDBOMB_WEAPON,
|
||||
SHRINKER_WEAPON,
|
||||
DEVISTATOR_WEAPON,
|
||||
TRIPBOMB_WEAPON,
|
||||
FREEZE_WEAPON,
|
||||
HANDREMOTE_WEAPON,
|
||||
GROW_WEAPON,
|
||||
]].. table.concat(WEAPON_NAMES, "_WEAPON,").."_WEAPON," ..[[
|
||||
MAX_WEAPONS
|
||||
};
|
||||
|
||||
enum {
|
||||
MAXPLAYERS = 16,
|
||||
};
|
||||
]]
|
||||
]])
|
||||
|
||||
ffi.cdef[[
|
||||
struct action {
|
||||
|
@ -161,10 +169,9 @@ local check_sprite_idx = bcheck.sprite_idx
|
|||
local check_weapon_idx, check_inventory_idx = bcheck.weapon_idx, bcheck.inventory_idx
|
||||
local check_sound_idx = bcheck.sound_idx
|
||||
|
||||
-- TODO: randomize member names
|
||||
bcarray.new("int16_t", 64, "loogie", "int16_x_64")
|
||||
bcarray.new("int16_t", ffiC.MAX_WEAPONS, "weapon", "int16_x_MAX_WEAPONS")
|
||||
bcarray.new("int16_t", ffiC.GET_MAX, "inventory", "int16_x_GET_MAX")
|
||||
bcarray.new("int16_t", 64, "loogie", "int16_x_64") -- TODO: randomize member names
|
||||
bcarray.new("int16_t", ffiC.MAX_WEAPONS, "weapon", "int16_x_MAX_WEAPONS", WEAPON_NAMES)
|
||||
bcarray.new("int16_t", ffiC.GET_MAX, "inventory", "int16_x_GET_MAX", INV_NAMES)
|
||||
|
||||
-- NOTE: writing e.g. "ps.jetpack_on" in Lua when "ps.jetpack_on~=0" was meant
|
||||
-- is probably one of the most commonly committed errors, so we make it a bool
|
||||
|
|
|
@ -141,7 +141,7 @@ checkfail('sprite._nextspritesect[4] = -666', "cannot write directly to nextspri
|
|||
-- we're indexing a plain array!
|
||||
checkfail('print(sprite._nextspritesect[4].whatfield)', "attempt to index a number value")
|
||||
|
||||
-- creating new keys forbidden... handled by LuaJit
|
||||
-- creating new keys forbidden... handled by LuaJIT
|
||||
checkfail('wall[4].QWE = 123', "has no member named 'QWE'")
|
||||
|
||||
-- our 'require' has only safe stuff
|
||||
|
@ -278,10 +278,15 @@ gameevent(gv.EVENT_ENTERLEVEL,
|
|||
gv.ksqrt(0xffffffff), math.sqrt(0xffffffff))
|
||||
|
||||
local pl = player[0]
|
||||
-- MAX < current is "allowed"
|
||||
pl.max_ammo_amount[gv.RPG_WEAPON] = 17
|
||||
pl:give_weapon(gv.RPG_WEAPON)
|
||||
pl.ammo_amount[gv.RPG_WEAPON] = 54
|
||||
|
||||
pl:give_weapon(gv.SHRINKER_WEAPON)
|
||||
-- This looks much prettier:
|
||||
pl.ammo_amount.SHRINKER = 2
|
||||
|
||||
-- MORTER2 from test/weaponvars.con
|
||||
player[0].weapon.SHOTGUN.shoots = 1653
|
||||
local proj = projectile[1653]
|
||||
|
|
Loading…
Reference in a new issue