From 126b7257c095675a64206e80e61072e28d3bdcc0 Mon Sep 17 00:00:00 2001 From: helixhorned <helixhorned@1a8010ca-5511-0410-912e-c29ae57300e0> Date: Mon, 11 Feb 2013 17:16:58 +0000 Subject: [PATCH] Lunatic translator: more of everything... git-svn-id: https://svn.eduke32.com/eduke32@3480 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/con_lang.lua | 2 +- polymer/eduke32/source/lunatic/control.lua | 35 +++- polymer/eduke32/source/lunatic/defs.ilua | 16 +- .../eduke32/source/lunatic/defs_common.lua | 3 +- polymer/eduke32/source/lunatic/dynsymlist | 5 +- polymer/eduke32/source/lunatic/dynsymlist_m32 | 2 + polymer/eduke32/source/lunatic/lunacon.lua | 150 ++++++++++++------ 7 files changed, 155 insertions(+), 58 deletions(-) diff --git a/polymer/eduke32/source/lunatic/con_lang.lua b/polymer/eduke32/source/lunatic/con_lang.lua index 8561c7596..19bf4cfdb 100644 --- a/polymer/eduke32/source/lunatic/con_lang.lua +++ b/polymer/eduke32/source/lunatic/con_lang.lua @@ -414,7 +414,7 @@ local ActorLabels = { ypanning = SX".ypanning", -- Read access differs from write, write not available: - alpha = { "_math.floor(spriteext[%s].alpha*255)" }, + alpha = { "_math.floor(spriteext[%s].alpha*255)", "spriteext[%s].alpha=(%%s)/255" }, } local function spr2tspr(code) diff --git a/polymer/eduke32/source/lunatic/control.lua b/polymer/eduke32/source/lunatic/control.lua index dc53f4499..7f3b260f0 100644 --- a/polymer/eduke32/source/lunatic/control.lua +++ b/polymer/eduke32/source/lunatic/control.lua @@ -253,14 +253,24 @@ end function rotatesprite(x, y, zoom, ang, tilenum, shade, pal, orientation, cx1, cy1, cx2, cy2) - if (type(tilenum) ~= "number" or tilenum >= ffiC.MAXTILES+0ULL) then - error("bad argument #5 to rotatesprite: must be number in [0.."..ffiC.MAXTILES.."]", 2) - end + check_tile_idx(tilenum) + orientation = bit.band(orientation, 2047) -- ROTATESPRITE_MAX-1 + -- TODO: check that it works correctly with all coordinates, also if one + -- border is outside the screen etc... ffiC.rotatesprite(65536*x, 65536*y, zoom, ang, tilenum, shade, pal, bit.bor(2,orientation), cx1, cy1, cx2, cy2) end +function _myos(x, y, zoom, tilenum, shade, orientation, pal) + if (pal==nil) then + local sect = player[ffiC.screenpeek].cursectnum + pal = (sect>=0) and sector[sect].floorpal or 0 + end + + ffiC.G_DrawTileGeneric(x, y, zoom, tilenum, shade, orientation, pal) +end + function rnd(x) return (bit.rshift(ffiC.krand(), 8) >= (255-x)) end @@ -282,7 +292,7 @@ function _mod(a,b) if (b==0) then error("mod by zero", 2) end - return math.fmod(a,b) + return (math.fmod(a,b)) end @@ -839,7 +849,7 @@ function _getlastpal(spritenum) actor[spritenum].tempang = 0 end --- abs(G_GetAngleDelta(a1, a2)) +-- G_GetAngleDelta(a1, a2) function _angdiffabs(a1, a2) a1 = bit.band(a1, 2047) a2 = bit.band(a2, 2047) @@ -851,7 +861,20 @@ function _angdiffabs(a1, a2) if (a2 > 1024) then a2=a2-2048 end if (a1 > 1024) then a1=a1-2048 end -- a1 and a2 is in [-1023, 1024] - return math.abs(a2-a1) + return a2-a1 +end + +function _angdiffabs(a1, a2) + return math.abs(_angdiff(a1, a2)) +end + +function _angtotarget(aci) + local spr = sprite[aci] + return ffiC.getangle(actor[aci].lastvx-spr.x, actor[aci].lastvy-spr.y) +end + +function _hypot(a, b) + return math.sqrt(a*a + b*b) end local SK = { diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index 5da1ee454..c4fa107e2 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -504,6 +504,7 @@ int16_t BlimpSpawnSprites[15]; int32_t g_scriptVersion; const int32_t g_currentFrameRate; const int32_t g_currentMenu; +uint16_t g_earthquakeTime; int32_t A_IncurDamage(int32_t sn); // not bound-checked! void P_AddWeaponMaybeSwitch(DukePlayer_t *ps, int32_t weap); @@ -521,6 +522,8 @@ int32_t A_Spawn(int32_t j, int32_t pn); void A_AddToDeleteQueue(int32_t i); void P_DoQuote(int32_t q, DukePlayer_t *p); void G_ClearCameraView(DukePlayer_t *ps); +void G_DrawTileGeneric(int32_t x, int32_t y, int32_t zoom, int32_t tilenum, + int32_t shade, int32_t orientation, int32_t p); int32_t A_CheckAnySoundPlaying(int32_t i); int32_t A_PlaySound(uint32_t num, int32_t i); @@ -1019,12 +1022,16 @@ gv_access.cam = setmtonce({}, camera_mt) gv_access._ud = ffiC.ud -- Support for some CON global system gamevars -gv_access._csv = ffi.new "struct { int32_t RETURN; }" +gv_access._csv = ffi.new "struct { int32_t RETURN, LOTAG, HITAG, TEXTURE; }" function gv_access._get_yxaspect() return ffiC.yxaspect end +function gv_access._get_viewingrange() + return ffiC.viewingrange +end + function gv_access._currentFramerate() return ffiC.g_currentFrameRate end @@ -1046,6 +1053,13 @@ function gv_access.currentRenderMode() return ffiC.rendmode end +function gv_access.doQuake(gametics, snd) + ffiC.g_earthquakeTime = gametics + if (snd ~= nil) then + con._globalsound(ffiC.screenpeek, snd) + end +end + -- Declare all con_lang.labels constants in the global FFI namespace. for i=1,#con_lang.labels do local strbuf = {"enum {"} diff --git a/polymer/eduke32/source/lunatic/defs_common.lua b/polymer/eduke32/source/lunatic/defs_common.lua index ab66c988e..ffca3d062 100644 --- a/polymer/eduke32/source/lunatic/defs_common.lua +++ b/polymer/eduke32/source/lunatic/defs_common.lua @@ -225,7 +225,7 @@ const int32_t windowx1, windowy1, windowx2, windowy2; ]] decl[[ -int32_t yxaspect; +int32_t yxaspect, viewingrange; int32_t spritesortcnt; const int32_t rendmode; const int16_t headspritesect[MAXSECTORS+1], headspritestat[MAXSTATUS+1]; @@ -267,6 +267,7 @@ void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, -- misc. functions ffi.cdef[[ +uint32_t getticks(void); double gethitickms(void); int32_t krand(void); diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index 979f2d593..2bf16a5c9 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -23,6 +23,7 @@ windowy1; windowx2; windowy2; yxaspect; +viewingrange; yax_getbunch; @@ -59,6 +60,7 @@ updatesector; updatesectorz; updatesectorbreadth; +getticks; gethitickms; OSD_Printf; @@ -97,7 +99,6 @@ g_playerWeapon; g_tile; ProjectileData; SpriteProjectile; - ScriptQuotes; screenpeek; @@ -109,6 +110,7 @@ BlimpSpawnSprites; g_scriptVersion; g_currentFrameRate; g_currentMenu; +g_earthquakeTime; luaJIT_BC_lunacon; luaJIT_BC_con_lang; @@ -137,6 +139,7 @@ A_Spawn; A_AddToDeleteQueue; P_DoQuote; G_ClearCameraView; +G_DrawTileGeneric; A_CheckAnySoundPlaying; A_PlaySound; diff --git a/polymer/eduke32/source/lunatic/dynsymlist_m32 b/polymer/eduke32/source/lunatic/dynsymlist_m32 index 527fada6b..f72a7ad1e 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist_m32 +++ b/polymer/eduke32/source/lunatic/dynsymlist_m32 @@ -23,6 +23,7 @@ windowy1; windowx2; windowy2; yxaspect; +viewingrange; yax_getbunch; @@ -59,6 +60,7 @@ updatesector; updatesectorz; updatesectorbreadth; +getticks; gethitickms; OSD_Printf; diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index f893e6c7c..b6ac68db2 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -142,7 +142,8 @@ local function new_initial_codetab() } end -local RETURN_VAR_CODE = "gv._csv.RETURN" +-- CON global system gamevar +local function CSV(var) return "gv._csv"..var end -- Creates the table of predefined game variables. -- KEEPINSYNC gamevars.c: Gv_AddSystemVars() @@ -166,7 +167,10 @@ local function new_initial_gvartab() -- e.g. sector[THISACTOR] is sector[sprite[<current actor>].sectnum] THISACTOR = RO "_aci", - RETURN = RW(RETURN_VAR_CODE), + RETURN = RW(CSV".RETURN"), + HITAG = RW(CSV".HITAG"), + LOTAG = RW(CSV".LOTAG"), + TEXTURE = RW(CSV".TEXTURE"), xdim = RO "_gv.xdim", ydim = RO "_gv.ydim", @@ -176,6 +180,7 @@ local function new_initial_gvartab() windowy2 = RO "_gv.windowy2", yxaspect = RO "_gv._get_yxaspect()", + viewingrange = RO "_gv._get_viewingrange()", numsectors = RO "_gv.numsectors", NUMSECTORS = RO "_gv.numsectors", @@ -1291,6 +1296,14 @@ local handle = return format(ACS":set_move(%s,%d)", mv, (flags[1] and bit.bor(...)) or 0) end, + rotatesprite = function(...) + return format("_con.rotatesprite(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", ...) + end, + + rotatesprite16 = function(...) + return format("_con.rotatesprite(%s,%s/65536,%s/65536,%s,%s,%s,%s,%s,%s,%s,%s,%s)", ...) + end, + state = function(statename) if (g_funcname[statename]==nil) then errprintf("state `%s' not found.", statename) @@ -1388,13 +1401,17 @@ local Cinner = { shiftvarr = varopf "_bit.rshift", --- 2. Math operations - sqrt = cmd(R,W), - calchypotenuse = cmd(W,R,R), + sqrt = cmd(R,W) + / "%2=gv.ksqrt(%1)", + calchypotenuse = cmd(W,R,R) + / "%1=_con._hypot(%2,%3)", sin = cmd(W,R), cos = cmd(W,R), mulscale = cmd(W,R,R,R), - getangle = cmd(W,R,R), - getincangle = cmd(W,R,R), + getangle = cmd(W,R,R) + / "%1=gv.getangle(%2,%3)", + getincangle = cmd(W,R,R) + / "%1=_con._angdiff(%2,%3)", --- 3. Actors action = cmd(AC) @@ -1431,10 +1448,6 @@ local Cinner = { / "_con._A_RadiusDamage(_aci,%1,%2,%3,%4,%5)", -- some commands taking read vars - eshootvar = cmd(R), - espawnvar = cmd(R), - qspawnvar = cmd(R), - eqspawnvar = cmd(R), operaterespawns = cmd(R), operatemasterswitches = cmd(R), checkactivatormotion = cmd(R), @@ -1442,11 +1455,12 @@ local Cinner = { / "", inittimer = cmd(R), lockplayer = cmd(R), - shootvar = cmd(R), - quake = cmd(R), - jump = cmd(R), - cmenu = cmd(R), - angoffvar = cmd(R), + quake = cmd(R) + / "gv.doQuake(%1,81)", -- EARTHQUAKE + jump = cmd(R) + / handle.NYI, -- will never be + cmenu = cmd(R) + / handle.NYI, checkavailweapon = cmd(R), checkavailinven = cmd(R), guniqhudid = cmd(R), @@ -1497,22 +1511,36 @@ local Cinner = { / format("_con._addinventory(%s,%%1,%%2,_aci)", PLS""), guts = cmd(D,D) / "_con._A_DoGuts(_aci,%1,%2)", + spawn = cmd(D) / "_con.spawn(_aci,%1)", + espawn = cmd(D) + / CSV".RETURN=_con.spawn(_aci,%1)", + espawnvar = cmd(R) + / CSV".RETURN=_con.spawn(_aci,%1)", + qspawn = cmd(D) + / "_con.spawn(_aci,%1,true)", + qspawnvar = cmd(R) + / "_con.spawn(_aci,%1,true)", + eqspawn = cmd(D) + / CSV".RETURN=_con.spawn(_aci,%1,true)", + eqspawnvar = cmd(R) + / CSV".RETURN=_con.spawn(_aci,%1,true)", + + angoff = cmd(D) + / "spriteext[_aci].angoff=%1", + angoffvar = cmd(R) + / "spriteext[_aci].angoff=%1", -- cont'd addkills = cmd(D) / (PLS".actors_killed="..PLS".actors_killed+%1;"..ACS".actorstayput=-1"), addphealth = cmd(D) / format("_con._addphealth(%s,_aci,%%1)", PLS""), - angoff = cmd(D) - / "spritext[_aci].angoff=%1", debug = cmd(D) / handle.debug, endofgame = cmd(D) / "_con._endofgame(_pli,%1)", - eqspawn = cmd(D), - espawn = cmd(D), lotsofglass = cmd(D) / "_con._A_SpawnGlass(_aci,%1)", mail = cmd(D) @@ -1521,8 +1549,6 @@ local Cinner = { / "_con._spawnmany(_aci,1233,%1)", -- TODO: dyntile paper = cmd(D) / "_con._spawnmany(_aci,4460,%1)", -- TODO: dyntile - qspawn = cmd(D) - / "_con.spawn(_aci,%1,true)", quote = cmd(D) / "_con._quote(_pli,%1)", savenn = cmd(D), @@ -1531,13 +1557,17 @@ local Cinner = { / ACS".timetosleep=%1", eshoot = cmd(D) - / (RETURN_VAR_CODE.."=_con._shoot(_aci,%1)"), + / CSV".RETURN=_con._shoot(_aci,%1)", + eshootvar = cmd(R) + / CSV".RETURN=_con._shoot(_aci,%1)", ezshoot = cmd(R,D) - / (RETURN_VAR_CODE.."=_con._shoot(_aci,%2,%1)"), + / CSV".RETURN=_con._shoot(_aci,%2,%1)", ezshootvar = cmd(R,R) - / (RETURN_VAR_CODE.."=_con._shoot(_aci,%2,%1)"), + / CSV".RETURN=_con._shoot(_aci,%2,%1)", shoot = cmd(D) / "_con._shoot(_aci,%1)", + shootvar = cmd(R) + / "_con._shoot(_aci,%1)", zshoot = cmd(R,D) / "_con._shoot(_aci,%2,%1)", zshootvar = cmd(R,R) @@ -1612,8 +1642,10 @@ local Cinner = { / handle.addweapon, cansee = cmd(R,R,R,R,R,R,R,R,W), canseespr = cmd(R,R,W), - changespritesect = cmd(R,R), - changespritestat = cmd(R,R), + changespritesect = cmd(R,R) + / "sprite.changesect(%1,%2)", + changespritestat = cmd(R,R) + / "sprite.changestat(%1,%2)", clipmove = cmd(W,W,W,R,W,R,R,R,R,R,R), clipmovenoslide = cmd(W,W,W,R,W,R,R,R,R,R,R), displayrand = cmd(W), @@ -1645,10 +1677,14 @@ local Cinner = { operate = cmd() * #sp1 / "_con._operate(_aci)", - myos = cmd(R,R,R,R,R), - myosx = cmd(R,R,R,R,R), - myospal = cmd(R,R,R,R,R,R), - myospalx = cmd(R,R,R,R,R,R), + myos = cmd(R,R,R,R,R) + / "_con._myos(%1,%2,65536,%3,%4,%5)", + myosx = cmd(R,R,R,R,R) + / "_con._myos(%1,%2,32768,%3,%4,%5)", + myospal = cmd(R,R,R,R,R,R) + / "_con._myos(%1,%2,65536,%3,%4,%5,%6)", + myospalx = cmd(R,R,R,R,R,R) + / "_con._myos(%1,%2,32768,%3,%4,%5,%6)", headspritesect = cmd(W,R), headspritestat = cmd(W,R), @@ -1665,43 +1701,61 @@ local Cinner = { resizearray = cmd(I,R), getarraysize = cmd(I,W), rotatepoint = cmd(R,R,R,R,R,W,W), - rotatesprite = cmd(R,R,R,R,R,R,R,R,R,R,R,R), -- 12R - rotatesprite16 = cmd(R,R,R,R,R,R,R,R,R,R,R,R), -- 12R + rotatesprite = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R + / handle.rotatesprite, + rotatesprite16 = cmd(R,R,R,R,R,R,R,R,R,R,R,R) -- 12R + / handle.rotatesprite16, sectorofwall = cmd(W,R,R), sectclearinterpolation = cmd(R), sectsetinterpolation = cmd(R), - sectgethitag = cmd(), - sectgetlotag = cmd(), - spgethitag = cmd(), - spgetlotag = cmd(), + sectgethitag = cmd() + / (CSV".HITAG=sector["..SPS".sectnum].hitag"), + sectgetlotag = cmd() + / (CSV".LOTAG=sector["..SPS".sectnum].lotag"), + spgethitag = cmd() + / (CSV".HITAG="..SPS".hitag"), + spgetlotag = cmd() + / (CSV".LOTAG="..SPS".lotag"), + gettextureceiling = cmd() + / (CSV".TEXTURE=sector["..SPS".sectnum].ceilingpicnum"), + gettexturefloor = cmd() + / (CSV".TEXTURE=sector["..SPS".sectnum].floorpicnum"), showview = cmd(R,R,R,R,R,R,R,R,R,R), -- 10R showviewunbiased = cmd(R,R,R,R,R,R,R,R,R,R), -- 10R smaxammo = cmd(R,R) / PLS":set_max_ammo_amount(%1,%2)", - gmaxammo = cmd(R,W), - spriteflags = cmd(R), -- also see outer - ssp = cmd(R,R), + gmaxammo = cmd(R,W) + / ("%2="..PLS".max_ammo_amount[%1]"), + spriteflags = cmd(R) -- also see outer + / ACS".flags=%1", + ssp = cmd(R,R) + / handle.NYI, startlevel = cmd(R,R), starttrack = cmd(D), updatesector = cmd(R,R,W), updatesectorz = cmd(R,R,R,W), - getactorangle = cmd(W), + getactorangle = cmd(W) + / ("%1="..SPS".ang"), setactorangle = cmd(R), - getplayerangle = cmd(W), + getplayerangle = cmd(W) + / ("%1="..PLS".ang"), setplayerangle = cmd(R), - getangletotarget = cmd(W), + getangletotarget = cmd(W) + / "%1=_con._angtotarget(_aci)", - getceilzofslope = cmd(R,R,R,W), - getflorzofslope = cmd(R,R,R,W), - getcurraddress = cmd(W), -- XXX + getceilzofslope = cmd(R,R,R,W) + / "%4=sector[%1]:ceilingzat(%2,%3)", + getflorzofslope = cmd(R,R,R,W) + / "%4=sector[%1]:floorzat(%2,%3)", + getcurraddress = cmd(W) + / handle.NYI, -- will never be getkeyname = cmd(R,R,R), getpname = cmd(R,R), - gettextureceiling = cmd(), - gettexturefloor = cmd(), - getticks = cmd(W), + getticks = cmd(W) + / "%1=gv.getticks()", gettimedate = cmd(W,W,W,W,W,W,W,W), getzrange = cmd(R,R,R,R,W,W,W,W,R,R),