X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=f47bcf15ab0a8da92700c6b664c87e2a2e37c8ba;hb=f19182bb895ceff0b85a38d663576cc3cff873a5;hp=671c8d5a593e23f9c552a700172cc57b9cf7139c;hpb=71e6c75bc408ae5a116f296797c49c0cef7be113;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 671c8d5a5..f47bcf15a 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -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) @@ -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) +float 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]) @@ -2539,7 +2543,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t 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; @@ -2566,7 +2570,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t #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;