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 
62 typedef 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.
132 typedef struct {
133   unsigned long seed[NUMPRCLASS];      // Each block's random seed
134   int rndindex, prndindex;             // For compatibility support
135 } rng_t;
136 
137 extern rng_t rng;                      // The rng's state
138 
139 extern unsigned long rngseed;          // The starting seed (not part of state)
140 
141 // As M_Random, but used by the play simulation.
142 int P_Random(pr_class_t DA(const char *, int));
143 
144 // Returns a number from 0 to 255,
145 #define M_Random() P_Random(pr_misc)
146 
147 // Fix randoms for demos.
148 void M_ClearRandom(void);
149 
150 #endif
151