]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/util.qc
Make pointer to member usage explicit
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / util.qc
index 671c8d5a593e23f9c552a700172cc57b9cf7139c..4a3b2dbf4924feebfb9bbf6e5b6a61c25d2bfa3f 100644 (file)
@@ -1,3 +1,26 @@
+#include "util.qh"
+
+#if defined(CSQC)
+       #include "../dpdefs/csprogsdefs.qh"
+    #include "../client/defs.qh"
+    #include "constants.qh"
+    #include "../warpzonelib/mathlib.qh"
+    #include "mapinfo.qh"
+    #include "notifications.qh"
+    #include "deathtypes.qh"
+#elif defined(MENUQC)
+#elif defined(SVQC)
+       #include "../dpdefs/progsdefs.qh"
+    #include "../dpdefs/dpextensions.qh"
+    #include "../warpzonelib/mathlib.qh"
+    #include "constants.qh"
+    #include "../server/autocvars.qh"
+    #include "../server/defs.qh"
+    #include "notifications.qh"
+    #include "deathtypes.qh"
+    #include "mapinfo.qh"
+#endif
+
 string wordwrap_buffer;
 
 void wordwrap_buffer_put(string s)
@@ -161,26 +184,26 @@ void depthfirst(entity start, .entity up, .entity downleft, .entity right, void(
        entity e;
        e = start;
        funcPre(pass, e);
-       while(e.downleft)
+       while (e.(downleft))
        {
-               e = e.downleft;
+               e = e.(downleft);
                funcPre(pass, e);
        }
        funcPost(pass, e);
        while(e != start)
        {
-               if(e.right)
+               if (e.(right))
                {
-                       e = e.right;
+                       e = e.(right);
                        funcPre(pass, e);
-                       while(e.downleft)
+                       while (e.(downleft))
                        {
-                               e = e.downleft;
+                               e = e.(downleft);
                                funcPre(pass, e);
                        }
                }
                else
-                       e = e.up;
+                       e = e.(up);
                funcPost(pass, e);
        }
 }
@@ -248,18 +271,17 @@ string fstrunzone(string s)
        return sc;
 }
 
-float fexists(string f)
+bool fexists(string f)
 {
-    float fh;
-    fh = fopen(f, FILE_READ);
+    int fh = fopen(f, FILE_READ);
     if (fh < 0)
-        return FALSE;
+        return false;
     fclose(fh);
-    return TRUE;
+    return true;
 }
 
 // Databases (hash tables)
-#define DB_BUCKETS 8192
+const float DB_BUCKETS = 8192;
 void db_save(float db, string pFilename)
 {
        float fh, i, n;
@@ -276,12 +298,12 @@ void db_save(float db, string pFilename)
        fclose(fh);
 }
 
-float db_create()
+int db_create()
 {
        return buf_create();
 }
 
-float db_load(string pFilename)
+int db_load(string pFilename)
 {
        float db, fh, i, j, n;
        string l;
@@ -346,14 +368,14 @@ void db_close(float db)
 string db_get(float db, string pKey)
 {
        float h;
-       h = mod(crc16(FALSE, pKey), DB_BUCKETS);
+       h = crc16(false, pKey) % DB_BUCKETS;
        return uri_unescape(infoget(bufstr_get(db, h), pKey));
 }
 
 void db_put(float db, string pKey, string pValue)
 {
        float h;
-       h = mod(crc16(FALSE, pKey), DB_BUCKETS);
+       h = crc16(false, pKey) % DB_BUCKETS;
        bufstr_set(db, h, infoadd(bufstr_get(db, h), pKey, uri_escape(pValue)));
 }
 
@@ -373,7 +395,7 @@ void db_test()
 }
 
 // Multiline text file buffers
-float buf_load(string pFilename)
+int buf_load(string pFilename)
 {
        float buf, fh, i;
        string l;
@@ -446,7 +468,7 @@ string mmssss(float hundredths)
        return strcat(ftos(minutes), ":", substring(s, 1, 2), ".", substring(s, 3, 2));
 }
 
-string ScoreString(float pFlags, float pValue)
+string ScoreString(int pFlags, float pValue)
 {
        string valstr;
        float l;
@@ -478,19 +500,6 @@ string ScoreString(float pFlags, float pValue)
        return valstr;
 }
 
-float dotproduct(vector a, vector b)
-{
-       return a_x * b_x + a_y * b_y + a_z * b_z;
-}
-
-vector cross(vector a, vector b)
-{
-       return
-               '1 0 0' * (a_y * b_z - a_z * b_y)
-       +       '0 1 0' * (a_z * b_x - a_x * b_z)
-       +       '0 0 1' * (a_x * b_y - a_y * b_x);
-}
-
 // compressed vector format:
 // like MD3, just even shorter
 //   4 bit pitch (16 angles), 0 is -90, 8 is 0, 16 would be 90
@@ -505,7 +514,7 @@ float lengthLogTable[128];
 
 float invertLengthLog(float x)
 {
-       float l, r, m, lerr, rerr;
+       int l, r, m;
 
        if(x >= lengthLogTable[127])
                return 127;
@@ -525,41 +534,40 @@ float invertLengthLog(float x)
        }
 
        // now: r is >=, l is <
-       lerr = (x - lengthLogTable[l]);
-       rerr = (lengthLogTable[r] - x);
+       float lerr = (x - lengthLogTable[l]);
+       float rerr = (lengthLogTable[r] - x);
        if(lerr < rerr)
                return l;
        return r;
 }
 
