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