aboutsummaryrefslogtreecommitdiff
path: root/src/m_random.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/m_random.h')
-rw-r--r--src/m_random.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/m_random.h b/src/m_random.h
new file mode 100644
index 0000000..aa63532
--- /dev/null
+++ b/src/m_random.h
@@ -0,0 +1,154 @@
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 * Functions to return random numbers.
31 *
32 *-----------------------------------------------------------------------------*/
33
34
35#ifndef __M_RANDOM__
36#define __M_RANDOM__
37
38#include "doomtype.h"
39
40// killough 1/19/98: rewritten to use to use a better random number generator
41// in the new engine, although the old one is available for compatibility.
42
43// killough 2/16/98:
44//
45// Make every random number generator local to each control-equivalent block.
46// Critical for demo sync. Changing the order of this list breaks all previous
47// versions' demos. The random number generators are made local to reduce the
48// chances of sync problems. In Doom, if a single random number generator call
49// was off, it would mess up all random number generators. This reduces the
50// chances of it happening by making each RNG local to a control flow block.
51//
52// Notes to developers: if you want to reduce your demo sync hassles, follow
53// this rule: for each call to P_Random you add, add a new class to the enum
54// type below for each block of code which calls P_Random. If two calls to
55// P_Random are not in "control-equivalent blocks", i.e. there are any cases
56// where one is executed, and the other is not, put them in separate classes.
57//
58// Keep all current entries in this list the same, and in the order
59// indicated by the #'s, because they're critical for preserving demo
60// sync. Do not remove entries simply because they become unused later.
61
62typedef enum {
63 pr_skullfly, // #1
64 pr_damage, // #2
65 pr_crush, // #3
66 pr_genlift, // #4
67 pr_killtics, // #5
68 pr_damagemobj, // #6
69 pr_painchance, // #7
70 pr_lights, // #8
71 pr_explode, // #9
72 pr_respawn, // #10
73 pr_lastlook, // #11
74 pr_spawnthing, // #12
75 pr_spawnpuff, // #13
76 pr_spawnblood, // #14
77 pr_missile, // #15
78 pr_shadow, // #16
79 pr_plats, // #17
80 pr_punch, // #18
81 pr_punchangle, // #19
82 pr_saw, // #20
83 pr_plasma, // #21
84 pr_gunshot, // #22
85 pr_misfire, // #23
86 pr_shotgun, // #24
87 pr_bfg, // #25
88 pr_slimehurt, // #26
89 pr_dmspawn, // #27
90 pr_missrange, // #28
91 pr_trywalk, // #29
92 pr_newchase, // #30
93 pr_newchasedir, // #31
94 pr_see, // #32
95 pr_facetarget, // #33
96 pr_posattack, // #34
97 pr_sposattack, // #35
98 pr_cposattack, // #36
99 pr_spidrefire, // #37
100 pr_troopattack, // #38
101 pr_sargattack, // #39
102 pr_headattack, // #40
103 pr_bruisattack, // #41
104 pr_tracer, // #42
105 pr_skelfist, // #43
106 pr_scream, // #44
107 pr_brainscream, // #45
108 pr_cposrefire, // #46
109 pr_brainexp, // #47
110 pr_spawnfly, // #48
111 pr_misc, // #49
112 pr_all_in_one, // #50
113 /* CPhipps - new entries from MBF, mostly unused for now */
114 pr_opendoor, // #51
115 pr_targetsearch, // #52
116 pr_friends, // #53
117 pr_threshold, // #54
118 pr_skiptarget, // #55
119 pr_enemystrafe, // #56
120 pr_avoidcrush, // #57
121 pr_stayonlift, // #58
122 pr_helpfriend, // #59
123 pr_dropoff, // #60
124 pr_randomjump, // #61
125 pr_defect, // #62 // Start new entries -- add new entries below
126
127 // End of new entries
128 NUMPRCLASS // MUST be last item in list
129} pr_class_t;
130
131// The random number generator's state.
132typedef struct {
133 unsigned long seed[NUMPRCLASS]; // Each block's random seed
134 int rndindex, prndindex; // For compatibility support
135} rng_t;
136
137extern rng_t rng; // The rng's state
138
139extern unsigned long rngseed; // The starting seed (not part of state)
140
141// As M_Random, but used by the play simulation.
142int P_Random(pr_class_t DA(const char *, int));
143
144#ifdef INSTRUMENTED
145#define P_Random(a) (P_Random) (a, __FILE__,__LINE__)
146#endif
147
148// Returns a number from 0 to 255,
149#define M_Random() P_Random(pr_misc)
150
151// Fix randoms for demos.
152void M_ClearRandom(void);
153
154#endif