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),