dvr/app/jni/prboom/m_random.h
2016-03-03 22:28:59 +00:00

154 lines
5.7 KiB
C++

/* Emacs style mode select -*- C++ -*-
*-----------------------------------------------------------------------------
*
*
* PrBoom: a Doom port merged with LxDoom and LSDLDoom
* based on BOOM, a modified and improved DOOM engine
* Copyright (C) 1999 by
* id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
* Copyright (C) 1999-2000 by
* Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
* Copyright 2005, 2006 by
* Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* DESCRIPTION:
* Functions to return random numbers.
*
*-----------------------------------------------------------------------------*/
#ifndef __M_RANDOM__
#define __M_RANDOM__
#include "doomtype.h"
// killough 1/19/98: rewritten to use to use a better random number generator
// in the new engine, although the old one is available for compatibility.
// killough 2/16/98:
//
// Make every random number generator local to each control-equivalent block.
// Critical for demo sync. Changing the order of this list breaks all previous
// versions' demos. The random number generators are made local to reduce the
// chances of sync problems. In Doom, if a single random number generator call
// was off, it would mess up all random number generators. This reduces the
// chances of it happening by making each RNG local to a control flow block.
//
// Notes to developers: if you want to reduce your demo sync hassles, follow
// this rule: for each call to P_Random you add, add a new class to the enum
// type below for each block of code which calls P_Random. If two calls to
// P_Random are not in "control-equivalent blocks", i.e. there are any cases
// where one is executed, and the other is not, put them in separate classes.
//
// Keep all current entries in this list the same, and in the order
// indicated by the #'s, because they're critical for preserving demo
// sync. Do not remove entries simply because they become unused later.
typedef enum {
pr_skullfly, // #1
pr_damage, // #2
pr_crush, // #3
pr_genlift, // #4
pr_killtics, // #5
pr_damagemobj, // #6
pr_painchance, // #7
pr_lights, // #8
pr_explode, // #9
pr_respawn, // #10
pr_lastlook, // #11
pr_spawnthing, // #12
pr_spawnpuff, // #13
pr_spawnblood, // #14
pr_missile, // #15
pr_shadow, // #16
pr_plats, // #17
pr_punch, // #18
pr_punchangle, // #19
pr_saw, // #20
pr_plasma, // #21
pr_gunshot, // #22
pr_misfire, // #23
pr_shotgun, // #24
pr_bfg, // #25
pr_slimehurt, // #26
pr_dmspawn, // #27
pr_missrange, // #28
pr_trywalk, // #29
pr_newchase, // #30
pr_newchasedir, // #31
pr_see, // #32
pr_facetarget, // #33
pr_posattack, // #34
pr_sposattack, // #35
pr_cposattack, // #36
pr_spidrefire, // #37
pr_troopattack, // #38
pr_sargattack, // #39
pr_headattack, // #40
pr_bruisattack, // #41
pr_tracer, // #42
pr_skelfist, // #43
pr_scream, // #44
pr_brainscream, // #45
pr_cposrefire, // #46
pr_brainexp, // #47
pr_spawnfly, // #48
pr_misc, // #49
pr_all_in_one, // #50
/* CPhipps - new entries from MBF, mostly unused for now */
pr_opendoor, // #51
pr_targetsearch, // #52
pr_friends, // #53
pr_threshold, // #54
pr_skiptarget, // #55
pr_enemystrafe, // #56
pr_avoidcrush, // #57
pr_stayonlift, // #58
pr_helpfriend, // #59
pr_dropoff, // #60
pr_randomjump, // #61
pr_defect, // #62 // Start new entries -- add new entries below
// End of new entries
NUMPRCLASS // MUST be last item in list
} pr_class_t;
// The random number generator's state.
typedef struct {
unsigned long seed[NUMPRCLASS]; // Each block's random seed
int rndindex, prndindex; // For compatibility support
} rng_t;
extern rng_t rng; // The rng's state
extern unsigned long rngseed; // The starting seed (not part of state)
// As M_Random, but used by the play simulation.
int P_Random(pr_class_t DA(const char *, int));
#ifdef INSTRUMENTED
#define P_Random(a) (P_Random) (a, __FILE__,__LINE__)
#endif
// Returns a number from 0 to 255,
#define M_Random() P_Random(pr_misc)
// Fix randoms for demos.
void M_ClearRandom(void);
#endif