Oolite 1.91.0.7646-241128-10e222e
Loading...
Searching...
No Matches
legacy_random.h File Reference
#include "OOFunctionAttributes.h"
#include <math.h>
#include <stdint.h>
+ Include dependency graph for legacy_random.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  Random_Seed
 
struct  RNG_Seed
 
struct  RANROTSeed
 
struct  OORandomState
 

Macros

#define ranrot_rand()
 

Typedefs

typedef struct Random_Seed Random_Seed
 
typedef struct RNG_Seed RNG_Seed
 
typedef struct RANROTSeed RANROTSeed
 

Functions

void clear_checksum (void)
 
int16_t munge_checksum (long long value)
 
double cunningFee (double value, double precision)
 
void ranrot_srand (uint32_t seed)
 
unsigned Ranrot (void)
 
float randf (void)
 
float bellf (int n)
 
RANROTSeed RANROTGetFullSeed (void)
 
void RANROTSetFullSeed (RANROTSeed seed)
 
RANROTSeed MakeRanrotSeed (uint32_t seed)
 
RANROTSeed RanrotSeedFromRNGSeed (RNG_Seed seed)
 
RANROTSeed RanrotSeedFromRandomSeed (Random_Seed seed)
 
unsigned RanrotWithSeed (RANROTSeed *ioSeed)
 
float randfWithSeed (RANROTSeed *ioSeed)
 
OOINLINE double distanceBetweenPlanetPositions (int x1, int y1, int x2, int y2) INLINE_CONST_FUNC
 
OOINLINE double accurateDistanceBetweenPlanetPositions (int x1, int y1, int x2, int y2) INLINE_CONST_FUNC
 
void seed_for_planet_description (Random_Seed s_seed)
 
void seed_RNG_only_for_planet_description (Random_Seed s_seed)
 
RNG_Seed currentRandomSeed (void)
 
void setRandomSeed (RNG_Seed a_seed)
 
int gen_rnd_number (void)
 
void make_pseudo_random_seed (Random_Seed *seed_ptr)
 
OOINLINE int is_nil_seed (Random_Seed a_seed) INLINE_CONST_FUNC
 
void rotate_seed (Random_Seed *seed_ptr)
 
OOINLINE int rotate_byte_left (int x) INLINE_CONST_FUNC
 
OOINLINE int equal_seeds (Random_Seed seed1, Random_Seed seed2) INLINE_CONST_FUNC
 
uint32_t OOReallyRandom (void)
 
void OOInitReallyRandom (uint64_t seed)
 
void OOSetReallyRandomRANROTSeed (void)
 
void OOSetReallyRandomRndSeed (void)
 
void OOSetReallyRandomRANROTAndRndSeeds (void)
 
OORandomState OOSaveRandomState (void)
 
void OORestoreRandomState (OORandomState state)
 
OOINLINE double travelTimeBetweenPlanetPositions (int x1, int y1, int x2, int y2)
 

Variables

const Random_Seed kNilRandomSeed
 

Macro Definition Documentation

◆ ranrot_rand

#define ranrot_rand ( )
Value:
((int)Ranrot())
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
unsigned Ranrot(void)

Definition at line 78 of file legacy_random.h.

Referenced by PlayerSetEscapePodDestination().

Typedef Documentation

◆ Random_Seed

typedef struct Random_Seed Random_Seed

◆ RANROTSeed

typedef struct RANROTSeed RANROTSeed

◆ RNG_Seed

typedef struct RNG_Seed RNG_Seed

Function Documentation

◆ accurateDistanceBetweenPlanetPositions()

OOINLINE double accurateDistanceBetweenPlanetPositions ( int x1,
int y1,
int x2,
int y2 )

Definition at line 178 of file legacy_random.h.

179{
180 double dx = x1 - x2;
181 double dy = (y1 - y2) / 2.0;
182 double dist = hypot(dx, dy);
183 return 0.4 * dist;
184}

◆ bellf()

float bellf ( int n)

Definition at line 168 of file legacy_random.c.

169{
170 int i = n;
171 float total = 0;
172
173 if (EXPECT_NOT(i <= 0))
174 {
175 printf("***** ERROR - attempt to generate bellf(%d)\n", n);
176 return 0.0f; // catch possible div-by-zero problem
177 }
178
179 while (i-- > 0)
180 total += (Ranrot() & 1023);
181 return total / (1024.0f * n);
182}
#define EXPECT_NOT(x)
unsigned Ranrot(void)

