mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-01-17 00:05:07 -05:00
* Code compiles - execution NOT tested * updating gitignore * Removed intellij settings files * Removed more intellij files * Added exclusion for JDK classes. * Fixed purchasing script for vendors that have listed coin types. * Updated script to not kick off until the entire preload is complete. * adds static name entry for Solo movie poster and tcg9 vendor entry * clean up empty and orphaned object templates * adds placeholder black market (static) spawns * corrects entries for the video game table to correctly set it in tcg series 2 and remove series 1 console errors * Updated gitignore and removed intellij project files * Fixed appearance reference for thranta payroll and kashyyyk door, added skipLosCheck objvar due to cannit see issue. Requires updated src * Fixed appearance and template for terminal (#2) * Fixed appearance and template for terminal (#3) * Fixed appearance and template for terminal (#4) * Deleted another faulty/orphaned object template * Fixed gcw ranks option on frog. Only issue is that it doesn't award the officer commands or badges. * Fixed some unneeded java 11 changes
338 lines
7.8 KiB
Java
Executable File
338 lines
7.8 KiB
Java
Executable File
/*
|
|
Title: random
|
|
Description: Random number generator. Algorithm taken from Numerical
|
|
Methods in C, func ran3().
|
|
*/
|
|
|
|
package script;
|
|
|
|
public class random
|
|
{
|
|
private static java.util.Random sysRand = new java.util.Random();
|
|
|
|
private static final long MOD_VALUE = 0x00000000ffffffffL;
|
|
private static final double MAX_RAND = 4294967296.0;
|
|
private static final long A = 30903;
|
|
|
|
private static boolean gaussOne = true;
|
|
private static float gaussY1 = 0;
|
|
private static float gaussY2 = 0;
|
|
|
|
private static long x_1 = 0;
|
|
private static long x_carry = 0;
|
|
private static long z_1 = 0;
|
|
private static long z_2 = 0;
|
|
private static long z_carry = 0;
|
|
|
|
private static long[] cache = new long[1024];
|
|
|
|
private static boolean firstRand = true;
|
|
|
|
|
|
/**
|
|
* Computes a random number in the range 0 -> 2^32-1
|
|
*
|
|
* @return a random number
|
|
*/
|
|
public static long computeIt()
|
|
{
|
|
long x = A * x_1 + x_carry;
|
|
x_carry = x >> 32;
|
|
x &= MOD_VALUE;
|
|
x_1 = x;
|
|
|
|
long z = 2 * z_1 + z_2 + z_carry;
|
|
z_carry = z >>> 32;
|
|
z &= MOD_VALUE;
|
|
z_2 = z_1;
|
|
z_1 = z;
|
|
|
|
return ((x + z) & MOD_VALUE);
|
|
}
|
|
|
|
/**
|
|
* Computes a random number in the range [0,1)
|
|
*
|
|
* @return a random number
|
|
*/
|
|
public static float rand()
|
|
{
|
|
long r = lrand();
|
|
return (float)(r / MAX_RAND);
|
|
} // rand()
|
|
|
|
/**
|
|
* Computes a random number with a gaussian distribution with 0 mean and std dev of 1.
|
|
*
|
|
* @return a random number
|
|
*/
|
|
public static float gaussRand()
|
|
{
|
|
// this function generates pairs of random numbers; we generate the pair the first call and
|
|
// return one of the numbers, then return the second number for the next call
|
|
if ( gaussOne )
|
|
{
|
|
gaussOne = false;
|
|
|
|
// compute the next pair
|
|
float x1, x2, w;
|
|
do {
|
|
x1 = 2.0f * rand() - 1.0f;
|
|
x2 = 2.0f * rand() - 1.0f;
|
|
w = x1 * x1 + x2 * x2;
|
|
} while ( w >= 1.0 );
|
|
|
|
if ( w != 0 )
|
|
{
|
|
w = (float)(Math.sqrt( (-2.0 * StrictMath.log( w ) ) / w ));
|
|
gaussY1 = x1 * w;
|
|
gaussY2 = x2 * w;
|
|
}
|
|
else
|
|
{
|
|
gaussY1 = 0;
|
|
gaussY2 = 0;
|
|
}
|
|
return gaussY1;
|
|
}
|
|
else
|
|
{
|
|
gaussOne = true;
|
|
return gaussY2;
|
|
}
|
|
} // rand()
|
|
|
|
|
|
/**
|
|
* Computes a random float in the range [0,1), reseeding the generator
|
|
* before doing so.
|
|
*
|
|
* @param seed the new seed
|
|
*
|
|
* @return a random float
|
|
*/
|
|
public static float rand(int seed)
|
|
{
|
|
reseed(seed);
|
|
return rand();
|
|
} // rand(int)
|
|
|
|
/**
|
|
* Computes a random number in the range 0 -> 2^32-1
|
|
*
|
|
* @return a random number
|
|
*/
|
|
protected static long lrand()
|
|
{
|
|
if (firstRand)
|
|
reseed((int)(System.currentTimeMillis()), sysRand.nextInt(), 74719);
|
|
|
|
long rand = computeIt();
|
|
int index = (int)(rand & 0x03ff);
|
|
long retVal = cache[index];
|
|
cache[index] = computeIt();
|
|
return retVal;
|
|
} // rand()
|
|
|
|
/**
|
|
* Computes a distributed random integer in the range [min, max]
|
|
* The random distribution is based on the parameter dist.
|
|
* When dist is between 0.0-1.0 the entire random number range is used
|
|
* and the mean distribution is shifted towards that location in the range.
|
|
* When dist is greater than 1 or less than 0 the random range is reduced
|
|
* such that at -1.0 the min is always returned and at 2.0 the max.
|
|
*
|
|
* @param min lower value of random integer
|
|
* @param max upper value of random integer
|
|
* @param dist distribution mean of random number
|
|
*
|
|
* @return a random integer
|
|
*/
|
|
public static int distributedRand(int min, int max, float dist)
|
|
{
|
|
boolean inverted = false;
|
|
int _min = min;
|
|
int _max = max;
|
|
|
|
if (dist < -1) dist = -1;
|
|
if (dist > 2) dist = 2;
|
|
|
|
if (min > max)
|
|
{
|
|
inverted = true;
|
|
min = _max;
|
|
max = _min;
|
|
}
|
|
|
|
float mid = min + ((max - min) * dist);
|
|
|
|
if (mid < min) { max += (mid-min); mid = min; }
|
|
if (mid > max) { min += (mid-max); mid = max; }
|
|
|
|
int minRand = rand(min, (int)(mid+0.5f));
|
|
int maxRand = rand((int)(mid+0.5f), max);
|
|
|
|
int randNum = rand(minRand, maxRand);
|
|
|
|
if (inverted)
|
|
randNum = _min + (_max - randNum);
|
|
|
|
return randNum;
|
|
} // distributedRand(int, int, float)
|
|
|
|
/**
|
|
* Computes a distributed random float in the range [min, max]
|
|
*
|
|
* @param min lower value of random float
|
|
* @param max upper value of random float
|
|
* @param dist distribution mean of random number
|
|
*
|
|
* @return a random float
|
|
*/
|
|
public static float distributedRand(float min, float max, float dist)
|
|
{
|
|
boolean inverted = false;
|
|
float _min = min;
|
|
float _max = max;
|
|
|
|
if (dist < -1) dist = -1;
|
|
if (dist > 2) dist = 2;
|
|
|
|
if (min > max)
|
|
{
|
|
inverted = true;
|
|
min = _max;
|
|
max = _min;
|
|
}
|
|
|
|
float mid = min + ((max - min) * dist);
|
|
|
|
if (mid < min) { max += (mid-min); mid = min; }
|
|
if (mid > max) { min += (mid-max); mid = max; }
|
|
|
|
float minRand = rand(min, mid);
|
|
float maxRand = rand(mid, max);
|
|
|
|
float randNum = rand(minRand, maxRand);
|
|
|
|
if (inverted)
|
|
randNum = _min + (_max - randNum);
|
|
|
|
return randNum;
|
|
} // distributedRand(float, float, float)
|
|
|
|
/**
|
|
* Computes a random integer in the range [minVal, maxVal]
|
|
*
|
|
* @param minVal lower value of random integer
|
|
* @param maxVal upper value of random integer
|
|
*
|
|
* @return a random integer
|
|
*/
|
|
protected static int rand(int minVal, int maxVal)
|
|
{
|
|
return (int)(rand() * (maxVal - minVal + 1)) + minVal;
|
|
} // rand(int, int)
|
|
|
|
/**
|
|
* Computes a random float in the range [minVal, maxVal)
|
|
*
|
|
* @param minVal lower value of random float
|
|
* @param maxVal upper value of random float
|
|
*
|
|
* @return a random float
|
|
*/
|
|
protected static float rand(float minVal, float maxVal)
|
|
{
|
|
return (rand() * (maxVal - minVal)) + minVal;
|
|
} // rand(float, float)
|
|
|
|
/**
|
|
* Generates a random number based on rolling multiple dice.
|
|
*
|
|
* @param numDie number of die to roll
|
|
* @param dieSize number of sides the die has
|
|
* @param base number to add to the result of rolling the dice
|
|
*
|
|
* @return the random number
|
|
*/
|
|
protected static int rand(int numDie, int dieSize, int base)
|
|
{
|
|
if (numDie <= 0 || dieSize <= 1)
|
|
return base;
|
|
|
|
int result = base;
|
|
for (int i = 0; i < numDie; ++i)
|
|
result += rand(1, dieSize);
|
|
return result;
|
|
} // rand(int, int, int)
|
|
|
|
/**
|
|
* Generates a normalized random number based on rolling multiple dice.
|
|
*
|
|
* @param numDie number of die to roll
|
|
* @param dieSize number of sides the die has
|
|
*
|
|
* @return the random number, normalized to [0, 1]
|
|
*/
|
|
protected static float randNormalized(int numDie, int dieSize)
|
|
{
|
|
int result = rand(numDie, dieSize, 0);
|
|
if (result == 0)
|
|
return 0;
|
|
return (float)(result - numDie) / (numDie * (dieSize - 1));
|
|
} // randNormalized
|
|
|
|
/**
|
|
* Reseeds the random number generator.
|
|
*
|
|
* @param seed the new seed
|
|
*/
|
|
protected static void reseed(int seed)
|
|
{
|
|
switch ( (int)(rand() * 3.0f) )
|
|
{
|
|
case 0 :
|
|
reseed(seed, (int)(System.currentTimeMillis()), sysRand.nextInt());
|
|
break;
|
|
case 1 :
|
|
reseed(sysRand.nextInt(), seed, (int)(System.currentTimeMillis()));
|
|
break;
|
|
case 2 :
|
|
reseed((int)(System.currentTimeMillis()), sysRand.nextInt(), seed);
|
|
break;
|
|
}
|
|
} // reseed
|
|
|
|
/**
|
|
* Computes a random number with a gaussian distribution with a given mean and std dev.
|
|
*
|
|
* @param mean the number's mean
|
|
* @param stddev the number's std dev
|
|
*
|
|
* @return a random number
|
|
*/
|
|
protected static float gaussRand(float mean, float stddev)
|
|
{
|
|
return (gaussRand() * stddev) + mean;
|
|
}
|
|
|
|
/**
|
|
* Reseeds the random number generator.
|
|
*
|
|
* @param seed the new seed
|
|
*/
|
|
protected static void reseed(int x1, int z1, int z2)
|
|
{
|
|
firstRand = false;
|
|
|
|
x_1 = x1;
|
|
z_1 = z1;
|
|
z_2 = z2;
|
|
|
|
for (int i = 0; i < cache.length; ++i)
|
|
cache[i] = computeIt();
|
|
} // reseed
|
|
|
|
} // class random
|