]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/lib/random.qc
Add some missing parenthesis
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / random.qc
index 6ae0f784d88de7afac96dcabb0827f02318b6ee8..a5ff69356a21f516ba290bac01761eac2a7cce88 100644 (file)
@@ -1,5 +1,6 @@
 #include "random.qh"
 
+ERASEABLE
 void RandomSelection_Init()
 {
        RandomSelection_totalweight = 0;
@@ -9,7 +10,8 @@ void RandomSelection_Init()
        RandomSelection_best_priority = -1;
 }
 
-void RandomSelection_Add(entity e, float f, string s, float weight, float priority)
+ERASEABLE
+void RandomSelection_Add(entity e, float f, string s, vector v, float weight, float priority)
 {
        if (priority > RandomSelection_best_priority)
        {
@@ -17,6 +19,7 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori
                RandomSelection_chosen_ent = e;
                RandomSelection_chosen_float = f;
                RandomSelection_chosen_string = s;
+               RandomSelection_chosen_vec = v;
                RandomSelection_totalweight = weight;
        }
        else if (priority == RandomSelection_best_priority)
@@ -27,10 +30,68 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori
                        RandomSelection_chosen_ent = e;
                        RandomSelection_chosen_float = f;
                        RandomSelection_chosen_string = s;
+                       RandomSelection_chosen_vec = v;
                }
        }
 }
 
+float DistributeEvenly_amount;
+float DistributeEvenly_totalweight;
+
+ERASEABLE
+void DistributeEvenly_Init(float amount, float totalweight)
+{
+       if (DistributeEvenly_amount)
+       {
+               LOG_TRACE("DistributeEvenly_Init: UNFINISHED DISTRIBUTION (", ftos(DistributeEvenly_amount), " for ", ftos(DistributeEvenly_totalweight), " left!)");
+       }
+       if (totalweight == 0) DistributeEvenly_amount = 0;
+       else DistributeEvenly_amount = amount;
+       DistributeEvenly_totalweight = totalweight;
+}
+
+ERASEABLE
+float DistributeEvenly_Get(float weight)
+{
+       float f;
+       if (weight <= 0) return 0;
+       f = floor(0.5 + DistributeEvenly_amount * weight / DistributeEvenly_totalweight);
+       DistributeEvenly_totalweight -= weight;
+       DistributeEvenly_amount -= f;
+       return f;
+}
+
+ERASEABLE
+float DistributeEvenly_GetRandomized(float weight)
+{
+       float f;
+       if (weight <= 0) return 0;
+       f = floor(random() + DistributeEvenly_amount * weight / DistributeEvenly_totalweight);
+       DistributeEvenly_totalweight -= weight;
+       DistributeEvenly_amount -= f;
+       return f;
+}
+
+// from the GNU Scientific Library
+float gsl_ran_gaussian_lastvalue;
+float gsl_ran_gaussian_lastvalue_set;
+ERASEABLE
+float gsl_ran_gaussian(float sigma)
+{
+       if (gsl_ran_gaussian_lastvalue_set)
+       {
+               gsl_ran_gaussian_lastvalue_set = 0;
+               return sigma * gsl_ran_gaussian_lastvalue;
+       }
+       else
+       {
+               float a = random() * 2 * M_PI;
+               float b = sqrt(-2 * log(random()));
+               gsl_ran_gaussian_lastvalue = cos(a) * b;
+               gsl_ran_gaussian_lastvalue_set = 1;
+               return sigma * sin(a) * b;
+       }
+}
 
 // prandom - PREDICTABLE random number generator (not seeded yet)
 
@@ -43,7 +104,7 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori
                prandom_seed = c;
 
        #ifdef USE_PRANDOM_DEBUG
-                       LOG_TRACE("RANDOM -> ", ftos(c), "\n");
+                       LOG_TRACE("RANDOM -> ", ftos(c));
        #endif
 
                return c / 65536;  // in [0..1[
@@ -68,14 +129,14 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori
        {
                prandom_seed = seed;
        #ifdef USE_PRANDOM_DEBUG
-                       LOG_TRACE("SRANDOM ", ftos(seed), "\n");
+                       LOG_TRACE("SRANDOM ", ftos(seed));
        #endif
        }
 
        #ifdef USE_PRANDOM_DEBUG
                void prandom_debug()
                {
-                       LOG_TRACE("Current random seed = ", ftos(prandom_seed), "\n");
+                       LOG_TRACE("Current random seed = ", ftos(prandom_seed));
                }
        #endif
 #endif