References EXPECT_NOT, and Ranrot().

+ Here is the call graph for this function:

◆ clear_checksum()

void clear_checksum ( void )

Definition at line 42 of file legacy_random.c.

43{
44 checksum = 0;
45}
static int32_t checksum

References checksum.

◆ cunningFee()

double cunningFee ( double value,
double precision )

Definition at line 62 of file legacy_random.c.

63{
64 double fee = value;
65 double superfee = 100000.0;
66 double max = 1 + precision;
67 double min = 1 - precision;
68 unsigned long long rounded_fee = superfee * floor(0.5 + fee / superfee);
69 if (rounded_fee == 0) rounded_fee = 1;
70 double ratio = fee / (double)rounded_fee;
71
72 while ((ratio < min || ratio > max) && superfee > 1)
73 {
74 rounded_fee = superfee * floor(0.5 + fee / superfee);
75 if (rounded_fee == 0) rounded_fee = 1;
76 ratio = fee / (double)rounded_fee;
77 superfee /= 10.0;
78 }
79
80 if (ratio > min && ratio < max)
81 fee = rounded_fee;
82
83 return fee;
84}

◆ currentRandomSeed()

RNG_Seed currentRandomSeed ( void )

Definition at line 213 of file legacy_random.c.

214{
215 return rnd_seed;
216}
static RNG_Seed rnd_seed

References rnd_seed.

Referenced by GlobalRandomName().

+ Here is the caller graph for this function:

◆ distanceBetweenPlanetPositions()

OOINLINE double distanceBetweenPlanetPositions ( int x1,
int y1,
int x2,
int y2 )

Definition at line 169 of file legacy_random.h.

170{
171 int dx = x1 - x2;
172 int dy = (y1 - y2)/2;
173 int dist = sqrt(dx*dx + dy*dy); // N.b. Rounding error due to truncation is desired.
174 return 0.4 * dist;
175}

Referenced by SystemInfoDistanceToSystem(), and travelTimeBetweenPlanetPositions().

+ Here is the caller graph for this function:

◆ equal_seeds()

OOINLINE int equal_seeds ( Random_Seed seed1,
Random_Seed seed2 )

Definition at line 148 of file legacy_random.h.

149{
150 return ((seed1.a == seed2.a)&&(seed1.b == seed2.b)&&(seed1.c == seed2.c)&&(seed1.d == seed2.d)&&(seed1.e == seed2.e)&&(seed1.f == seed2.f));
151}

References Random_Seed::a, Random_Seed::b, Random_Seed::c, Random_Seed::d, Random_Seed::e, and Random_Seed::f.

Referenced by is_nil_seed().

+ Here is the caller graph for this function:

◆ gen_rnd_number()

int gen_rnd_number ( void )

Definition at line 225 of file legacy_random.c.

226{
227 int a,x;
228
229 x = (rnd_seed.a * 2) & 0xFF;
230 a = x + rnd_seed.c;
231 if (rnd_seed.a > 127)
232 a++;
233 rnd_seed.a = a & 0xFF;
234 rnd_seed.c = x;
235
236 a = a / 256; /* a = any carry left from above */
237 x = rnd_seed.b;
238 a = (a + x + rnd_seed.d) & 0xFF;
239 rnd_seed.b = a;
240 rnd_seed.d = x;
241 return a;
242}
float x
int32_t c
int32_t d
int32_t a
int32_t b

References RNG_Seed::a, RNG_Seed::b, RNG_Seed::c, RNG_Seed::d, rnd_seed, and x.

Referenced by make_pseudo_random_seed(), and OldRandomDigrams().

+ Here is the caller graph for this function:

◆ is_nil_seed()

OOINLINE int is_nil_seed ( Random_Seed a_seed)

Definition at line 154 of file legacy_random.h.

155{
156 return equal_seeds(a_seed, kNilRandomSeed);
157}
const Random_Seed kNilRandomSeed
OOINLINE int equal_seeds(Random_Seed seed1, Random_Seed seed2) INLINE_CONST_FUNC

References equal_seeds(), and kNilRandomSeed.

+ Here is the call graph for this function:

◆ make_pseudo_random_seed()

void make_pseudo_random_seed ( Random_Seed * seed_ptr)

Definition at line 309 of file legacy_random.c.

