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