mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 17:01:51 +00:00
Lunatic t.: option for generating code caching sprite/actor/player structs...
...at the beginning of each function called back from C, and each case/default function. Called -fcache-sap. Disabled by default. git-svn-id: https://svn.eduke32.com/eduke32@3561 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
0173c0908a
commit
7a58a818ca
2 changed files with 52 additions and 19 deletions
|
@ -364,6 +364,12 @@ function _togglesectinterp(sectnum, doset)
|
|||
end
|
||||
end
|
||||
|
||||
-- Support for translated CON code: get cached sprite, actor and player structs
|
||||
-- (-fcache-sap option).
|
||||
function _getsap(aci, pli)
|
||||
return (aci>=0) and sprite[aci], (aci>=0) and actor[aci], (pli>=0) and player[pli]
|
||||
end
|
||||
|
||||
--- player/actor/sprite searching functions ---
|
||||
|
||||
local xmath = require("xmath")
|
||||
|
@ -1571,7 +1577,7 @@ function _starttrack(level)
|
|||
|
||||
if (ffiC.G_StartTrack(level) ~= 0) then
|
||||
error("null music for volume "..ffiC.ud.volume_number..
|
||||
" level "..level)
|
||||
" level "..level, 2)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -99,7 +99,9 @@ local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true,
|
|||
["number-conversion"]=true, ["system-gamevar"]=true, }
|
||||
|
||||
-- Code generation and output options.
|
||||
local g_cgopt = { ["no"]=false, ["debug-lineinfo"]=false, ["gendir"]=nil, }
|
||||
local g_cgopt = { ["no"]=false, ["debug-lineinfo"]=false, ["gendir"]=nil,
|
||||
["cache-sap"]=false, }
|
||||
local function csapp() return g_cgopt["cache-sap"] end
|
||||
|
||||
-- How many 'if' statements are following immediately each other,
|
||||
-- needed to cope with CONs dangling-else resolution
|
||||
|
@ -142,9 +144,10 @@ local g_curcode = nil -- a table of string pieces or other "gencode" tables
|
|||
local g_code = nil
|
||||
|
||||
|
||||
local function ACS(s) return "actor[_aci]"..s end
|
||||
local function SPS(s) return "sprite[_aci]"..s end
|
||||
local function PLS(s) return "player[_pli]"..s end
|
||||
local function ACS(s) return (csapp() and "_a" or "actor[_aci]")..s end
|
||||
local function SPS(s) return (csapp() and "_spr" or "sprite[_aci]")..s end
|
||||
local function PLS(s) return (csapp() and "_ps" or "player[_pli]")..s end
|
||||
local function PLSX(s) return "player[_pli]"..s end
|
||||
|
||||
|
||||
local function getlinecol(pos) end -- fwd-decl
|
||||
|
@ -246,22 +249,22 @@ local function new_initial_gvartab()
|
|||
gs = RW "_gv.hudweap.shade",
|
||||
|
||||
-- Some per-player gamevars
|
||||
ZRANGE = PRW(PLS".zrange"),
|
||||
ANGRANGE = PRW(PLS".angrange"),
|
||||
AUTOAIMANGLE = PRW(PLS".autoaimang"),
|
||||
ZRANGE = PRW(PLSX".zrange"),
|
||||
ANGRANGE = PRW(PLSX".angrange"),
|
||||
AUTOAIMANGLE = PRW(PLSX".autoaimang"),
|
||||
|
||||
PIPEBOMB_CONTROL = PRW(PLS".pipebombControl"),
|
||||
GRENADE_LIFETIME = PRW(PLS".pipebombLifetime"),
|
||||
GRENADE_LIFETIME_VAR = PRW(PLS".pipebombLifetimeVar"),
|
||||
TRIPBOMB_CONTROL = PRW(PLS".tripbombControl"),
|
||||
STICKYBOMB_LIFETIME = PRW(PLS".tripbombLifetime"),
|
||||
STICKYBOMB_LIFETIME_VAR = PRW(PLS".tripbombLifetimeVar"),
|
||||
PIPEBOMB_CONTROL = PRW(PLSX".pipebombControl"),
|
||||
GRENADE_LIFETIME = PRW(PLSX".pipebombLifetime"),
|
||||
GRENADE_LIFETIME_VAR = PRW(PLSX".pipebombLifetimeVar"),
|
||||
TRIPBOMB_CONTROL = PRW(PLSX".tripbombControl"),
|
||||
STICKYBOMB_LIFETIME = PRW(PLSX".tripbombLifetime"),
|
||||
STICKYBOMB_LIFETIME_VAR = PRW(PLSX".tripbombLifetimeVar"),
|
||||
|
||||
-- These are not 100% authentic (they're only updated in certain
|
||||
-- circumstances, see player.c: P_SetWeaponGamevars()). But IMO it's
|
||||
-- more useful like this.
|
||||
WEAPON = PRO(PLS".curr_weapon"),
|
||||
WORKSLIKE = PRO(format(PLS".weapon[%s].workslike", PLS".curr_weapon")),
|
||||
WEAPON = PRO(PLSX".curr_weapon"),
|
||||
WORKSLIKE = PRO(format(PLSX".weapon[%s].workslike", PLSX".curr_weapon")),
|
||||
|
||||
VOLUME = RO "_gv.currentEpisode()",
|
||||
LEVEL = RO "_gv.currentLevel()",
|
||||
|
@ -271,7 +274,7 @@ local function new_initial_gvartab()
|
|||
for i=1,#wmembers do
|
||||
local member = wmembers[i]:gsub(".* ","") -- strip e.g. "int32_t "
|
||||
local name = format("WEAPON%d_%s", w, member:upper())
|
||||
gamevar[name] = PRW(format(PLS".weapon[%d].%s", w, member))
|
||||
gamevar[name] = PRW(format(PLSX".weapon[%d].%s", w, member))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -309,6 +312,10 @@ local function add_code_and_end(codetab, endstr)
|
|||
addcode(endstr)
|
||||
end
|
||||
|
||||
local function get_cache_sap_code()
|
||||
return csapp() and "local _spr,_a,_ps=_con._getsap(_aci,_pli)" or ""
|
||||
end
|
||||
|
||||
local function warnprintf() end -- fwd-decl
|
||||
|
||||
local on = {}
|
||||
|
@ -332,6 +339,7 @@ function on.actor_end(usertype, tsamm, codetab)
|
|||
|
||||
-- TODO: usertype (is non-nil only for 'useractor')
|
||||
addcodef("gameactor(%d,%sfunction(_aci, _pli, _dist)", tilenum, str)
|
||||
addcode(get_cache_sap_code())
|
||||
add_code_and_end(codetab, "end)")
|
||||
|
||||
if (g_code.actor[tilenum] ~= nil) then
|
||||
|
@ -362,12 +370,14 @@ end
|
|||
|
||||
function on.state_end(funcname, codetab)
|
||||
addcodef("%s=function(_aci, _pli, _dist)", funcname)
|
||||
addcode(get_cache_sap_code())
|
||||
add_code_and_end(codetab, "end")
|
||||
end
|
||||
|
||||
function on.event_end(eventidx, codetab)
|
||||
assert(type(codetab)=="table")
|
||||
addcodef("gameevent(%d, function (_aci, _pli, _dist)", eventidx)
|
||||
addcode(get_cache_sap_code())
|
||||
addcode(CSV".RETURN=gv._RETURN()")
|
||||
addcode(codetab)
|
||||
addcodef("gv._RETURN(%s)", CSV".RETURN")
|
||||
|
@ -379,6 +389,7 @@ end
|
|||
function on.eventloadactor_end(tilenum, codetab)
|
||||
-- Translate eventloadactor into a chained EVENT_LOADACTOR block
|
||||
addcode("gameevent('LOADACTOR', function (_aci, _pli, _dist)")
|
||||
addcode(get_cache_sap_code())
|
||||
addcodef("if (%s==%d) then", SPS".picnum", tilenum)
|
||||
addcode(codetab)
|
||||
addcode("end")
|
||||
|
@ -1402,14 +1413,26 @@ local function StructAccess(Structname, writep, index, membertab)
|
|||
-- METHOD_MEMBER
|
||||
local ismethod = (armembcode:find("%%s",1,true)~=nil)
|
||||
-- If ismethod is true, then the formatted string will now have an "%s"
|
||||
local code
|
||||
|
||||
if (Structname=="userdef") then
|
||||
-- assert(index==nil)
|
||||
assert(parm2==nil)
|
||||
return format(armembcode, parm2), ismethod
|
||||
code = format(armembcode, parm2)
|
||||
else
|
||||
return format(armembcode, index, parm2), ismethod
|
||||
code = format(armembcode, index, parm2)
|
||||
end
|
||||
|
||||
if (csapp()) then
|
||||
if (Structname=="player") then
|
||||
code = code:gsub("^player%[_pli%]", "_ps")
|
||||
elseif (Structname=="sprite") then
|
||||
code = code:gsub("^actor%[_aci%]", "_a")
|
||||
code = code:gsub("^sprite%[_aci%]", "_spr")
|
||||
end
|
||||
end
|
||||
|
||||
return code, ismethod
|
||||
end
|
||||
|
||||
function lookup.array_expr(writep, structname, index, membertab)
|
||||
|
@ -2713,6 +2736,7 @@ function on.switch_end(testvar, blocks)
|
|||
have[index] = true
|
||||
|
||||
swcode[#swcode+1] = format("[%s]=function(_aci,_pli,_dist)", index)
|
||||
swcode[#swcode+1] = get_cache_sap_code()
|
||||
-- insert the case/default code:
|
||||
swcode[#swcode+1] = block[#block]
|
||||
swcode[#swcode+1] = "end,"
|
||||
|
@ -3054,6 +3078,9 @@ local function handle_cmdline_arg(str)
|
|||
g_cgopt["gendir"] = str:sub(10)
|
||||
ok = true
|
||||
end
|
||||
elseif (str:sub(2)=="fcache-sap") then
|
||||
g_cgopt["cache-sap"] = true
|
||||
ok = true
|
||||
elseif (str:sub(2)=="fdebug-lineinfo") then
|
||||
g_cgopt["debug-lineinfo"] = true
|
||||
ok = true
|
||||
|
|
Loading…
Reference in a new issue