310{
311 seed_ptr->a = gen_rnd_number();
312 seed_ptr->b = gen_rnd_number();
313 seed_ptr->c = gen_rnd_number();
314 seed_ptr->d = gen_rnd_number();
315 seed_ptr->e = gen_rnd_number();
316 seed_ptr->f = gen_rnd_number();
317}
int gen_rnd_number(void)

References Random_Seed::a, Random_Seed::b, Random_Seed::c, Random_Seed::d, Random_Seed::e, Random_Seed::f, and gen_rnd_number().

Referenced by GlobalRandomInhabitantsDescription().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ MakeRanrotSeed()

RANROTSeed MakeRanrotSeed ( uint32_t seed)

Definition at line 113 of file legacy_random.c.

114{
115 RANROTSeed result =
116 {
117 .low = seed,
118 .high = ~seed
119 };
120
121 // Mix it up a bit.
122 RanrotWithSeed(&result);
123 RanrotWithSeed(&result);
124 RanrotWithSeed(&result);
125
126 return result;
127}
unsigned RanrotWithSeed(RANROTSeed *ioSeed)

References RanrotWithSeed().

Referenced by ranrot_srand(), and RanrotSeedFromRNGSeed().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ munge_checksum()

int16_t munge_checksum ( long long value)

Definition at line 48 of file legacy_random.c.

49{
50 uint32_t value = (uint32_t)value_;
51 int32_t mult1 = (value & 15) + 8;
52 checksum += value;
53 checksum *= mult1;
54 checksum += mult1;
55 checksum &= 0xffff;
56 return checksum;
57}

References checksum.

◆ OOInitReallyRandom()

void OOInitReallyRandom ( uint64_t seed)

Definition at line 256 of file legacy_random.c.

257{
258 assert(!sReallyRandomInited);
259 seed ^= 0xA471D52AEF3B6322ULL;
260 sReallyRandomSeed.high = (seed >> 32) & 0xFFFFFFFF;
261 sReallyRandomSeed.low = seed & 0xFFFFFFFF;
262 sReallyRandomInited = true;
264}
static bool sReallyRandomInited
uint32_t OOReallyRandom(void)
static RANROTSeed sReallyRandomSeed
uint32_t low
uint32_t high

References RANROTSeed::high, RANROTSeed::low, OOReallyRandom(), sReallyRandomInited, and sReallyRandomSeed.

+ Here is the call graph for this function:

◆ OOReallyRandom()

uint32_t OOReallyRandom ( void )

Definition at line 249 of file legacy_random.c.

250{
251 assert(sReallyRandomInited);
253}

References RanrotWithSeed(), sReallyRandomInited, and sReallyRandomSeed.

Referenced by OOInitReallyRandom(), OOSetReallyRandomRANROTSeed(), and OOSetReallyRandomRndSeed().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ OORestoreRandomState()

void OORestoreRandomState ( OORandomState state)

Definition at line 302 of file legacy_random.c.

303{
304 sRANROT = state.ranrot;
305 rnd_seed = state.rnd;
306}
static RANROTSeed sRANROT
RANROTSeed ranrot

References OORandomState::ranrot, OORandomState::rnd, rnd_seed, and sRANROT.

Referenced by OOExpandDescriptionString().

+ Here is the caller graph for this function:

◆ OOSaveRandomState()

OORandomState OOSaveRandomState ( void )

Definition at line 292 of file legacy_random.c.

293{
294 return (OORandomState)
295 {
296 .ranrot = sRANROT,
297 .rnd = rnd_seed
298 };
299}

References rnd_seed, and sRANROT.

Referenced by OOExpandDescriptionString().

+ Here is the caller graph for this function:

◆ OOSetReallyRandomRANROTAndRndSeeds()

void OOSetReallyRandomRANROTAndRndSeeds ( void )

Definition at line 285 of file legacy_random.c.

286{
289}
void OOSetReallyRandomRANROTSeed(void)
void OOSetReallyRandomRndSeed(void)

References OOSetReallyRandomRANROTSeed(), and OOSetReallyRandomRndSeed().

Referenced by OOExpandDescriptionString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ OOSetReallyRandomRANROTSeed()

void OOSetReallyRandomRANROTSeed ( void )

Definition at line 267 of file legacy_random.c.

268{
269 assert(sReallyRandomInited);
271 OOReallyRandom(); // Don't go reusing it.
272}

