diff options
Diffstat (limited to 'src/m_random.c')
-rw-r--r-- | src/m_random.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/m_random.c b/src/m_random.c new file mode 100644 index 0000000..bd0c7bc --- /dev/null +++ b/src/m_random.c | |||
@@ -0,0 +1,147 @@ | |||
1 | /* Emacs style mode select -*- C++ -*- | ||
2 | *----------------------------------------------------------------------------- | ||
3 | * | ||
4 | * | ||
5 | * PrBoom: a Doom port merged with LxDoom and LSDLDoom | ||
6 | * based on BOOM, a modified and improved DOOM engine | ||
7 | * Copyright (C) 1999 by | ||
8 | * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman | ||
9 | * Copyright (C) 1999-2000 by | ||
10 | * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze | ||
11 | * Copyright 2005, 2006 by | ||
12 | * Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or | ||
15 | * modify it under the terms of the GNU General Public License | ||
16 | * as published by the Free Software Foundation; either version 2 | ||
17 | * of the License, or (at your option) any later version. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License | ||
25 | * along with this program; if not, write to the Free Software | ||
26 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | ||
27 | * 02111-1307, USA. | ||
28 | * | ||
29 | * DESCRIPTION: | ||
30 | * Random number LUT. | ||
31 | * | ||
32 | * 1/19/98 killough: Rewrote random number generator for better randomness, | ||
33 | * while at the same time maintaining demo sync and backward compatibility. | ||
34 | * | ||
35 | * 2/16/98 killough: Made each RNG local to each control-equivalent block, | ||
36 | * to reduce the chances of demo sync problems. | ||
37 | * | ||
38 | *-----------------------------------------------------------------------------*/ | ||
39 | |||
40 | |||
41 | #include "doomstat.h" | ||
42 | #include "m_random.h" | ||
43 | #include "lprintf.h" | ||
44 | |||
45 | // | ||
46 | // M_Random | ||
47 | // Returns a 0-255 number | ||
48 | // | ||
49 | static const unsigned char rndtable[256] = { // 1/19/98 killough -- made const | ||
50 | 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66 , | ||
51 | 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36 , | ||
52 | 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188 , | ||
53 | 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224 , | ||
54 | 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242 , | ||
55 | 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0 , | ||
56 | 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235 , | ||
57 | 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113 , | ||
58 | 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75 , | ||
59 | 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196 , | ||
60 | 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113 , | ||
61 | 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241 , | ||
62 | 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224 , | ||
63 | 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95 , | ||
64 | 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226 , | ||
65 | 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36 , | ||
66 | 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106 , | ||
67 | 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136 , | ||
68 | 120, 163, 236, 249 | ||
69 | }; | ||
70 | |||
71 | rng_t rng; // the random number state | ||
72 | |||
73 | unsigned long rngseed = 1993; // killough 3/26/98: The seed | ||
74 | |||
75 | int (P_Random)(pr_class_t pr_class | ||
76 | #ifdef INSTRUMENTED | ||
77 | , const char *file, int line | ||
78 | #endif | ||
79 | ) | ||
80 | { | ||
81 | // killough 2/16/98: We always update both sets of random number | ||
82 | // generators, to ensure repeatability if the demo_compatibility | ||
83 | // flag is changed while the program is running. Changing the | ||
84 | // demo_compatibility flag does not change the sequences generated, | ||
85 | // only which one is selected from. | ||
86 | // | ||
87 | // All of this RNG stuff is tricky as far as demo sync goes -- | ||
88 | // it's like playing with explosives :) Lee | ||
89 | |||
90 | #ifdef INSTRUMENTED | ||
91 | //lprintf(LO_DEBUG, "%.10d: %.10d - %s:%.5d\n", gametic, pr_class, file, line); | ||
92 | #endif | ||
93 | |||
94 | int compat = pr_class == pr_misc ? | ||
95 | (rng.prndindex = (rng.prndindex + 1) & 255) : | ||
96 | (rng. rndindex = (rng. rndindex + 1) & 255) ; | ||
97 | |||
98 | unsigned long boom; | ||
99 | |||
100 | // killough 3/31/98: | ||
101 | // If demo sync insurance is not requested, use | ||
102 | // much more unstable method by putting everything | ||
103 | // except pr_misc into pr_all_in_one | ||
104 | |||
105 | if (pr_class != pr_misc && !demo_insurance) // killough 3/31/98 | ||
106 | pr_class = pr_all_in_one; | ||
107 | |||
108 | boom = rng.seed[pr_class]; | ||
109 | |||
110 | // killough 3/26/98: add pr_class*2 to addend | ||
111 | |||
112 | rng.seed[pr_class] = boom * 1664525ul + 221297ul + pr_class*2; | ||
113 | |||
114 | if (demo_compatibility) | ||
115 | return rndtable[compat]; | ||
116 | |||
117 | boom >>= 20; | ||
118 | |||
119 | /* killough 3/30/98: use gametic-levelstarttic to shuffle RNG | ||
120 | * killough 3/31/98: but only if demo insurance requested, | ||
121 | * since it's unnecessary for random shuffling otherwise | ||
122 | * killough 9/29/98: but use basetic now instead of levelstarttic | ||
123 | * cph - DEMOSYNC - this change makes MBF demos work, | ||
124 | * but does it break Boom ones? | ||
125 | */ | ||
126 | |||
127 | if (demo_insurance) | ||
128 | boom += (gametic-basetic)*7; | ||
129 | |||
130 | return boom & 255; | ||
131 | } | ||
132 | |||
133 | // Initialize all the seeds | ||
134 | // | ||
135 | // This initialization method is critical to maintaining demo sync. | ||
136 | // Each seed is initialized according to its class, so if new classes | ||
137 | // are added they must be added to end of pr_class_t list. killough | ||
138 | // | ||
139 | |||
140 | void M_ClearRandom (void) | ||
141 | { | ||
142 | int i; | ||
143 | unsigned long seed = rngseed*2+1; // add 3/26/98: add rngseed | ||
144 | for (i=0; i<NUMPRCLASS; i++) // go through each pr_class and set | ||
145 | rng.seed[i] = seed *= 69069ul; // each starting seed differently | ||
146 | rng.prndindex = rng.rndindex = 0; // clear two compatibility indices | ||
147 | } | ||