]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/util.qc
Move fexists from server/miscfunctions.qc to common/util.qc so that it's available...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / util.qc
index 8c87b7fdad4f0e81a26e66633d9bb9032c7020a8..05152d4bb595b27e7137e1976edb4a681aad6363 100644 (file)
@@ -1,43 +1,3 @@
-// checkextension wrapper for log
-float sqrt(float f); // declared later
-float exp(float f); // declared later
-float pow(float f, float e); // declared later
-float checkextension(string s); // declared later
-float log_synth(float f)
-{
-       float p, l;
-       if(f < 0)
-               return sqrt(-1); // nan? -inf?
-       if(f == 0)
-               return sqrt(-1); // ACTUALLY this should rather be -inf, but we cannot create a +inf in QC
-       if(f + f == f)
-               return l; // +inf
-       if(f < 1)
-       {
-               f = 1 / f;
-               p = -1;
-       }
-       else
-               p = 1;
-       while(f > 2)
-       {
-               f = sqrt(f);
-               p *= 2;
-       }
-       // two steps are good enough
-       l = ((6-f) * f - 5) / 4.32808512266689022212;
-       l += exp(-l) * f - 1;
-       l += exp(-l) * f - 1;
-       return l * p;
-}
-float log(float f)
-{
-       if(checkextension("DP_QC_LOG"))
-               return log_builtin(f);
-       else
-               return log_synth(f);
-}
-
 string wordwrap_buffer;
 
 void wordwrap_buffer_put(string s)
@@ -276,6 +236,16 @@ string fstrunzone(string s)
        return sc;
 }
 
+float fexists(string f)
+{
+    float fh;
+    fh = fopen(f, FILE_READ);
+    if (fh < 0)
+        return FALSE;
+    fclose(fh);
+    return TRUE;
+}
+
 // Databases (hash tables)
 #define DB_BUCKETS 8192
 void db_save(float db, string pFilename)
@@ -400,7 +370,10 @@ float buf_load(string pFilename)
                return -1;
        fh = fopen(pFilename, FILE_READ);
        if(fh < 0)
-               return buf;
+       {
+               buf_del(buf);
+               return -1;
+       }
        i = 0;
        while((l = fgets(fh)))
        {
@@ -439,6 +412,8 @@ string GametypeNameFromType(float g)
        else if (g == GAME_RACE) return "rc";
        else if (g == GAME_NEXBALL) return "nexball";
        else if (g == GAME_CTS) return "cts";
+       else if (g == GAME_FREEZETAG) return "freezetag";
+       else if (g == GAME_KEEPAWAY) return "ka";
        return "dm";
 }
 
@@ -1402,18 +1377,22 @@ string textShortenToLength(string theText, float maxWidth, textLengthUpToLength_
                return strcat(substring(theText, 0, textLengthUpToLength(theText, maxWidth - tw("..."), tw)), "...");
 }
 
-float isGametypeInFilter(float gt, float tp, string pattern)
+float isGametypeInFilter(float gt, float tp, float ts, string pattern)
 {
-       string subpattern, subpattern2, subpattern3;
+       string subpattern, subpattern2, subpattern3, subpattern4;
        subpattern = strcat(",", GametypeNameFromType(gt), ",");
        if(tp)
                subpattern2 = ",teams,";
        else
                subpattern2 = ",noteams,";
+       if(ts)
+               subpattern3 = ",teamspawns,";
+       else
+               subpattern3 = ",noteamspawns,";
        if(gt == GAME_RACE || gt == GAME_CTS)
-               subpattern3 = ",race,";
+               subpattern4 = ",race,";
        else
-               subpattern3 = string_null;
+               subpattern4 = string_null;
 
        if(substring(pattern, 0, 1) == "-")
        {
@@ -1422,7 +1401,9 @@ float isGametypeInFilter(float gt, float tp, string pattern)
                        return 0;
                if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) >= 0)
                        return 0;
-               if(subpattern3 && strstrofs(strcat(",", pattern, ","), subpattern3, 0) >= 0)
+               if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) >= 0)
+                       return 0;
+               if(subpattern4 && strstrofs(strcat(",", pattern, ","), subpattern4, 0) >= 0)
                        return 0;
        }
        else
@@ -1431,7 +1412,8 @@ float isGametypeInFilter(float gt, float tp, string pattern)
                        pattern = substring(pattern, 1, strlen(pattern) - 1);
                if(strstrofs(strcat(",", pattern, ","), subpattern, 0) < 0)
                if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) < 0)
-               if((!subpattern3) || strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0)
+               if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0)
+               if((!subpattern4) || strstrofs(strcat(",", pattern, ","), subpattern4, 0) < 0)
                        return 0;
        }
        return 1;
@@ -1875,7 +1857,13 @@ float get_model_parameters(string m, float sk)
        fn = get_model_datafilename(m, sk, "txt");
        fh = fopen(fn, FILE_READ);
        if(fh < 0)
-               return 0;
+       {
+               sk = 0;
+               fn = get_model_datafilename(m, sk, "txt");
+               fh = fopen(fn, FILE_READ);
+               if(fh < 0)
+                       return 0;
+       }
 
        get_model_parameters_modelname = m;
        get_model_parameters_modelskin = sk;
@@ -1991,3 +1979,47 @@ float vercmp(string v1, string v2)
 
        return vercmp_recursive(v1, v2);
 }
+
+float u8_strsize(string s)
+{
+       float l, i, c;
+       l = 0;
+       for(i = 0; ; ++i)
+       {
+               c = str2chr(s, i);
+               if(c <= 0)
+                       break;
+               ++l;
+               if(c >= 0x80)
+                       ++l;
+               if(c >= 0x800)
+                       ++l;
+               if(c >= 0x10000)
+                       ++l;
+       }
+       return l;
+}
+
+// translation helpers
+string language_filename(string s)
+{
+       string fn;
+       float fh;
+       fn = prvm_language;
+       if(fn == "" || fn == "dump")
+               return s;
+       fn = strcat(s, ".", fn);
+       if((fh = fopen(fn, FILE_READ)) >= 0)
+       {
+               fclose(fh);
+               return fn;
+       }
+       return s;
+}
+string CTX(string s)
+{
+       float p = strstrofs(s, "^", 0);
+       if(p < 0)
+               return s;
+       return substring(s, p+1, -1);
+}