diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index 36be4a10c..1437d74bb 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -127,8 +127,8 @@ local g_gamearray = {} local g_have_file = {} -- [filename]=true local g_curcode = nil -- a table of string pieces or other "gencode" tables --- [{actor, event, actor}num]=gencode_table -local g_code = { actor={}, event={}, loadactor={} } +-- will be a table, see reset_codegen() +local g_code = nil local function ACS(s) return "actor[_aci]"..s end @@ -263,7 +263,8 @@ local function reset_codegen() g_have_file = {} g_curcode = new_initial_codetab() - g_code.actor, g_code.event, g_code.loadactor = {}, {}, {} + -- [{actor, event, actor}num]=gencode_table + g_code = { actor={}, event={}, loadactor={} } g_recurslevel = -1 g_numerrors = 0 @@ -284,6 +285,8 @@ local function add_code_and_end(codetab, endstr) addcode(endstr) end +local function warnprintf() end -- fwd-decl + local on = {} function on.actor_end(usertype, tsamm, codetab) @@ -306,6 +309,10 @@ function on.actor_end(usertype, tsamm, codetab) addcodef("gameactor(%d,%sfunction(_aci, _pli, _dist)", tilenum, str) add_code_and_end(codetab, "end)") + if (g_code.actor[tilenum] ~= nil) then + -- XXX: position will be that of last command in actor code + warnprintf("redefined actor %d", tilenum) + end g_code.actor[tilenum] = codetab end @@ -343,6 +350,20 @@ function on.event_end(eventidx, codetab) g_code.event[eventidx] = codetab end +function on.eventloadactor_end(tilenum, codetab) + -- Translate eventloadactor into a chained EVENT_LOADACTOR block + addcode("gameevent('LOADACTOR', function (_aci, _pli, _dist)") + addcodef("if (%s==%d) then", SPS".picnum", tilenum) + addcode(codetab) + addcode("end") + addcode("end)") + + if (g_code.loadactor[tilenum] ~= nil) then + warnprintf("redefined loadactor %d", tilenum) + end + g_code.loadactor[tilenum] = codetab +end + ---------- local function linecolstr(pos) @@ -376,7 +397,7 @@ local function pwarnprintf(pos, fmt, ...) printf("%s %s: warning: "..fmt, g_filename, linecolstr(pos), ...) end -local function warnprintf(fmt, ...) +function warnprintf(fmt, ...) -- local if (g_lastkwpos) then pwarnprintf(g_lastkwpos, fmt, ...) else @@ -2351,8 +2372,8 @@ local Cblock = { -- useractor (...) useractor = sp1 * tok.define * common.actor_end / on.actor_end, -- eventloadactor - eventloadactor = lpeg.Cc(nil) * sp1 * lpeg.Ct(tok.define) - * sp1 * stmt_list_or_eps * "enda" / on.actor_end, + eventloadactor = sp1 * tok.define * sp1 * stmt_list_or_eps * "enda" + / on.eventloadactor_end, onevent = sp1 * tok.define * sp1 * stmt_list_or_eps * "endevent" / on.event_end, diff --git a/polymer/eduke32/source/lunatic/test/event_chaining.con b/polymer/eduke32/source/lunatic/test/event_chaining.con index 9f770f7f8..654fdaabc 100644 --- a/polymer/eduke32/source/lunatic/test/event_chaining.con +++ b/polymer/eduke32/source/lunatic/test/event_chaining.con @@ -14,6 +14,15 @@ onevent EVENT_INIT echo 127 endevent +eventloadactor 930 // "police line" ribbon + // make non-destroyable + setactor[THISACTOR].hitag 0 +enda + +eventloadactor 2491 // DUKECAR + killit +enda + // output: // THIRD // SECOND