From 86d985620cf6713ebdd2f21c2163e14c71c240c8 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sat, 15 Mar 2014 14:10:50 +0000 Subject: [PATCH] Lunatic: for gameactor(), deprecate AF.replace_hard, make AF.replace default. That is, always bitwise-OR the per-tile actor flags with the existing ones. git-svn-id: https://svn.eduke32.com/eduke32@4374 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/defs.ilua | 28 ++++++------------- .../eduke32/source/lunatic/doc/lunatic.txt | 18 ++++++------ polymer/eduke32/source/lunatic/lunacon.lua | 4 +-- polymer/eduke32/source/lunatic/test.lua | 3 +- 4 files changed, 19 insertions(+), 34 deletions(-) diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index b578bc7f8..13a380415 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -867,9 +867,9 @@ do our_SFLAG.rotfixed = con_lang.SFLAG.SFLAG_ROTFIXED -- Callback function chaining control flags. - our_SFLAG.replace_hard = 0x08000000 -- Replace actor code and flags - our_SFLAG.replace_soft = 0x10000000 -- Replace actor code, bitwise OR flags - our_SFLAG.replace = 0x08000000 -- Should only be used for gameevent + our_SFLAG.replace = 0x08000000 + our_SFLAG.replace_soft = 0x08000000 -- compat + our_SFLAG.replace_hard = 0x08000000 -- compat, deprecated our_SFLAG.chain_beg = 0x20000000 our_SFLAG.chain_end = 0x40000000 our_SFLAG._CHAIN_MASK_ACTOR = 0x78000000 @@ -2038,15 +2038,14 @@ local function our_gameactor(args) local chainflags = band(flags, AF._CHAIN_MASK_ACTOR) flags = band(flags, BNOT.CHAIN_MASK_ACTOR) - -- Default chaining behavior: don't, replace the old actor instead, but - -- unlike CON, also replace its flags. (CON ORs them instead.) if (chainflags == 0) then - chainflags = AF.replace_hard + -- Default chaining behavior: don't, replace the old actor instead. + chainflags = AF.replace elseif (band(chainflags, chainflags-1) ~= 0) then error("invalid chaining control flags to gameactor", 2) end - local replacep = (chainflags==AF.replace_soft or chainflags==AF.replace_hard) + local replacep = (chainflags==AF.replace) if (not replacep and not actor_funcs[tilenum]) then error("attempt to chain code to nonexistent actor tile "..tilenum, 2) end @@ -2107,19 +2106,8 @@ local function our_gameactor(args) gameevent_internal(96, animate_all_sprites) -- EVENT_ANIMATEALLSPRITES end - -- All good, set the tile bits in initial run and register the actor! - -- XXX: Need to see if some other state living on the C side is clobbered - -- by Lua state recreation. - -- TILE_FLAGS_SET_ONLY_ON_FIRST_RUN - if (g_firstRun) then - -- NOTE: when chaining, this allows passing different flags which are - -- silently ORed. This may or may not be what the user intends, but it - -- allows e.g. adding a stayput bit to an already defined enemy. - -- Modifying existing behavior is the whole point of chaining after all. - -- When soft-replacing, bitwise OR too, emulating CON behavior. - local tile = ffiC.g_tile[tilenum] - tile._flags = (chainflags==AF.replace_hard) and flags or bit.bor(tile._flags, flags) - end + -- All good, bitwise-OR the tile bits and register the actor! + ffiC.g_tile[tilenum]._flags = bit.bor(ffiC.g_tile[tilenum]._flags, flags) local newfunc = replacep and func or (chainflags==AF.chain_beg) and chain_func3(func, actor_funcs[tilenum]) diff --git a/polymer/eduke32/source/lunatic/doc/lunatic.txt b/polymer/eduke32/source/lunatic/doc/lunatic.txt index ee0e99797..54db276ef 100644 --- a/polymer/eduke32/source/lunatic/doc/lunatic.txt +++ b/polymer/eduke32/source/lunatic/doc/lunatic.txt @@ -1478,17 +1478,15 @@ one. This has certain implications if control is transferred non-locally, for example by using <>. + Several flags in `AF` are provided to control how a `gameactor` invocation -handles chaining. +handles chaining. In all cases, the actor tile flags are bitwise-ORed with the +existing ones. + -* `AF.replace_hard`: Completely replace the actor's callback function and - run-time flags. This is the default. -* `AF.replace_soft`: Replace the callback function, but bitwise-OR the existing - run-time flags with the provided ones. This is the way CON's `useractor` - behaves. -* `AF.chain_beg`: Prepend the provided `func` to the existing callback function, - bitwise-OR in flags. -* `AF.chain_end`: Append the provided `func` to the existing callback function, - bitwise-OR in flags. +* `AF.replace`: Replace the callback function. This is the way CON's + `useractor` behaves and is also the Lunatic default. +* `AF.replace_soft`: deprecated alias for `AF.replace` +* `AF.replace_hard`: [red]*deprecated* +* `AF.chain_beg`: Prepend the provided `func` to the existing callback function. +* `AF.chain_end`: Append the provided `func` to the existing callback function. + The following members all default to 0 if omitted. + diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index c2cd472c3..9690d53fe 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -549,8 +549,8 @@ function on.actor_end(pos, usertype, tsamm, codetab) end end - -- 0x10000000: actor.FLAGS.replace_soft - flags = bit.bor(flags, 0x10000000) + -- 0x08000000: actor.FLAGS.replace + flags = bit.bor(flags, 0x08000000) local str = flags.."," for i=2,math.min(#tsamm,4) do diff --git a/polymer/eduke32/source/lunatic/test.lua b/polymer/eduke32/source/lunatic/test.lua index ff3d80d1c..d4cda8a47 100644 --- a/polymer/eduke32/source/lunatic/test.lua +++ b/polymer/eduke32/source/lunatic/test.lua @@ -526,7 +526,6 @@ gameactor{ D.APLAYER, AF.chain_end, } -- Add NODAMAGEPUSH flag to NEWBEAST. --- XXX: Doesn't work because of defs.lua: TILE_FLAGS_SET_ONLY_ON_FIRST_RUN gameactor { D.NEWBEAST, AF.chain_end + AF.NODAMAGEPUSH, function() end } -- Also test actor code chaining: strength is doubled. @@ -691,7 +690,7 @@ gameactor gameactor { -- Innocent sign, similar to test/weaponvars.con actor 909 (tree trunk) - 1211, actor.FLAGS.replace_hard, + 1211, actor.FLAGS.replace, function(aci, pli) local a = actor[aci]