-vector decompressShortVector(float data)
+vector decompressShortVector(int data)
 {
        vector out;
-       float p, y, len;
        if(data == 0)
                return '0 0 0';
-       p   = (data & 0xF000) / 0x1000;
-       y   = (data & 0x0F80) / 0x80;
-       len = (data & 0x007F);
+       float p = (data & 0xF000) / 0x1000;
+       float y = (data & 0x0F80) / 0x80;
+       int len = (data & 0x007F);
 
        //print("\ndecompress: p ", ftos(p)); print("y ", ftos(y)); print("len ", ftos(len), "\n");
 
        if(p == 0)
        {
-               out_x = 0;
-               out_y = 0;
+               out.x = 0;
+               out.y = 0;
                if(y == 31)
-                       out_z = -1;
+                       out.z = -1;
                else
-                       out_z = +1;
+                       out.z = +1;
        }
        else
        {
                y   = .19634954084936207740 * y;
                p = .19634954084936207740 * p - 1.57079632679489661922;
-               out_x = cos(y) *  cos(p);
-               out_y = sin(y) *  cos(p);
-               out_z =          -sin(p);
+               out.x = cos(y) *  cos(p);
+               out.y = sin(y) *  cos(p);
+               out.z =          -sin(p);
        }
 
        //print("decompressed: ", vtos(out), "\n");
@@ -575,23 +583,23 @@ float compressShortVector(vector vec)
                return 0;
        //print("compress: ", vtos(vec), "\n");
        ang = vectoangles(vec);
-       ang_x = -ang_x;
-       if(ang_x < -90)
-               ang_x += 360;
-       if(ang_x < -90 && ang_x > +90)
+       ang.x = -ang.x;
+       if(ang.x < -90)
+               ang.x += 360;
+       if(ang.x < -90 && ang.x > +90)
                error("BOGUS vectoangles");
        //print("angles: ", vtos(ang), "\n");
 
-       p = floor(0.5 + (ang_x + 90) * 16 / 180) & 15; // -90..90 to 0..14
+       p = floor(0.5 + (ang.x + 90) * 16 / 180) & 15; // -90..90 to 0..14
        if(p == 0)
        {
-               if(vec_z < 0)
+               if(vec.z < 0)
                        y = 31;
                else
                        y = 30;
        }
        else
-               y = floor(0.5 + ang_y * 32 / 360)          & 31; // 0..360 to 0..32
+               y = floor(0.5 + ang.y * 32 / 360)          & 31; // 0..360 to 0..32
        len = invertLengthLog(vlen(vec));
 
        //print("compressed: p ", ftos(p)); print("y ", ftos(y)); print("len ", ftos(len), "\n");
@@ -601,9 +609,9 @@ float compressShortVector(vector vec)
 
 void compressShortVector_init()
 {
-       float l, f, i;
-       l = 1;
-       f = pow(2, 1/8);
+       float l = 1;
+       float f = pow(2, 1/8);
+       int i;
        for(i = 0; i < 128; ++i)
        {
                lengthLogTable[i] = l;
@@ -629,18 +637,18 @@ void compressShortVector_init()
 #ifndef MENUQC
 float CheckWireframeBox(entity forent, vector v0, vector dvx, vector dvy, vector dvz)
 {
-       traceline(v0, v0 + dvx, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0, v0 + dvy, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0, v0 + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvx, v0 + dvx + dvy, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvx, v0 + dvx + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvy, v0 + dvy + dvx, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvy, v0 + dvy + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvz, v0 + dvz + dvx, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvz, v0 + dvz + dvy, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvx + dvy, v0 + dvx + dvy + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvx + dvz, v0 + dvx + dvy + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
-       traceline(v0 + dvy + dvz, v0 + dvx + dvy + dvz, TRUE, forent); if(trace_fraction < 1) return 0;
+       traceline(v0, v0 + dvx, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0, v0 + dvy, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0, v0 + dvz, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvx, v0 + dvx + dvy, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvx, v0 + dvx + dvz, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvy, v0 + dvy + dvx, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvy, v0 + dvy + dvz, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvz, v0 + dvz + dvx, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvz, v0 + dvz + dvy, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvx + dvy, v0 + dvx + dvy + dvz, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvx + dvz, v0 + dvx + dvy + dvz, true, forent); if(trace_fraction < 1) return 0;
+       traceline(v0 + dvy + dvz, v0 + dvx + dvy + dvz, true, forent); if(trace_fraction < 1) return 0;
        return 1;
 }
 #endif
@@ -764,7 +772,7 @@ void get_mi_min_max(float mode)
        mi_min = mi;
        mi_max = ma;
        MapInfo_Get_ByName(mi_shortname, 0, 0);
-       if(MapInfo_Map_mins_x < MapInfo_Map_maxs_x)
+       if(MapInfo_Map_mins.x < MapInfo_Map_maxs.x)
        {
                mi_min = MapInfo_Map_mins;
                mi_max = MapInfo_Map_maxs;
@@ -775,59 +783,59 @@ void get_mi_min_max(float mode)
                if(mode)
                {
                        // be clever
-                       tracebox('1 0 0' * mi_x,
-                                        '0 1 0' * mi_y + '0 0 1' * mi_z,
-                                        '0 1 0' * ma_y + '0 0 1' * ma_z,
-                                        '1 0 0' * ma_x,
+                       tracebox('1 0 0' * mi.x,
+                                        '0 1 0' * mi.y + '0 0 1' * mi.z,
+                                        '0 1 0' * ma.y + '0 0 1' * ma.z,
+                                        '1 0 0' * ma.x,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_min_x = trace_endpos_x;
+                               mi_min.x = trace_endpos.x;
 
-                       tracebox('0 1 0' * mi_y,
-                                        '1 0 0' * mi_x + '0 0 1' * mi_z,
-                                        '1 0 0' * ma_x + '0 0 1' * ma_z,
-                                        '0 1 0' * ma_y,
+                       tracebox('0 1 0' * mi.y,
+                                        '1 0 0' * mi.x + '0 0 1' * mi.z,
+                                        '1 0 0' * ma.x + '0 0 1' * ma.z,
+                                        '0 1 0' * ma.y,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_min_y = trace_endpos_y;
+                               mi_min.y = trace_endpos.y;
 
-                       tracebox('0 0 1' * mi_z,
-                                        '1 0 0' * mi_x + '0 1 0' * mi_y,
-                                        '1 0 0' * ma_x + '0 1 0' * ma_y,
-                                        '0 0 1' * ma_z,
+                       tracebox('0 0 1' * mi.z,
+                                        '1 0 0' * mi.x + '0 1 0' * mi.y,
+                                        '1 0 0' * ma.x + '0 1 0' * ma.y,
+                                        '0 0 1' * ma.z,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_min_z = trace_endpos_z;
+                               mi_min.z = trace_endpos.z;
 
-                       tracebox('1 0 0' * ma_x,
-                                        '0 1 0' * mi_y + '0 0 1' * mi_z,
-                                        '0 1 0' * ma_y + '0 0 1' * ma_z,
-                                        '1 0 0' * mi_x,
+                       tracebox('1 0 0' * ma.x,
+                                        '0 1 0' * mi.y + '0 0 1' * mi.z,
+                                        '0 1 0' * ma.y + '0 0 1' * ma.z,
+                                        '1 0 0' * mi.x,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_max_x = trace_endpos_x;
+                               mi_max.x = trace_endpos.x;
 
-                       tracebox('0 1 0' * ma_y,
-                                        '1 0 0' * mi_x + '0 0 1' * mi_z,
-                                        '1 0 0' * ma_x + '0 0 1' * ma_z,
-                                        '0 1 0' * mi_y,
+                       tracebox('0 1 0' * ma.y,
+                                        '1 0 0' * mi.x + '0 0 1' * mi.z,
+                                        '1 0 0' * ma.x + '0 0 1' * ma.z,
+                                        '0 1 0' * mi.y,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_max_y = trace_endpos_y;
+                               mi_max.y = trace_endpos.y;
 
-                       tracebox('0 0 1' * ma_z,
-                                        '1 0 0' * mi_x + '0 1 0' * mi_y,
-                                        '1 0 0' * ma_x + '0 1 0' * ma_y,
-                                        '0 0 1' * mi_z,
+                       tracebox('0 0 1' * ma.z,
+                                        '1 0 0' * mi.x + '0 1 0' * mi.y,
+                                        '1 0 0' * ma.x + '0 1 0' * ma.y,
+                                        '0 0 1' * mi.z,
                                         MOVE_WORLDONLY,
                                         world);
                        if(!trace_startsolid)
-                               mi_max_z = trace_endpos_z;
+                               mi_max.z = trace_endpos.z;
                }
        }
 }
@@ -844,15 +852,15 @@ void get_mi_min_max_texcoords(float mode)
        // extend mi_picmax to get a square aspect ratio
        // center the map in that area
        extend = mi_picmax - mi_picmin;
-       if(extend_y > extend_x)
+       if(extend.y > extend.x)
        {
-               mi_picmin_x -= (extend_y - extend_x) * 0.5;
-               mi_picmax_x += (extend_y - extend_x) * 0.5;
+               mi_picmin.x -= (extend.y - extend.x) * 0.5;
+               mi_picmax.x += (extend.y - extend.x) * 0.5;
        }
        else
        {
-               mi_picmin_y -= (extend_x - extend_y) * 0.5;
-               mi_picmax_y += (extend_x - extend_y) * 0.5;
+               mi_picmin.y -= (extend.x - extend.y) * 0.5;
+               mi_picmax.y += (extend.x - extend.y) * 0.5;
        }
 
        // add another some percent
@@ -863,10 +871,10 @@ void get_mi_min_max_texcoords(float mode)
        // calculate the texcoords
        mi_pictexcoord0 = mi_pictexcoord1 = mi_pictexcoord2 = mi_pictexcoord3 = '0 0 0';
        // first the two corners of the origin
-       mi_pictexcoord0_x = (mi_min_x - mi_picmin_x) / (mi_picmax_x - mi_picmin_x);
-       mi_pictexcoord0_y = (mi_min_y - mi_picmin_y) / (mi_picmax_y - mi_picmin_y);
-       mi_pictexcoord2_x = (mi_max_x - mi_picmin_x) / (mi_picmax_x - mi_picmin_x);
-       mi_pictexcoord2_y = (mi_max_y - mi_picmin_y) / (mi_picmax_y - mi_picmin_y);
+       mi_pictexcoord0_x = (mi_min.x - mi_picmin.x) / (mi_picmax.x - mi_picmin.x);
+       mi_pictexcoord0_y = (mi_min.y - mi_picmin.y) / (mi_picmax.y - mi_picmin.y);
+       mi_pictexcoord2_x = (mi_max.x - mi_picmin.x) / (mi_picmax.x - mi_picmin.x);
+       mi_pictexcoord2_y = (mi_max.y - mi_picmin.y) / (mi_picmax.y - mi_picmin.y);
        // then the other corners
        mi_pictexcoord1_x = mi_pictexcoord0_x;
        mi_pictexcoord1_y = mi_pictexcoord2_y;
@@ -938,8 +946,8 @@ float almost_equals(float a, float b)
        float eps;
        eps = (max(a, -a) + max(b, -b)) * 0.001;
        if(a - b < eps && b - a < eps)
-               return TRUE;
-       return FALSE;
+               return true;
+       return false;
 }
 
 float almost_in_bounds(float a, float b, float c)
@@ -1034,17 +1042,17 @@ float rgb_mi_ma_to_hue(vector rgb, float mi, float ma)
 {
        if(mi == ma)
                return 0;
-       else if(ma == rgb_x)
+       else if(ma == rgb.x)
        {
-               if(rgb_y >= rgb_z)
-                       return (rgb_y - rgb_z) / (ma - mi);
+               if(rgb.y >= rgb.z)
+                       return (rgb.y - rgb.z) / (ma - mi);
                else
-                       return (rgb_y - rgb_z) / (ma - mi) + 6;
+                       return (rgb.y - rgb.z) / (ma - mi) + 6;
        }
-       else if(ma == rgb_y)
-               return (rgb_z - rgb_x) / (ma - mi) + 2;
+       else if(ma == rgb.y)
+               return (rgb.z - rgb.x) / (ma - mi) + 2;
        else // if(ma == rgb_z)
-               return (rgb_x - rgb_y) / (ma - mi) + 4;
+               return (rgb.x - rgb.y) / (ma - mi) + 4;
 }
 
 vector hue_mi_ma_to_rgb(float hue, float mi, float ma)
@@ -1057,45 +1065,45 @@ vector hue_mi_ma_to_rgb(float hue, float mi, float ma)
        //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
        if(hue <= 1)
        {
-               rgb_x = ma;
-               rgb_y = hue * (ma - mi) + mi;
-               rgb_z = mi;
+               rgb.x = ma;
+               rgb.y = hue * (ma - mi) + mi;
+               rgb.z = mi;
        }
        //else if(ma == rgb_y)
        //      hue = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
        else if(hue <= 2)
        {
-               rgb_x = (2 - hue) * (ma - mi) + mi;
-               rgb_y = ma;
-               rgb_z = mi;
+               rgb.x = (2 - hue) * (ma - mi) + mi;
+               rgb.y = ma;
+               rgb.z = mi;
        }
        else if(hue <= 3)
        {
-               rgb_x = mi;
-               rgb_y = ma;
-               rgb_z = (hue - 2) * (ma - mi) + mi;
+               rgb.x = mi;
+               rgb.y = ma;
+               rgb.z = (hue - 2) * (ma - mi) + mi;
        }
        //else // if(ma == rgb_z)
        //      hue = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
        else if(hue <= 4)
        {
-               rgb_x = mi;
-               rgb_y = (4 - hue) * (ma - mi) + mi;
-               rgb_z = ma;
+               rgb.x = mi;
+               rgb.y = (4 - hue) * (ma - mi) + mi;
+               rgb.z = ma;
        }
        else if(hue <= 5)
        {
-               rgb_x = (hue - 4) * (ma - mi) + mi;
-               rgb_y = mi;
-               rgb_z = ma;
+               rgb.x = (hue - 4) * (ma - mi) + mi;
+               rgb.y = mi;
+               rgb.z = ma;
        }
        //else if(ma == rgb_x)
        //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
        else // if(hue <= 6)
        {
-               rgb_x = ma;
-               rgb_y = mi;
-               rgb_z = (6 - hue) * (ma - mi) + mi;
+               rgb.x = ma;
+               rgb.y = mi;
+               rgb.z = (6 - hue) * (ma - mi) + mi;
        }
 
        return rgb;
@@ -1106,23 +1114,23 @@ vector rgb_to_hsv(vector rgb)
        float mi, ma;
        vector hsv;
 
-       mi = min(rgb_x, rgb_y, rgb_z);
-       ma = max(rgb_x, rgb_y, rgb_z);
+       mi = min(rgb.x, rgb.y, rgb.z);
+       ma = max(rgb.x, rgb.y, rgb.z);
 
-       hsv_x = rgb_mi_ma_to_hue(rgb, mi, ma);
-       hsv_z = ma;
+       hsv.x = rgb_mi_ma_to_hue(rgb, mi, ma);
+       hsv.z = ma;
 
        if(ma == 0)
-               hsv_y = 0;
+               hsv.y = 0;
        else
-               hsv_y = 1 - mi/ma;
+               hsv.y = 1 - mi/ma;
 
        return hsv;
 }
 
 vector hsv_to_rgb(vector hsv)
 {
-       return hue_mi_ma_to_rgb(hsv_x, hsv_z * (1 - hsv_y), hsv_z);
+       return hue_mi_ma_to_rgb(hsv.x, hsv.z * (1 - hsv.y), hsv.z);
 }
 
 vector rgb_to_hsl(vector rgb)
@@ -1130,18 +1138,18 @@ vector rgb_to_hsl(vector rgb)
        float mi, ma;
        vector hsl;
 
-       mi = min(rgb_x, rgb_y, rgb_z);
-       ma = max(rgb_x, rgb_y, rgb_z);
+       mi = min(rgb.x, rgb.y, rgb.z);
+       ma = max(rgb.x, rgb.y, rgb.z);
 
-       hsl_x = rgb_mi_ma_to_hue(rgb, mi, ma);
+       hsl.x = rgb_mi_ma_to_hue(rgb, mi, ma);
 
-       hsl_z = 0.5 * (mi + ma);
+       hsl.z = 0.5 * (mi + ma);
        if(mi == ma)
-               hsl_y = 0;
-       else if(hsl_z <= 0.5)
-               hsl_y = (ma - mi) / (2*hsl_z);
+               hsl.y = 0;
+       else if(hsl.z <= 0.5)
+               hsl.y = (ma - mi) / (2*hsl.z);
        else // if(hsl_z > 0.5)
-               hsl_y = (ma - mi) / (2 - 2*hsl_z);
+               hsl.y = (ma - mi) / (2 - 2*hsl.z);
 
        return hsl;
 }
@@ -1150,17 +1158,17 @@ vector hsl_to_rgb(vector hsl)
 {
        float mi, ma, maminusmi;
 
-       if(hsl_z <= 0.5)
-               maminusmi = hsl_y * 2 * hsl_z;
+       if(hsl.z <= 0.5)
+               maminusmi = hsl.y * 2 * hsl.z;
        else
-               maminusmi = hsl_y * (2 - 2 * hsl_z);
+               maminusmi = hsl.y * (2 - 2 * hsl.z);
 
        // hsl_z     = 0.5 * mi + 0.5 * ma
        // maminusmi =     - mi +       ma
-       mi = hsl_z - 0.5 * maminusmi;
-       ma = hsl_z + 0.5 * maminusmi;
+       mi = hsl.z - 0.5 * maminusmi;
+       ma = hsl.z + 0.5 * maminusmi;
 
-       return hue_mi_ma_to_rgb(hsl_x, mi, ma);
+       return hue_mi_ma_to_rgb(hsl.x, mi, ma);
 }
 
 string rgb_to_hexcolor(vector rgb)
@@ -1168,9 +1176,9 @@ string rgb_to_hexcolor(vector rgb)
        return
                strcat(
                        "^x",
-                       DEC_TO_HEXDIGIT(floor(rgb_x * 15 + 0.5)),
-                       DEC_TO_HEXDIGIT(floor(rgb_y * 15 + 0.5)),
-                       DEC_TO_HEXDIGIT(floor(rgb_z * 15 + 0.5))
+                       DEC_TO_HEXDIGIT(floor(rgb.x * 15 + 0.5)),
+                       DEC_TO_HEXDIGIT(floor(rgb.y * 15 + 0.5)),
+                       DEC_TO_HEXDIGIT(floor(rgb.z * 15 + 0.5))
                );
 }
 
@@ -1178,7 +1186,7 @@ string rgb_to_hexcolor(vector rgb)
 float boxesoverlap(vector m1, vector m2, vector m3, vector m4) {return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;}
 
 // requires the same, but is a stronger condition
-float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;}
+float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins.x >= bmins.x && smaxs.x <= bmaxs.x && smins.y >= bmins.y && smaxs.y <= bmaxs.y && smins.z >= bmins.z && smaxs.z <= bmaxs.z;}
 
 #ifndef MENUQC
 #endif
@@ -1313,17 +1321,17 @@ float textLengthUpToLength(string theText, float maxWidth, textLengthUpToLength_
 
 string find_last_color_code(string s)
 {
-       float start, len, i, carets;
-       start = strstrofs(s, "^", 0);
+       int start = strstrofs(s, "^", 0);
        if (start == -1) // no caret found
                return "";
-       len = strlen(s)-1;
+       int len = strlen(s)-1;
+       int i;
        for(i = len; i >= start; --i)
        {
                if(substring(s, i, 1) != "^")
                        continue;
 
-               carets = 1;
+               int carets = 1;
                while (i-carets >= start && substring(s, i-carets, 1) == "^")
                        ++carets;
 
@@ -1571,15 +1579,15 @@ vector solve_quadratic(float a, float b, float c) // ax^2 + bx + c = 0
        {
                if(b != 0)
                {
-                       v_x = v_y = -c / b;
-                       v_z = 1;
+                       v.x = v.y = -c / b;
+                       v.z = 1;
                }
                else
                {
                        if(c == 0)
                        {
                                // actually, every number solves the equation!
-                               v_z = 1;
+                               v.z = 1;
                        }
                }
        }
@@ -1591,26 +1599,26 @@ vector solve_quadratic(float a, float b, float c) // ax^2 + bx + c = 0
                        D = sqrt(D);
                        if(a > 0) // put the smaller solution first
                        {
-                               v_x = ((-b)-D) / (2*a);
-                               v_y = ((-b)+D) / (2*a);
+                               v.x = ((-b)-D) / (2*a);
+                               v.y = ((-b)+D) / (2*a);
                        }
                        else
                        {
-                               v_x = (-b+D) / (2*a);
-                               v_y = (-b-D) / (2*a);
+                               v.x = (-b+D) / (2*a);
+                               v.y = (-b-D) / (2*a);
                        }
-                       v_z = 1;
+                       v.z = 1;
                }
                else
                {
                        // complex solutions!
                        D = sqrt(-D);
-                       v_x = -b / (2*a);
+                       v.x = -b / (2*a);
                        if(a > 0)
-                               v_y =  D / (2*a);
+                               v.y =  D / (2*a);
                        else
-                               v_y = -D / (2*a);
-                       v_z = 0;
+                               v.y = -D / (2*a);
+                       v.z = 0;
                }
        }
        return v;
@@ -1634,7 +1642,7 @@ vector solve_shotdirection(vector myorg, vector myvel, vector eorg, vector evel,
        vector solution = solve_quadratic(evel * evel - spd * spd, 2 * (eorg * evel), eorg * eorg);
        // p = 2 * (eorg * evel) / (evel * evel - spd * spd)
        // q = (eorg * eorg) / (evel * evel - spd * spd)
-       if(!solution_z) // no real solution
+       if(!solution.z) // no real solution
        {
                // happens if D < 0
                // (eorg * evel)^2 < (evel^2 - spd^2) * eorg^2
@@ -1645,17 +1653,17 @@ vector solve_shotdirection(vector myorg, vector myvel, vector eorg, vector evel,
                // spd < |evel| * sin angle(evel, eorg)
                return '0 0 0';
        }
-       else if(solution_x > 0)
+       else if(solution.x > 0)
        {
                // both solutions > 0: take the smaller one
                // happens if p < 0 and q > 0
-               ret = normalize(eorg + solution_x * evel);
+               ret = normalize(eorg + solution.x * evel);
        }
-       else if(solution_y > 0)
+       else if(solution.y > 0)
        {
                // one solution > 0: take the larger one
                // happens if q < 0 or q == 0 and p < 0
-               ret = normalize(eorg + solution_y * evel);
+               ret = normalize(eorg + solution.y * evel);
        }
        else
        {
@@ -1702,12 +1710,12 @@ vector get_shotvelocity(vector myvel, vector mydir, float spd, float newton_styl
                vector solution = solve_quadratic(1, -2 * (mydir * myvel), myvel * myvel - spd * spd);
 
                float outspeed;
-               if(solution_z)
-                       outspeed = solution_y; // the larger one
+               if(solution.z)
+                       outspeed = solution.y; // the larger one
                else
                {
                        //outspeed = 0; // slowest possible shot
-                       outspeed = solution_x; // the real part (that is, the average!)
+                       outspeed = solution.x; // the real part (that is, the average!)
                        //dprint("impossible shot, adjusting\n");
                }
 
@@ -1722,9 +1730,9 @@ vector get_shotvelocity(vector myvel, vector mydir, float spd, float newton_styl
 float compressShotOrigin(vector v)
 {
        float x, y, z;
-       x = rint(v_x * 2);
-       y = rint(v_y * 4) + 128;
-       z = rint(v_z * 4) + 128;
+       x = rint(v.x * 2);
+       y = rint(v.y * 4) + 128;
+       z = rint(v.z * 4) + 128;
        if(x > 255 || x < 0)
        {
                print("shot origin ", vtos(v), " x out of bounds\n");
@@ -1742,12 +1750,12 @@ float compressShotOrigin(vector v)
        }
        return x * 0x10000 + y * 0x100 + z;
 }
-vector decompressShotOrigin(float f)
+vector decompressShotOrigin(int f)
 {
        vector v;
-       v_x = ((f & 0xFF0000) / 0x10000) / 2;
-       v_y = ((f & 0xFF00) / 0x100 - 128) / 4;
-       v_z = ((f & 0xFF) - 128) / 4;
+       v.x = ((f & 0xFF0000) / 0x10000) / 2;
+       v.y = ((f & 0xFF00) / 0x100 - 128) / 4;
+       v.z = ((f & 0xFF) - 128) / 4;
        return v;
 }
 
@@ -1835,7 +1843,7 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori
 }
 
 #ifndef MENUQC
-vector healtharmor_maxdamage(float h, float a, float armorblock, float deathtype)
+vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
 {
        // NOTE: we'll always choose the SMALLER value...
        float healthdamage, armordamage, armorideal;
@@ -1845,28 +1853,28 @@ vector healtharmor_maxdamage(float h, float a, float armorblock, float deathtype
        healthdamage = (h - 1) / (1 - armorblock); // damage we can take if we could use more health
        armordamage = a + (h - 1); // damage we can take if we could use more armor
        armorideal = healthdamage * armorblock;
-       v_y = armorideal;
+       v.y = armorideal;
        if(armordamage < healthdamage)
        {
-               v_x = armordamage;
-               v_z = 1;
+               v.x = armordamage;
+               v.z = 1;
        }
        else
        {
-               v_x = healthdamage;
-               v_z = 0;
+               v.x = healthdamage;
+               v.z = 0;
        }
        return v;
 }
 
-vector healtharmor_applydamage(float a, float armorblock, float deathtype, float damage)
+vector healtharmor_applydamage(float a, float armorblock, int deathtype, float damage)
 {
        vector v;
        if (deathtype == DEATH_DROWN)  // Why should armor help here...
                armorblock = 0;
-       v_y = bound(0, damage * armorblock, a); // save
-       v_x = bound(0, damage - v_y, damage); // take
-       v_z = 0;
+       v.y = bound(0, damage * armorblock, a); // save
+       v.x = bound(0, damage - v.y, damage); // take
+       v.z = 0;
        return v;
 }
 #endif
@@ -1885,27 +1893,26 @@ string getcurrentmod()
 
 #ifndef MENUQC
 #ifdef CSQC
-float ReadInt24_t()
+int ReadInt24_t()
 {
-       float v;
-       v = ReadShort() * 256; // note: this is signed
+       int v = ReadShort() * 256; // note: this is signed
        v += ReadByte(); // note: this is unsigned
        return v;
 }
 vector ReadInt48_t()
 {
        vector v;
-       v_x = ReadInt24_t();
-       v_y = ReadInt24_t();
-       v_z = 0;
+       v.x = ReadInt24_t();
+       v.y = ReadInt24_t();
+       v.z = 0;
        return v;
 }
 vector ReadInt72_t()
 {
        vector v;
-       v_x = ReadInt24_t();
-       v_y = ReadInt24_t();
-       v_z = ReadInt24_t();
+       v.x = ReadInt24_t();
+       v.y = ReadInt24_t();
+       v.z = ReadInt24_t();
        return v;
 }
 #else
@@ -1917,14 +1924,14 @@ void WriteInt24_t(float dst, float val)
 }
 void WriteInt48_t(float dst, vector val)
 {
-       WriteInt24_t(dst, val_x);
-       WriteInt24_t(dst, val_y);
+       WriteInt24_t(dst, val.x);
+       WriteInt24_t(dst, val.y);
 }
 void WriteInt72_t(float dst, vector val)
 {
-       WriteInt24_t(dst, val_x);
-       WriteInt24_t(dst, val_y);
-       WriteInt24_t(dst, val_z);
+       WriteInt24_t(dst, val.x);
+       WriteInt24_t(dst, val.y);
+       WriteInt24_t(dst, val.z);
 }
 #endif
 #endif
@@ -2035,9 +2042,6 @@ string get_model_datafilename(string m, float sk, string fil)
 
 float get_model_parameters(string m, float sk)
 {
-       string fn, s, c;
-       float fh, i;
-
        get_model_parameters_modelname = string_null;
        get_model_parameters_modelskin = -1;
        get_model_parameters_name = string_null;
@@ -2048,7 +2052,7 @@ float get_model_parameters(string m, float sk)
        get_model_parameters_desc = string_null;
        get_model_parameters_bone_upperbody = string_null;
        get_model_parameters_bone_weapon = string_null;
-       for(i = 0; i < MAX_AIM_BONES; ++i)
+       for(int i = 0; i < MAX_AIM_BONES; ++i)
        {
                get_model_parameters_bone_aim[i] = string_null;
                get_model_parameters_bone_aimweight[i] = 0;
@@ -2071,8 +2075,8 @@ float get_model_parameters(string m, float sk)
                m = substring(m, 0, -7);
        }
 
-       fn = get_model_datafilename(m, sk, "txt");
-       fh = fopen(fn, FILE_READ);
+       string fn = get_model_datafilename(m, sk, "txt");
+       int fh = fopen(fn, FILE_READ);
        if(fh < 0)
        {
                sk = 0;
@@ -2084,6 +2088,7 @@ float get_model_parameters(string m, float sk)
 
        get_model_parameters_modelname = m;
        get_model_parameters_modelskin = sk;
+       string s, c;
        while((s = fgets(fh)))
        {
                if(s == "")
@@ -2115,7 +2120,7 @@ float get_model_parameters(string m, float sk)
                        get_model_parameters_bone_upperbody = s;
                if(c == "bone_weapon")
                        get_model_parameters_bone_weapon = s;
-               for(i = 0; i < MAX_AIM_BONES; ++i)
+               for(int i = 0; i < MAX_AIM_BONES; ++i)
                        if(c == strcat("bone_aim", ftos(i)))
                        {
                                get_model_parameters_bone_aimweight[i] = stof(car(s));
@@ -2140,7 +2145,7 @@ float get_model_parameters(string m, float sk)
 
 vector vec2(vector v)
 {
-       v_z = 0;
+       v.z = 0;
        return v;
 }
 
@@ -2152,9 +2157,9 @@ vector NearestPointOnBox(entity box, vector org)
        m1 = box.mins + box.origin;
        m2 = box.maxs + box.origin;
 
-       nearest_x = bound(m1_x, org_x, m2_x);
-       nearest_y = bound(m1_y, org_y, m2_y);
-       nearest_z = bound(m1_z, org_z, m2_z);
+       nearest.x = bound(m1_x, org.x, m2_x);
+       nearest.y = bound(m1_y, org.y, m2_y);
+       nearest.z = bound(m1_z, org.z, m2_z);
 
        return nearest;
 }
@@ -2258,13 +2263,13 @@ string CTX(string s)
 // x-encoding (encoding as zero length invisible string)
 const string XENCODE_2  = "xX";
 const string XENCODE_22 = "0123456789abcdefABCDEF";
-string xencode(float f)
+string xencode(int f)
 {
        float a, b, c, d;
-       d = mod(f, 22); f = floor(f / 22);
-       c = mod(f, 22); f = floor(f / 22);
-       b = mod(f, 22); f = floor(f / 22);
-       a = mod(f,  2); // f = floor(f /  2);
+       d = f % 22; f = floor(f / 22);
+       c = f % 22; f = floor(f / 22);
+       b = f % 22; f = floor(f / 22);
+       a = f %  2; // f = floor(f /  2);
        return strcat(
                "^",
                substring(XENCODE_2,  a, 1),
@@ -2289,7 +2294,7 @@ float xdecode(string s)
        return ((a * 22 + b) * 22 + c) * 22 + d;
 }
 
-float lowestbit(float f)
+int lowestbit(int f)
 {
        f &= ~(f * 2);
        f &= ~(f * 4);
@@ -2327,12 +2332,12 @@ float InterpretBoolean(string input)
                case "yes":
                case "true":
                case "on":
-                       return TRUE;
+                       return true;
 
                case "no":
                case "false":
                case "off":
-                       return FALSE;
+                       return false;
 
                default: return stof(input);
        }
@@ -2342,8 +2347,7 @@ float InterpretBoolean(string input)
 #ifdef CSQC
 entity ReadCSQCEntity()
 {
-       float f;
-       f = ReadShort();
+       int f = ReadShort();
        if(f == 0)
                return world;
        return findfloat(world, entnum, f);
@@ -2373,7 +2377,7 @@ void m_shutdown()
        cvar_settemp_restore(); // this must be done LAST, but in any case
 }
 
-#define APPROXPASTTIME_ACCURACY_REQUIREMENT 0.05
+const float APPROXPASTTIME_ACCURACY_REQUIREMENT = 0.05;
 #define APPROXPASTTIME_MAX (16384 * APPROXPASTTIME_ACCURACY_REQUIREMENT)
 #define APPROXPASTTIME_RANGE (64 * APPROXPASTTIME_ACCURACY_REQUIREMENT)
 // this will use the value:
@@ -2459,25 +2463,25 @@ float cubic_speedfunc(float startspeedfactor, float endspeedfactor, float x)
 float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor)
 {
        if(startspeedfactor < 0 || endspeedfactor < 0)
-               return FALSE;
+               return false;
 
        /*
        // if this is the case, the possible zeros of the first derivative are outside
        // 0..1
        We can calculate this condition as condition
        if(se <= 3)
-               return TRUE;
+               return true;
        */
 
        // better, see below:
        if(startspeedfactor <= 3 && endspeedfactor <= 3)
-               return TRUE;
+               return true;
 
        // if this is the case, the first derivative has no zeros at all
        float se = startspeedfactor + endspeedfactor;
        float s_e = startspeedfactor - endspeedfactor;
        if(3 * (se - 4) * (se - 4) + s_e * s_e <= 12) // an ellipse
-               return TRUE;
+               return true;
 
        // Now let s <= 3, s <= 3, s+e >= 3 (triangle) then we get se <= 6 (top right corner).
        // we also get s_e <= 6 - se
@@ -2485,7 +2489,7 @@ float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor)
        // is quadratic, has value 12 at 3 and 6, and value < 12 in between.
        // Therefore, above "better" check works!
 
-       return FALSE;
+       return false;
 
        // known good cases:
        // (0, [0..3])
@@ -2535,11 +2539,11 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
 
        // start with a 1-element queue
        queue_start = queue_end = e;
-       queue_end.fld = world;
+       queue_end.(fld) = world;
        queue_end.FindConnectedComponent_processing = 1;
 
        // for each queued item:
-       for(; queue_start; queue_start = queue_start.fld)
+       for (; queue_start; queue_start = queue_start.(fld))
        {
                // find all neighbors of queue_start
                entity t;
@@ -2550,23 +2554,23 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
                        if(iscon(t, queue_start, pass))
                        {
                                // it is connected? ADD IT. It will look for neighbors soon too.
-                               queue_end.fld = t;
+                               queue_end.(fld) = t;
                                queue_end = t;
-                               queue_end.fld = world;
+                               queue_end.(fld) = world;
                                queue_end.FindConnectedComponent_processing = 1;
                        }
                }
        }
 
        // unmark
-       for(queue_start = e; queue_start; queue_start = queue_start.fld)
+       for (queue_start = e; queue_start; queue_start = queue_start.(fld))
                queue_start.FindConnectedComponent_processing = 0;
 }
 
 #ifdef SVQC
 vector combine_to_vector(float x, float y, float z)
 {
-       vector result; result_x = x; result_y = y; result_z = z;
+       vector result; result.x = x; result.y = y; result.z = z;
        return result;
 }
 
@@ -2574,14 +2578,14 @@ vector get_corner_position(entity box, float corner)
 {
        switch(corner)
        {
-               case 1: return combine_to_vector(box.absmin_x, box.absmin_y, box.absmin_z);
-               case 2: return combine_to_vector(box.absmax_x, box.absmin_y, box.absmin_z);
-               case 3: return combine_to_vector(box.absmin_x, box.absmax_y, box.absmin_z);
-               case 4: return combine_to_vector(box.absmin_x, box.absmin_y, box.absmax_z);
-               case 5: return combine_to_vector(box.absmax_x, box.absmax_y, box.absmin_z);
-               case 6: return combine_to_vector(box.absmin_x, box.absmax_y, box.absmax_z);
-               case 7: return combine_to_vector(box.absmax_x, box.absmin_y, box.absmax_z);
-               case 8: return combine_to_vector(box.absmax_x, box.absmax_y, box.absmax_z);
+               case 1: return combine_to_vector(box.absmin.x, box.absmin.y, box.absmin.z);
+               case 2: return combine_to_vector(box.absmax.x, box.absmin.y, box.absmin.z);
+               case 3: return combine_to_vector(box.absmin.x, box.absmax.y, box.absmin.z);
+               case 4: return combine_to_vector(box.absmin.x, box.absmin.y, box.absmax.z);
+               case 5: return combine_to_vector(box.absmax.x, box.absmax.y, box.absmin.z);
+               case 6: return combine_to_vector(box.absmin.x, box.absmax.y, box.absmax.z);
+               case 7: return combine_to_vector(box.absmax.x, box.absmin.y, box.absmax.z);
+               case 8: return combine_to_vector(box.absmax.x, box.absmax.y, box.absmax.z);
                default: return '0 0 0';
        }
 }
@@ -2635,9 +2639,9 @@ string CCR(string input)
 vector vec3(float x, float y, float z)
 {
        vector v;
-       v_x = x;
-       v_y = y;
-       v_z = z;
+       v.x = x;
+       v.y = y;
+       v.z = z;
        return v;
 }
 
@@ -2645,17 +2649,17 @@ vector vec3(float x, float y, float z)
 vector animfixfps(entity e, vector a, vector b)
 {
        // multi-frame anim: keep as-is
-       if(a_y == 1)
+       if(a.y == 1)
        {
                float dur;
-               dur = frameduration(e.modelindex, a_x);
-               if(dur <= 0 && b_y)
+               dur = frameduration(e.modelindex, a.x);
+               if(dur <= 0 && b.y)
                {
                        a = b;
-                       dur = frameduration(e.modelindex, a_x);
+                       dur = frameduration(e.modelindex, a.x);
                }
                if(dur > 0)
-                       a_z = 1.0 / dur;
+                       a.z = 1.0 / dur;
        }
        return a;
 }
@@ -2781,7 +2785,7 @@ float Announcer_PickNumber(float type, float num)
 #endif
 
 #ifndef MENUQC
-float Mod_Q1BSP_SuperContentsFromNativeContents(float nativecontents)
+int Mod_Q1BSP_SuperContentsFromNativeContents(int nativecontents)
 {
        switch(nativecontents)
        {
@@ -2801,7 +2805,7 @@ float Mod_Q1BSP_SuperContentsFromNativeContents(float nativecontents)
        return 0;
 }
 
-float Mod_Q1BSP_NativeContentsFromSuperContents(float supercontents)
+int Mod_Q1BSP_NativeContentsFromSuperContents(int supercontents)
 {
        if(supercontents & (DPCONTENTS_SOLID | DPCONTENTS_BODY))
                return CONTENT_SOLID;