References OOReallyRandom(), sRANROT, sReallyRandomInited, and sReallyRandomSeed.

Referenced by OOSetReallyRandomRANROTAndRndSeeds().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ OOSetReallyRandomRndSeed()

void OOSetReallyRandomRndSeed ( void )

Definition at line 275 of file legacy_random.c.

276{
277 uint32_t val = OOReallyRandom();
278 rnd_seed.a = (val >> 24) & 0xFF;
279 rnd_seed.b = (val >> 16) & 0xFF;
280 rnd_seed.c = (val >> 8) & 0xFF;
281 rnd_seed.d = val & 0xFF;
282}

References RNG_Seed::a, RNG_Seed::b, RNG_Seed::c, RNG_Seed::d, OOReallyRandom(), and rnd_seed.

Referenced by OOSetReallyRandomRANROTAndRndSeeds().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ randf()

float randf ( void )

Definition at line 156 of file legacy_random.c.

157{
158 return (Ranrot() & 0xffff) * (1.0f / 65536.0f);
159}

References Ranrot().

Referenced by WormholeEntity::DrawWormholeCorona, fillRanNoiseBuffer(), OOFuzzyBooleanFromObject(), OOHPRandomPositionInBoundingBox(), OOHPVectorRandomRadial(), OOHPVectorRandomSpatial(), OORandomPositionInBoundingBox(), OORandomPositionInCylinder(), OORandomUnitHPVector(), OORandomUnitVector(), OOVectorRandomRadial(), and OOVectorRandomSpatial().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ randfWithSeed()

float randfWithSeed ( RANROTSeed * ioSeed)

Definition at line 162 of file legacy_random.c.

163{
164 return (RanrotWithSeed(ioSeed) & 0xffff) * (1.0f / 65536.0f);
165}

References RanrotWithSeed().

+ Here is the call graph for this function:

◆ Ranrot()

unsigned Ranrot ( void )

Definition at line 93 of file legacy_random.c.

94{
95 sRANROT.high = (sRANROT.high << 16) + (sRANROT.high >> 16);
98 return sRANROT.high & 0x7FFFFFFF;
99}

References RANROTSeed::high, RANROTSeed::low, and sRANROT.

Referenced by bellf(), GlobalRandomName(), quaternion_set_random(), randf(), Octree::randomFullNodeFrom, StationAddShipToShipyard(), and SVGDumpBeginPrimitive().

+ Here is the caller graph for this function:

◆ ranrot_srand()

void ranrot_srand ( uint32_t seed)

Definition at line 150 of file legacy_random.c.

151{
152 sRANROT = MakeRanrotSeed(seed);
153}
RANROTSeed MakeRanrotSeed(uint32_t seed)

References MakeRanrotSeed(), and sRANROT.

+ Here is the call graph for this function:

◆ RANROTGetFullSeed()

RANROTSeed RANROTGetFullSeed ( void )

Definition at line 185 of file legacy_random.c.

186{
187 return sRANROT;
188}

References sRANROT.

Referenced by fillRanNoiseBuffer().

+ Here is the caller graph for this function:

◆ RanrotSeedFromRandomSeed()

RANROTSeed RanrotSeedFromRandomSeed ( Random_Seed seed)

Definition at line 136 of file legacy_random.c.

137{
138 // Same pattern as seed_for_planet_description().
139 RNG_Seed s =
140 {
141 .a = seed.c,
142 .b = seed.d,
143 .c = seed.e,
144 .d = seed.f
145 };
146 return RanrotSeedFromRNGSeed(s);
147}
RANROTSeed RanrotSeedFromRNGSeed(RNG_Seed seed)

References Random_Seed::c, Random_Seed::d, Random_Seed::e, Random_Seed::f, and RanrotSeedFromRNGSeed().

+ Here is the call graph for this function:

◆ RanrotSeedFromRNGSeed()

RANROTSeed RanrotSeedFromRNGSeed ( RNG_Seed seed)

Definition at line 130 of file legacy_random.c.

131{
132 return MakeRanrotSeed(seed.a * 0x1000000 + seed.b * 0x10000 + seed.c * 0x100 + seed.d);
133}

References RNG_Seed::a, RNG_Seed::b, RNG_Seed::c, RNG_Seed::d, and MakeRanrotSeed().

Referenced by RanrotSeedFromRandomSeed(), and seed_for_planet_description().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ RANROTSetFullSeed()

