mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-24 18:50:47 +00:00
Lunatic: gasping for some air.
That is, fix some oversights introduced in the preceding runs. listglobals.sh is a helper to find global accesses. Translator: add "number-conversion" warning option, max. error limit. git-svn-id: https://svn.eduke32.com/eduke32@3256 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
2212e4e6f8
commit
541fca6dac
4 changed files with 79 additions and 49 deletions
|
@ -18,6 +18,8 @@ local cansee = defs_c.cansee
|
||||||
local neartag = defs_c.neartag
|
local neartag = defs_c.neartag
|
||||||
local inside = defs_c.inside
|
local inside = defs_c.inside
|
||||||
|
|
||||||
|
-- NOTE FOR RELEASE: the usually global stuff like "sprite" etc. ought to be
|
||||||
|
-- accessed as locals here
|
||||||
|
|
||||||
module(...)
|
module(...)
|
||||||
|
|
||||||
|
@ -148,6 +150,8 @@ end
|
||||||
|
|
||||||
local function P_AddAmmo(ps, weap, amount)
|
local function P_AddAmmo(ps, weap, amount)
|
||||||
if (not have_ammo_at_max(ps, weap)) then
|
if (not have_ammo_at_max(ps, weap)) then
|
||||||
|
local curamount = ps:get_ammo_amount(weap)
|
||||||
|
local maxamount = ps:get_max_ammo_amount(weap)
|
||||||
-- NOTE: no clamping towards the bottom
|
-- NOTE: no clamping towards the bottom
|
||||||
ps:set_ammo_amount(weap, math.min(curamount+amount, maxamount))
|
ps:set_ammo_amount(weap, math.min(curamount+amount, maxamount))
|
||||||
end
|
end
|
||||||
|
@ -156,7 +160,7 @@ end
|
||||||
local function P_AddWeaponAmmoCommon(ps, weap, amount)
|
local function P_AddWeaponAmmoCommon(ps, weap, amount)
|
||||||
P_AddAmmo(ps, weap, amount)
|
P_AddAmmo(ps, weap, amount)
|
||||||
|
|
||||||
if (ps.curr_weapon==KNEE_WEAPON and have_weapon(weap)) then
|
if (ps.curr_weapon==ffiC.KNEE_WEAPON and have_weapon(weap)) then
|
||||||
ffiC.P_AddWeaponMaybeSwitch(ps, weap);
|
ffiC.P_AddWeaponMaybeSwitch(ps, weap);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -281,11 +285,11 @@ end
|
||||||
|
|
||||||
-- The return value is true iff the ammo was at the weapon's max.
|
-- The return value is true iff the ammo was at the weapon's max.
|
||||||
-- In that case, no action is taken.
|
-- In that case, no action is taken.
|
||||||
function _addammo(ps, weapon, amount)
|
function _addammo(ps, weap, amount)
|
||||||
return have_ammo_at_max(ps, weap) or P_AddWeaponAmmoCommon(ps, weap, amount)
|
return have_ammo_at_max(ps, weap) or P_AddWeaponAmmoCommon(ps, weap, amount)
|
||||||
end
|
end
|
||||||
|
|
||||||
function _addweapon(ps, weapon, amount)
|
function _addweapon(ps, weap, amount)
|
||||||
if (weap >= ffiC.MAX_WEAPONS+0ULL) then
|
if (weap >= ffiC.MAX_WEAPONS+0ULL) then
|
||||||
error("Invalid weapon ID "..weap, 2)
|
error("Invalid weapon ID "..weap, 2)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
-- INTERNAL
|
-- INTERNAL
|
||||||
-- definitions of BUILD and game types for the Lunatic Interpreter
|
-- definitions of BUILD and game types for the Lunatic Interpreter
|
||||||
|
|
||||||
_EDUKE32_LUNATIC = true
|
local require = require
|
||||||
|
|
||||||
local ffi = require("ffi")
|
local ffi = require("ffi")
|
||||||
local ffiC = ffi.C
|
local ffiC = ffi.C
|
||||||
|
|
||||||
|
@ -10,7 +9,22 @@ local bit = bit
|
||||||
local string = string
|
local string = string
|
||||||
local table = table
|
local table = table
|
||||||
local math = math
|
local math = math
|
||||||
|
|
||||||
|
local assert = assert
|
||||||
|
local error = error
|
||||||
|
local ipairs = ipairs
|
||||||
|
local loadstring = loadstring
|
||||||
|
local pairs = pairs
|
||||||
|
local rawget = rawget
|
||||||
|
local rawset = rawset
|
||||||
|
local setmetatable = setmetatable
|
||||||
|
local setfenv = setfenv
|
||||||
|
local tonumber = tonumber
|
||||||
|
local type = type
|
||||||
|
|
||||||
local print = print
|
local print = print
|
||||||
|
local tostring = tostring
|
||||||
|
|
||||||
|
|
||||||
--== First, load the definitions common to the game's and editor's Lua interface.
|
--== First, load the definitions common to the game's and editor's Lua interface.
|
||||||
|
|
||||||
|
@ -43,29 +57,13 @@ end
|
||||||
|
|
||||||
-- load the common definitions!
|
-- load the common definitions!
|
||||||
local defs_c = require("defs_common")
|
local defs_c = require("defs_common")
|
||||||
|
local cansee = defs_c.cansee
|
||||||
local strip_const = defs_c.strip_const
|
local strip_const = defs_c.strip_const
|
||||||
local setmtonce = defs_c.setmtonce
|
local setmtonce = defs_c.setmtonce
|
||||||
|
|
||||||
|
|
||||||
---=== EDuke32 game definitions ===---
|
---=== EDuke32 game definitions ===---
|
||||||
|
|
||||||
-- array -> element flattening inside structs,
|
|
||||||
-- e.g. int32_t a[4] --> int32_t _a0, _a1, _a2, _a3;
|
|
||||||
local function repeat_n_elts(type, namebase, num)
|
|
||||||
local strbuf = { "const "..type.." " }
|
|
||||||
|
|
||||||
for i=1,num do
|
|
||||||
local str = namebase..tostring(i-1)
|
|
||||||
if (i < num) then
|
|
||||||
str = str..","
|
|
||||||
end
|
|
||||||
strbuf[#strbuf+1] = str
|
|
||||||
end
|
|
||||||
strbuf[#strbuf+1] = ";"
|
|
||||||
|
|
||||||
return table.concat(strbuf)
|
|
||||||
end
|
|
||||||
|
|
||||||
---- game structs ----
|
---- game structs ----
|
||||||
ffi.cdef[[
|
ffi.cdef[[
|
||||||
enum dukeinv_t {
|
enum dukeinv_t {
|
||||||
|
@ -449,17 +447,6 @@ int32_t kread(int32_t handle, void *buffer, int32_t leng);
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
|
||||||
local assert = assert
|
|
||||||
local error = error
|
|
||||||
local ipairs = ipairs
|
|
||||||
local loadstring = loadstring
|
|
||||||
local pairs = pairs
|
|
||||||
local rawget = rawget
|
|
||||||
local rawset = rawset
|
|
||||||
local setmetatable = setmetatable
|
|
||||||
local setfenv = setfenv
|
|
||||||
local type = type
|
|
||||||
|
|
||||||
-- http://lua-users.org/wiki/SandBoxes says "potentially unsafe"
|
-- http://lua-users.org/wiki/SandBoxes says "potentially unsafe"
|
||||||
-- as it allows to see implementations of functions.
|
-- as it allows to see implementations of functions.
|
||||||
--local string_dump = string.dump
|
--local string_dump = string.dump
|
||||||
|
@ -614,7 +601,7 @@ local actor_mt = {
|
||||||
local oa = a
|
local oa = a
|
||||||
a = ffi.cast(actor_ptr_ct, a)
|
a = ffi.cast(actor_ptr_ct, a)
|
||||||
|
|
||||||
if (type(mov)=="string") then
|
if (type(ai)=="string") then
|
||||||
ai = AI[ai];
|
ai = AI[ai];
|
||||||
end
|
end
|
||||||
-- TODO: literal number AIs?
|
-- TODO: literal number AIs?
|
||||||
|
@ -634,7 +621,7 @@ local actor_mt = {
|
||||||
has_ai = function(a, ai)
|
has_ai = function(a, ai)
|
||||||
a = ffi.cast(actor_ptr_ct, a)
|
a = ffi.cast(actor_ptr_ct, a)
|
||||||
|
|
||||||
if (type(mov)=="string") then
|
if (type(ai)=="string") then
|
||||||
ai = AI[ai];
|
ai = AI[ai];
|
||||||
end
|
end
|
||||||
if (ffi.istype(con_ai_ct, ai)) then
|
if (ffi.istype(con_ai_ct, ai)) then
|
||||||
|
@ -957,7 +944,6 @@ G_._VERSION = _VERSION
|
||||||
G_._G = G_
|
G_._G = G_
|
||||||
|
|
||||||
--- non-default data and functions
|
--- non-default data and functions
|
||||||
G_._EDUKE32_LUNATIC = _EDUKE32_LUNATIC
|
|
||||||
G_.gameevent = gameevent -- included in lunatic.c
|
G_.gameevent = gameevent -- included in lunatic.c
|
||||||
G_.gameactor = gameactor -- included in lunatic.c
|
G_.gameactor = gameactor -- included in lunatic.c
|
||||||
G_.player = player -- from above
|
G_.player = player -- from above
|
||||||
|
|
12
polymer/eduke32/source/lunatic/listglobals.sh
Executable file
12
polymer/eduke32/source/lunatic/listglobals.sh
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
# S or G can be used to display SETGLOBALs or GETGLOBALs, respectively
|
||||||
|
echo "Usage: $0 <file.lua> [S|G]"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Strip LuaJIT specific syntax
|
||||||
|
sed -r -e "s/[0-9]+U?LL/0/g" "$1" | luac -p -l - | grep "$2ETGLOBAL" |
|
||||||
|
# mark where the new module environment starts
|
||||||
|
sed -e "s/; module/; module ____________________/"
|
|
@ -1,13 +1,31 @@
|
||||||
-- LunaCON CON to Lunatic translator
|
-- LunaCON CON to Lunatic translator
|
||||||
-- requires LPeg, http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html
|
-- requires LPeg, http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html
|
||||||
|
|
||||||
|
local require = require
|
||||||
local lpeg = require("lpeg")
|
local lpeg = require("lpeg")
|
||||||
|
|
||||||
if (not _EDUKE32_LUNATIC) then
|
local bit = require("bit")
|
||||||
|
local math = require("math")
|
||||||
|
local string = require("string")
|
||||||
|
local table = require("table")
|
||||||
|
|
||||||
|
local arg = arg
|
||||||
|
|
||||||
|
local assert = assert
|
||||||
|
local pairs = pairs
|
||||||
|
local pcall = pcall
|
||||||
|
local print = print
|
||||||
|
local tonumber = tonumber
|
||||||
|
local type = type
|
||||||
|
|
||||||
|
if (string.dump) then
|
||||||
require("strict")
|
require("strict")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
module(...)
|
||||||
|
|
||||||
|
|
||||||
-- I think that the "too many pending calls/choices" is unavoidable in general.
|
-- I think that the "too many pending calls/choices" is unavoidable in general.
|
||||||
-- This limit is of course still arbitrary, but writing long if/else cascades
|
-- This limit is of course still arbitrary, but writing long if/else cascades
|
||||||
-- in CON isn't pretty either (though sometimes necessary because nested switches
|
-- in CON isn't pretty either (though sometimes necessary because nested switches
|
||||||
|
@ -48,11 +66,13 @@ local g_badids = {} -- maps bad id strings to 'true'
|
||||||
local g_recurslevel = -1 -- 0: base CON file, >0 included
|
local g_recurslevel = -1 -- 0: base CON file, >0 included
|
||||||
local g_filename = "???"
|
local g_filename = "???"
|
||||||
local g_directory = "" -- with trailing slash if not empty
|
local g_directory = "" -- with trailing slash if not empty
|
||||||
|
local g_maxerrors = 20
|
||||||
local g_numerrors = 0
|
local g_numerrors = 0
|
||||||
|
|
||||||
-- Warning options. Key names are the same as cmdline options, e.g.
|
-- Warning options. Key names are the same as cmdline options, e.g.
|
||||||
-- -Wno-bad-identifier for disabling the "bad identifier" warning.
|
-- -Wno-bad-identifier for disabling the "bad identifier" warning.
|
||||||
local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true, }
|
local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true,
|
||||||
|
["number-conversion"]=true, }
|
||||||
|
|
||||||
-- How many 'if' statements are following immediately each other,
|
-- How many 'if' statements are following immediately each other,
|
||||||
-- needed to cope with CONs dangling-else resolution
|
-- needed to cope with CONs dangling-else resolution
|
||||||
|
@ -113,8 +133,17 @@ local function linecolstr(pos)
|
||||||
return format("%d:%d", line, col)
|
return format("%d:%d", line, col)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function increment_numerrors()
|
||||||
|
g_numerrors = g_numerrors+1
|
||||||
|
if (g_numerrors == g_maxerrors) then
|
||||||
|
g_numerrors = inf
|
||||||
|
printf("Too many errors (%d), aborting...", g_maxerrors)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function perrprintf(pos, fmt, ...)
|
local function perrprintf(pos, fmt, ...)
|
||||||
printf("%s %s: error: "..fmt, g_filename, linecolstr(pos), ...)
|
printf("%s %s: error: "..fmt, g_filename, linecolstr(pos), ...)
|
||||||
|
increment_numerrors()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function errprintf(fmt, ...)
|
local function errprintf(fmt, ...)
|
||||||
|
@ -123,7 +152,7 @@ local function errprintf(fmt, ...)
|
||||||
else
|
else
|
||||||
printf("%s ???: error: "..fmt, g_filename, ...)
|
printf("%s ???: error: "..fmt, g_filename, ...)
|
||||||
end
|
end
|
||||||
g_numerrors = g_numerrors+1
|
increment_numerrors()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function pwarnprintf(pos, fmt, ...)
|
local function pwarnprintf(pos, fmt, ...)
|
||||||
|
@ -145,7 +174,9 @@ local function parse_number(pos, numstr)
|
||||||
perrprintf(pos, "number %s out of the range of a 32-bit integer", numstr)
|
perrprintf(pos, "number %s out of the range of a 32-bit integer", numstr)
|
||||||
num = NaN
|
num = NaN
|
||||||
elseif (num >= 0x80000000 and numstr:sub(1,2):lower()~="0x") then
|
elseif (num >= 0x80000000 and numstr:sub(1,2):lower()~="0x") then
|
||||||
pwarnprintf(pos, "number %s converted to a negative one", numstr)
|
if (g_warn["number-conversion"]) then
|
||||||
|
pwarnprintf(pos, "number %s converted to a negative one", numstr)
|
||||||
|
end
|
||||||
num = num-(0xffffffff+1)
|
num = num-(0xffffffff+1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -306,7 +337,7 @@ local function parse(contents) end -- fwd-decl
|
||||||
local function do_include_file(dirname, filename) end
|
local function do_include_file(dirname, filename) end
|
||||||
local function cmd_include(filename) end
|
local function cmd_include(filename) end
|
||||||
|
|
||||||
if (_EDUKE32_LUNATIC) then
|
if (not string.dump) then
|
||||||
-- NOT IMPLEMENTED
|
-- NOT IMPLEMENTED
|
||||||
else
|
else
|
||||||
function do_include_file(dirname, filename)
|
function do_include_file(dirname, filename)
|
||||||
|
@ -1064,13 +1095,13 @@ local Cif = {
|
||||||
ifcount = cmd(D)
|
ifcount = cmd(D)
|
||||||
/ ACS":get_count()==%1",
|
/ ACS":get_count()==%1",
|
||||||
ifactor = cmd(D)
|
ifactor = cmd(D)
|
||||||
/ SPS".picnum==%d",
|
/ SPS".picnum==%1",
|
||||||
ifstrength = cmd(D)
|
ifstrength = cmd(D)
|
||||||
/ SPS".extra<=%d",
|
/ SPS".extra<=%1",
|
||||||
ifspawnedby = cmd(D)
|
ifspawnedby = cmd(D)
|
||||||
/ ACS".picnum==%d",
|
/ ACS".picnum==%1",
|
||||||
ifwasweapon = cmd(D)
|
ifwasweapon = cmd(D)
|
||||||
/ ACS".picnum==%d",
|
/ ACS".picnum==%1",
|
||||||
ifgapzl = cmd(D) -- factor into a con.* function?
|
ifgapzl = cmd(D) -- factor into a con.* function?
|
||||||
/ format("_bit.arshift(%s-%s,8)<%%1", ACS".floorz", ACS".ceilingz"),
|
/ format("_bit.arshift(%s-%s,8)<%%1", ACS".floorz", ACS".ceilingz"),
|
||||||
iffloordistl = cmd(D)
|
iffloordistl = cmd(D)
|
||||||
|
@ -1158,7 +1189,6 @@ local Cif = {
|
||||||
|
|
||||||
|
|
||||||
----==== Tracing and reporting ====----
|
----==== Tracing and reporting ====----
|
||||||
local string = require("string")
|
|
||||||
|
|
||||||
-- g_newlineidxs will contain the 1-based file offsets to "\n" characters
|
-- g_newlineidxs will contain the 1-based file offsets to "\n" characters
|
||||||
local g_newlineidxs = {}
|
local g_newlineidxs = {}
|
||||||
|
@ -1492,8 +1522,6 @@ local Grammar = Pat{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
local math = require("math")
|
|
||||||
|
|
||||||
local function setup_newlineidxs(contents)
|
local function setup_newlineidxs(contents)
|
||||||
local newlineidxs = {}
|
local newlineidxs = {}
|
||||||
for i in string.gmatch(contents, "()\n") do
|
for i in string.gmatch(contents, "()\n") do
|
||||||
|
@ -1637,7 +1665,7 @@ local function handle_cmdline_arg(str)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (not _EDUKE32_LUNATIC) then
|
if (string.dump) then
|
||||||
--- stand-alone
|
--- stand-alone
|
||||||
|
|
||||||
local i = 1
|
local i = 1
|
||||||
|
|
Loading…
Reference in a new issue