void RANROTSetFullSeed ( RANROTSeed seed)

Definition at line 191 of file legacy_random.c.

192{
193 sRANROT = seed;
194}

References sRANROT.

◆ RanrotWithSeed()

unsigned RanrotWithSeed ( RANROTSeed * ioSeed)

Definition at line 102 of file legacy_random.c.

103{
104 assert(ioSeed != NULL);
105
106 ioSeed->high = (ioSeed->high << 16) + (ioSeed->high >> 16);
107 ioSeed->high += ioSeed->low;
108 ioSeed->low += ioSeed->high;
109 return ioSeed->high & 0x7FFFFFFF;
110}

References RANROTSeed::high, and RANROTSeed::low.

Referenced by MakeRanrotSeed(), OOReallyRandom(), and randfWithSeed().

+ Here is the caller graph for this function:

◆ rotate_byte_left()

OOINLINE int rotate_byte_left ( int x)

Definition at line 160 of file legacy_random.h.

161{
162 return ((x << 1) | (x >> 7)) & 255;
163}

References x.

◆ rotate_seed()

void rotate_seed ( Random_Seed * seed_ptr)

Definition at line 320 of file legacy_random.c.

321{
322 uint_fast16_t x;
323 uint_fast16_t y;
324
325 /* Note: this is equivalent to adding three (little-endian) 16-bit values
326 together, rotating the three numbers and replacing one of them with
327 the sum. The byte-oriented approach is presumably because it was
328 reverse-engineered from eight-bit machine code. Switching to a plain
329 sixteen-bit representation is more trouble than it's worth since so
330 much code uses byte values from the seed struct directly.
331 */
332 x = seed_ptr->a + seed_ptr->c + seed_ptr->e;
333 y = seed_ptr->b + seed_ptr->d + seed_ptr->f;
334
335 seed_ptr->a = seed_ptr->c;
336 seed_ptr->b = seed_ptr->d;
337
338 seed_ptr->c = seed_ptr->e;
339 seed_ptr->d = seed_ptr->f;
340
341 seed_ptr->e = x;
342 seed_ptr->f = y + (x >> 8);
343}
float y

References Random_Seed::a, Random_Seed::b, Random_Seed::c, Random_Seed::d, Random_Seed::e, Random_Seed::f, x, and y.

◆ seed_for_planet_description()

void seed_for_planet_description ( Random_Seed s_seed)

Definition at line 206 of file legacy_random.c.

207{
210}
void seed_RNG_only_for_planet_description(Random_Seed s_seed)

References RanrotSeedFromRNGSeed(), rnd_seed, seed_RNG_only_for_planet_description(), and sRANROT.

+ Here is the call graph for this function:

◆ seed_RNG_only_for_planet_description()

void seed_RNG_only_for_planet_description ( Random_Seed s_seed)

Definition at line 197 of file legacy_random.c.

198{
199 rnd_seed.a = s_seed.c;
200 rnd_seed.b = s_seed.d;
201 rnd_seed.c = s_seed.e;
202 rnd_seed.d = s_seed.f;
203}

References RNG_Seed::a, RNG_Seed::b, Random_Seed::c, RNG_Seed::c, Random_Seed::d, RNG_Seed::d, Random_Seed::e, Random_Seed::f, and rnd_seed.

Referenced by OOGenerateSystemDescription(), and seed_for_planet_description().

+ Here is the caller graph for this function:

◆ setRandomSeed()

void setRandomSeed ( RNG_Seed a_seed)

Definition at line 219 of file legacy_random.c.

220{
221 rnd_seed = a_seed;
222}

References rnd_seed.

Referenced by GlobalRandomName().

+ Here is the caller graph for this function:

◆ travelTimeBetweenPlanetPositions()

OOINLINE double travelTimeBetweenPlanetPositions ( int x1,
int y1,
int x2,
int y2 )

Definition at line 187 of file legacy_random.h.

188{
189 double distance = distanceBetweenPlanetPositions(x1, y1, x2, y2);
190 return distance * distance;
191}
OOINLINE double distanceBetweenPlanetPositions(int x1, int y1, int x2, int y2) INLINE_CONST_FUNC

References distanceBetweenPlanetPositions().

+ Here is the call graph for this function:

Variable Documentation

◆ kNilRandomSeed

const Random_Seed kNilRandomSeed
extern