ref: 3191e80bf7fda36bf0c951b0363cd52fa6ceac6b
dir: /doomdef.h/
// DoomDef.h
#ifndef __DOOMDEF__
#define __DOOMDEF__
/* if rangecheck is undefined, most parameter
* validation debugging code will not be compiled
*/
#ifndef NORANGECHECKING
#define RANGECHECK 1
#endif
#define __STRINGIFY(x) #x
#define STRINGIFY(x) __STRINGIFY(x)
#define VERSION 130
#define VERSION_TEXT "v1.3"
#define VERSION_MAJ 0
#define VERSION_MIN 2
#define VERSION_PATCH 4
#define HHERETIC_VERSION "v" STRINGIFY(VERSION_MAJ) "." STRINGIFY(VERSION_MIN) "." STRINGIFY(VERSION_PATCH)
#if defined(__linux)
#define VERSION_PLATFORM "Linux"
#elif defined (__FreeBSD__)
#define VERSION_PLATFORM "FreeBSD"
#elif defined (_WIN32)
#define VERSION_PLATFORM "Windows"
#else
#define VERSION_PLATFORM "Unknown"
#endif
/* compatibility definitions: */
#if defined(_WIN32) && !defined(F_OK)
/* values for the mode argument of access(). MS does not define them.
these aren't in h2stdinc.h, because not all files include io.h or
unistd.h */
#define R_OK 4 /* Test for read permission. */
#define W_OK 2 /* Test for write permission. */
#define X_OK 1 /* Test for execute permission. */
#define F_OK 0 /* Test for existence. */
#endif
/* max length of a filesystem pathname */
#define MAX_OSPATH 256
#define DATA_ENVVAR "HERETIC_DATA"
#define H_USERDIR ".hheretic"
/* path to the user directory with a trailing
* directory separator character. initialized
* to DUMMY_BASEPATH string, which is "./" or
* empty string "", so that it will have no
* effect when user directories are disabled.
*/
extern const char *basePath;
#define DUMMY_BASEPATH ""
#define SAVEGAMENAME "hticsav"
#define CONFIG_FILE_NAME "heretic.cfg"
/* the directory that holds development maps */
/* for the -wart # # command. */
#define DEVMAPDIR "/heretic/data/"
#ifdef __WATCOMC__
#include <malloc.h>
#define strcasecmp strcmpi
#define strncasecmp strnicmp
#endif
/* all external data is defined here */
#include "doomdata.h"
/* all important printed strings */
#include "dstrings.h"
/* header generated by multigen utility */
#include "info.h"
extern byte *destview, *destscreen; /* PC direct to screen pointers */
/* most key data are simple ascii (uppercased) */
#define KEY_TAB 9
#define KEY_ENTER 13
#define KEY_ESCAPE 27
#define KEY_SPACE 32 /* 0x20 */
#define KEY_MINUS 45 /* 0x2D */
#define KEY_FIVE 53 /* 0x35 */
#define KEY_SIX 54 /* 0x36 */
#define KEY_SEVEN 55 /* 0x37 */
#define KEY_EIGHT 56 /* 0x38 */
#define KEY_NINE 57 /* 0x39 */
#define KEY_ZERO 48 /* 0x30 */
#define KEY_EQUALS 61 /* 0x3D */
/* These added by S.A. */
#define KEY_LEFTBRACKET 91
#define KEY_RIGHTBRACKET 93
#define KEY_BACKQUOTE 96
#define KEY_QUOTEDBL 34
#define KEY_QUOTE 39
#define KEY_SEMICOLON 59
#define KEY_PERIOD 46
#define KEY_COMMA 44
#define KEY_SLASH 47
#define KEY_BACKSLASH 92 /* 0x5C */
#define KEY_BACKSPACE 127 /* 0x7F */
#define KEY_UPARROW 128 /* 0x80 */
#define KEY_DOWNARROW 129
#define KEY_LEFTARROW 130
#define KEY_RIGHTARROW 131
#define KEY_ALT 132
#define KEY_LALT KEY_ALT
#define KEY_RALT KEY_ALT
#define KEY_CTRL 133
#define KEY_LCTRL KEY_CTRL
#define KEY_RCTRL KEY_CTRL
#define KEY_SHIFT 134
#define KEY_LSHIFT KEY_SHIFT
#define KEY_RSHIFT KEY_SHIFT
#define KEY_F1 135
#define KEY_F2 136
#define KEY_F3 137
#define KEY_F4 138
#define KEY_F5 139
#define KEY_F6 140
#define KEY_F7 141
#define KEY_F8 142
#define KEY_F9 143
#define KEY_F10 144
#define KEY_F11 145
#define KEY_F12 146
#define KEY_INS 147
#define KEY_DEL 148
#define KEY_PGDN 149
#define KEY_PGUP 150
#define KEY_HOME 151
#define KEY_END 152
#define KEY_PAUSE 255 /* 0xFF */
/* mouse buttons */
#define KEY_MOUSE1 200 /* 0xC8 */
#define KEY_MOUSE2 201 /* right mouse button */
#define KEY_MOUSE3 202 /* middle mouse button */
#define KEY_MWHEELUP 203 /* wheel-up as a virtual button */
#define KEY_MWHEELDOWN 204 /* wheel-down as a virtual button */
#define KEY_MOUSE4 205 /* thumb buttons */
#define KEY_MOUSE5 206 /* thumb buttons */
/* joystick buttons */
#define KEY_JOY1 207
#define KEY_JOY2 208
#define KEY_JOY3 209
#define KEY_JOY4 210
/* aux keys, for multi-buttoned joysticks */
#define KEY_AUX1 211
#define KEY_AUX2 212
#define KEY_AUX3 213
#define KEY_AUX4 214
#define KEY_AUX5 215
#define KEY_AUX6 216
#define KEY_AUX7 217
#define KEY_AUX8 218
#define KEY_AUX9 219
#define KEY_AUX10 220
#define KEY_AUX11 221
#define KEY_AUX12 222
#define KEY_AUX13 223
#define KEY_AUX14 224
#define KEY_AUX15 225
#define KEY_AUX16 226
#define KEY_AUX17 227
#define KEY_AUX18 228
#define KEY_AUX19 229
#define KEY_AUX20 230
#define KEY_AUX21 231
#define KEY_AUX22 232
#define KEY_AUX23 233
#define KEY_AUX24 234
#define KEY_AUX25 235
#define KEY_AUX26 236
#define KEY_AUX27 237
#define KEY_AUX28 238
#define KEY_AUX29 239
#define KEY_AUX30 240
#define KEY_AUX31 241
#define KEY_AUX32 242
#define MAXKEYS 256
#define FINEANGLES 8192
#define FINEMASK (FINEANGLES - 1)
#define ANGLETOFINESHIFT 19 /* 0x100000000 to 0x2000 */
/*
===============================================================================
GLOBAL TYPES
===============================================================================
*/
#define NUMARTIFCTS 28
#define MAXPLAYERS 4
#define TICRATE 35 /* number of tics / second */
#define TICSPERSEC 35
#define ANGLE_1 0x01000000
#define ANGLE_45 0x20000000
#define ANGLE_90 0x40000000
#define ANGLE_180 0x80000000
#define ANGLE_MAX 0xffffffff
#define ANG45 0x20000000
#define ANG90 0x40000000
#define ANG180 0x80000000
#define ANG270 0xc0000000
#pragma pack on
typedef unsigned angle_t;
typedef enum
{
sk_baby,
sk_easy,
sk_medium,
sk_hard,
sk_nightmare
} skill_t;
typedef enum
{
ev_keydown,
ev_keyup,
ev_mouse,
ev_joystick,
ev_char,
} evtype_t;
typedef struct
{
evtype_t type;
int data1; /* keys / mouse/joystick buttons */
int data2; /* mouse/joystick x move */
int data3; /* mouse/joystick y move */
} event_t;
typedef struct
{
signed char forwardmove; /* *2048 for move */
signed char sidemove; /* *2048 for move */
short angleturn; /* <<16 for angle delta */
short consistancy; /* checks for net game */
byte chatchar;
byte buttons;
byte lookfly; /* look/fly up/down/centering */
byte arti; /* artitype_t to use */
} ticcmd_t;
#define BT_ATTACK 1
#define BT_USE 2
#define BT_CHANGE 4 /* if true, the next 3 bits hold weapon num */
#define BT_WEAPONMASK (8 + 16 + 32)
#define BT_WEAPONSHIFT 3
#define BT_SPECIAL 128 /* game events, not really buttons */
#define BTS_SAVEMASK (4 + 8 + 16)
#define BTS_SAVESHIFT 2
#define BT_SPECIALMASK 3
#define BTS_PAUSE 1 /* pause the game */
#define BTS_SAVEGAME 2 /* save the game at each console */
/* savegame slot numbers occupy the second byte of buttons */
typedef enum
{
GS_LEVEL,
GS_INTERMISSION,
GS_FINALE,
GS_DEMOSCREEN
} gamestate_t;
typedef enum
{
ga_nothing,
ga_loadlevel,
ga_newgame,
ga_loadgame,
ga_savegame,
ga_playdemo,
ga_completed,
ga_victory,
ga_worlddone,
ga_screenshot
} gameaction_t;
typedef enum
{
wipe_0,
wipe_1,
wipe_2,
wipe_3,
wipe_4,
NUMWIPES,
wipe_random
} wipe_t;
typedef struct
{
const char *name;
int *location;
int defaultvalue;
int minvalue;
int maxvalue;
} default_t;
typedef struct
{
const char *name;
char *location; /* pointer to an 80 char array, null terminated */
char *defaultvalue; /* backup of the default value. malloc'ed at init */
} default_str_t;
/*
===============================================================================
MAPOBJ DATA
===============================================================================
*/
/* think_t is a function pointer to a routine to handle an actor */
typedef void (*think_t) (void*);
typedef struct thinker_s
{
struct thinker_s *prev, *next;
think_t function;
} thinker_t;
struct player_s;
typedef struct mobj_s
{
thinker_t thinker; /* thinker links */
/* info for drawing */
fixed_t x, y, z;
struct mobj_s *snext, *sprev; /* links in sector (if needed) */
angle_t angle;
spritenum_t sprite; /* used to find patch_t and flip value */
int frame; /* might be ord with FF_FULLBRIGHT */
/* interaction info */
struct mobj_s *bnext, *bprev; /* links in blocks (if needed) */
struct subsector_s *subsector;
fixed_t floorz, ceilingz; /* closest together of contacted secs */
fixed_t radius, height; /* for movement checking */
fixed_t momx, momy, momz; /* momentums */
int validcount; /* if == validcount, already checked */
mobjtype_t type;
mobjinfo_t *info; /* &mobjinfo[mobj->type] */
int tics; /* state tic counter */
state_t *state;
int damage; /* For missiles */
int flags;
int flags2; /* Heretic flags */
/* be doubly careful with these two: they may be used to store
* a state or the address of an mobj_t or player_t structure!!!
*/
intptr_t special1; /* Special info */
intptr_t special2; /* Special info */
int health;
int movedir; /* 0-7 */
int movecount; /* when 0, select a new dir */
struct mobj_s *target; /* thing being chased/attacked (or NULL)
also the originator for missiles */
int reactiontime; /* if non 0, don't attack yet
used by player to freeze a bit after
teleporting */
int threshold; /* if > 0, the target will be chased
no matter what (even if shot) */
struct player_s *player; /* only valid if type == MT_PLAYER */
int lastlook; /* player number last looked for */
mapthing_t spawnpoint; /* for nightmare respawn */
} mobj_t;
/* each sector has a degenmobj_t in it's center for sound origin purposes */
typedef struct
{
thinker_t thinker; /* not used for anything. */
fixed_t x, y, z;
} degenmobj_t;
/* Most damage defined using HITDICE */
#define HITDICE(a) ((1 + (P_Random() & 7)) * (a))
/* frame flags */
#define FF_FULLBRIGHT 0x8000 /* flag in thing->frame */
#define FF_FRAMEMASK 0x7fff
/* --- mobj.flags --- */
#define MF_SPECIAL 1 /* call P_SpecialThing when touched */
#define MF_SOLID 2
#define MF_SHOOTABLE 4
#define MF_NOSECTOR 8 /* don't use the sector links (invisible but touchable) */
#define MF_NOBLOCKMAP 16 /* don't use the blocklinks (inert but displayable) */
#define MF_AMBUSH 32
#define MF_JUSTHIT 64 /* try to attack right back */
#define MF_JUSTATTACKED 128 /* take at least one step before attacking */
#define MF_SPAWNCEILING 256 /* hang from ceiling instead of floor */
#define MF_NOGRAVITY 512 /* don't apply gravity every tic */
/* movement flags */
#define MF_DROPOFF 0x400 /* allow jumps from high places */
#define MF_PICKUP 0x800 /* for players to pick up items */
#define MF_NOCLIP 0x1000 /* player cheat */
#define MF_SLIDE 0x2000 /* keep info about sliding along walls */
#define MF_FLOAT 0x4000 /* allow moves to any height, no gravity */
#define MF_TELEPORT 0x8000 /* don't cross lines or look at heights */
#define MF_MISSILE 0x10000 /* don't hit same species, explode on block */
#define MF_DROPPED 0x20000 /* dropped by a demon, not level spawned */
#define MF_SHADOW 0x40000 /* use fuzzy draw (shadow demons / invis) */
#define MF_NOBLOOD 0x80000 /* don't bleed when shot (use puff) */
#define MF_CORPSE 0x100000 /* don't stop moving halfway off a step */
#define MF_INFLOAT 0x200000 /* floating to a height for a move, don't */
/* auto float to target's height. */
#define MF_COUNTKILL 0x400000 /* count towards intermission kill total */
#define MF_COUNTITEM 0x800000 /* count towards intermission item total */
#define MF_SKULLFLY 0x1000000 /* skull in flight */
#define MF_NOTDMATCH 0x2000000 /* don't spawn in death match (key cards) */
#define MF_TRANSLATION 0xc000000 /* if 0x4 0x8 or 0xc, use a translation */
#define MF_TRANSSHIFT 26 /* table for player colormaps */
/* --- mobj.flags2 --- */
#define MF2_LOGRAV 0x00000001 /* alternate gravity setting */
#define MF2_WINDTHRUST 0x00000002 /* gets pushed around by the wind specials */
#define MF2_FLOORBOUNCE 0x00000004 /* bounces off the floor */
#define MF2_THRUGHOST 0x00000008 /* missile will pass through ghosts */
#define MF2_FLY 0x00000010 /* fly mode is active */
#define MF2_FOOTCLIP 0x00000020 /* if feet are allowed to be clipped */
#define MF2_SPAWNFLOAT 0x00000040 /* spawn random float z */
#define MF2_NOTELEPORT 0x00000080 /* does not teleport */
#define MF2_RIP 0x00000100 /* missile rips through solid targets */
#define MF2_PUSHABLE 0x00000200 /* can be pushed by other moving mobjs */
#define MF2_SLIDE 0x00000400 /* slides against walls */
#define MF2_ONMOBJ 0x00000800 /* mobj is resting on top of another mobj */
#define MF2_PASSMOBJ 0x00001000 /* Enable z block checking. If on, */
/* this flag will allow the mobj to */
/* pass over/under other mobjs. */
#define MF2_CANNOTPUSH 0x00002000 /* cannot push other pushable mobjs */
#define MF2_FEETARECLIPPED 0x00004000 /* a mobj's feet are now being cut */
#define MF2_BOSS 0x00008000 /* mobj is a major boss */
#define MF2_FIREDAMAGE 0x00010000 /* does fire damage */
#define MF2_NODMGTHRUST 0x00020000 /* does not thrust target when damaging */
#define MF2_TELESTOMP 0x00040000 /* mobj can stomp another */
#define MF2_FLOATBOB 0x00080000 /* use float bobbing z movement */
#define MF2_DONTDRAW 0X00100000 /* don't generate a vissprite */
/*============================================================================*/
typedef enum
{
PST_LIVE, /* playing */
PST_DEAD, /* dead on the ground */
PST_REBORN /* ready to restart */
} playerstate_t;
/* psprites are scaled shapes directly on the view screen
* coordinates are given for a 320*200 view screen
*/
typedef enum
{
ps_weapon,
ps_flash,
NUMPSPRITES
} psprnum_t;
typedef struct
{
state_t *state; /* a NULL state means not active */
int tics;
fixed_t sx, sy;
} pspdef_t;
typedef enum
{
key_yellow,
key_green,
key_blue,
NUMKEYS
} keytype_t;
typedef enum
{
wp_staff,
wp_goldwand,
wp_crossbow,
wp_blaster,
wp_skullrod,
wp_phoenixrod,
wp_mace,
wp_gauntlets,
wp_beak,
NUMWEAPONS,
wp_nochange
} weapontype_t;
#define AMMO_GWND_WIMPY 10
#define AMMO_GWND_HEFTY 50
#define AMMO_CBOW_WIMPY 5
#define AMMO_CBOW_HEFTY 20
#define AMMO_BLSR_WIMPY 10
#define AMMO_BLSR_HEFTY 25
#define AMMO_SKRD_WIMPY 20
#define AMMO_SKRD_HEFTY 100
#define AMMO_PHRD_WIMPY 1
#define AMMO_PHRD_HEFTY 10
#define AMMO_MACE_WIMPY 20
#define AMMO_MACE_HEFTY 100
typedef enum
{
am_goldwand,
am_crossbow,
am_blaster,
am_skullrod,
am_phoenixrod,
am_mace,
NUMAMMO,
am_noammo /* staff, gauntlets */
} ammotype_t;
typedef struct
{
ammotype_t ammo;
int upstate;
int downstate;
int readystate;
int atkstate;
int holdatkstate;
int flashstate;
} weaponinfo_t;
extern weaponinfo_t wpnlev1info[NUMWEAPONS];
extern weaponinfo_t wpnlev2info[NUMWEAPONS];
typedef enum
{
arti_none,
arti_invulnerability,
arti_invisibility,
arti_health,
arti_superhealth,
arti_tomeofpower,
arti_torch,
arti_firebomb,
arti_egg,
arti_fly,
arti_teleport,
NUMARTIFACTS
} artitype_t;
typedef enum
{
pw_None,
pw_invulnerability,
pw_invisibility,
pw_allmap,
pw_infrared,
pw_weaponlevel2,
pw_flight,
pw_shield,
pw_health2,
NUMPOWERS
} powertype_t;
#define INVULNTICS (30 * 35)
#define INVISTICS (60 * 35)
#define INFRATICS (120* 35)
#define IRONTICS (60 * 35)
#define WPNLEV2TICS (40 * 35)
#define FLIGHTTICS (60 * 35)
#define CHICKENTICS (40 * 35)
#define MESSAGETICS ( 4 * 35)
#define BLINKTHRESHOLD ( 4 * 32)
#define NUMINVENTORYSLOTS 14
typedef struct
{
int type;
int count;
} inventory_t;
/*
================
player_t
================
*/
typedef struct player_s
{
mobj_t *mo;
playerstate_t playerstate;
ticcmd_t cmd;
fixed_t viewz; /* focal origin above r.z */
fixed_t viewheight; /* base height above floor for viewz */
fixed_t deltaviewheight; /* squat speed */
fixed_t bob; /* bounded/scaled total momentum */
int flyheight;
int lookdir;
boolean centering;
int health; /* only used between levels, mo->health */
/* is used during levels */
int armorpoints, armortype; /* armor type is 0-2 */
inventory_t inventory[NUMINVENTORYSLOTS];
artitype_t readyArtifact;
int artifactCount;
int inventorySlotNum;
int powers[NUMPOWERS];
boolean keys[NUMKEYS];
boolean backpack;
signed int frags[MAXPLAYERS]; /* kills of other players */
weapontype_t readyweapon;
weapontype_t pendingweapon; /* wp_nochange if not changing */
boolean weaponowned[NUMWEAPONS];
int ammo[NUMAMMO];
int maxammo[NUMAMMO];
int attackdown, usedown; /* true if button down last tic */
int cheats; /* bit flags */
int refire; /* refired shots are less accurate */
int killcount, itemcount, secretcount; /* for intermission */
const char *message; /* hint messages */
int messageTics; /* counter for showing messages */
int damagecount, bonuscount;/* for screen flashing */
int flamecount; /* for flame thrower duration */
mobj_t *attacker; /* who did damage (NULL for floors) */
int extralight; /* so gun flashes light up areas */
int fixedcolormap; /* can be set to REDCOLORMAP, etc */
int colormap; /* 0-3 for which color to draw player */
pspdef_t psprites[NUMPSPRITES]; /* view sprites (gun, etc) */
boolean didsecret; /* true if secret level has been done */
int chickenTics; /* player is a chicken if > 0 */
int chickenPeck; /* chicken peck countdown */
mobj_t *rain1; /* active rain maker 1 */
mobj_t *rain2; /* active rain maker 2 */
} player_t;
#define CF_NOCLIP 1
#define CF_GODMODE 2
#define CF_NOMOMENTUM 4 /* not really a cheat, just a debug aid */
#define BACKUPTICS 12 /* CHANGED FROM 12 !?!? */
typedef struct
{
unsigned int checksum; /* high bit is retransmit request */
byte retransmitfrom; /* only valid if NCMD_RETRANSMIT */
byte starttic;
byte player, numtics;
ticcmd_t cmds[BACKUPTICS];
} doomdata_t;
typedef struct
{
int32_t id;
short intnum; /* DOOM executes an int to execute commands */
/* communication between DOOM and the driver */
short command; /* CMD_SEND or CMD_GET */
short remotenode; /* dest for send, set by get (-1 = no packet) */
short datalength; /* bytes in doomdata to be sent */
/* info common to all nodes */
short numnodes; /* console is allways node 0 */
short ticdup; /* 1 = no duplication, 2-5 = dup for slow nets */
short extratics; /* 1 = send a backup tic in every packet */
short deathmatch; /* 1 = deathmatch */
short savegame; /* -1 = new game, 0-5 = load savegame */
short episode; /* 1-3 */
short map; /* 1-9 */
short skill; /* 1-5 */
/* info specific to this node */
short consoleplayer;
short numplayers;
short angleoffset; /* 1 = left, 0 = center, -1 = right */
short drone; /* 1 = drone */
/* packet data to be sent */
doomdata_t data;
} doomcom_t;
#define DOOMCOM_ID 0x12345678l
extern doomcom_t *doomcom;
extern doomdata_t *netbuffer; /* points inside doomcom */
#define MAXNETNODES 8 /* max computers in a game */
#define CMD_SEND 1
#define CMD_GET 2
#define SBARHEIGHT 42 /* status bar height at bottom of screen */
/*
===============================================================================
GLOBAL VARIABLES
===============================================================================
*/
#define TELEFOGHEIGHT (32 * FRACUNIT)
#define MAXEVENTS 64
extern event_t events[MAXEVENTS];
extern int eventhead;
extern int eventtail;
extern fixed_t finesine[5*FINEANGLES/4];
extern fixed_t *finecosine;
extern gameaction_t gameaction;
extern boolean paused;
extern boolean shareware; /* true if main WAD is the shareware version */
extern boolean ExtendedWAD; /* true if main WAD is the extended version */
extern boolean nomonsters; /* checkparm of -nomonsters */
extern boolean respawnparm; /* checkparm of -respawn */
extern boolean debugmode; /* checkparm of -debug */
extern boolean usergame; /* ok to save / end game */
extern boolean ravpic; /* checkparm of -ravpic */
extern boolean deathmatch; /* only if started as net death */
extern boolean netgame; /* only true if >1 player */
extern boolean playeringame[MAXPLAYERS];
extern int consoleplayer; /* player taking events and displaying */
extern int displayplayer;
extern int viewangleoffset;/* ANG90 = left side, ANG270 = right */
extern player_t players[MAXPLAYERS];
extern boolean singletics; /* debug flag to cancel adaptiveness */
extern boolean DebugSound; /* debug flag for displaying sound info */
extern int maxammo[NUMAMMO];
extern boolean demoplayback;
extern int skytexture;
extern gamestate_t gamestate;
extern skill_t gameskill;
extern boolean respawnmonsters;
extern int gameepisode;
extern int gamemap;
extern int prevmap;
extern int totalkills, totalitems, totalsecret; /* for intermission */
extern int levelstarttic; /* gametic at level start */
extern int leveltime; /* tics in game play for par */
extern int ticcount;
extern ticcmd_t netcmds[MAXPLAYERS][BACKUPTICS];
extern int ticdup;
extern ticcmd_t localcmds[BACKUPTICS];
extern int rndindex;
extern int gametic, maketic;
extern int nettics[MAXNETNODES];
extern mapthing_t *deathmatch_p;
extern mapthing_t deathmatchstarts[10];
extern mapthing_t playerstarts[MAXPLAYERS];
extern int viewwindowx;
extern int viewwindowy;
extern int viewwidth;
extern int scaledviewwidth;
extern int viewheight;
extern int mouseSensitivity;
extern boolean precache; /* if true, load all graphics at level load */
extern byte *screens; /* off screen work buffer, from V_video.c */
extern boolean singledemo; /* quit after playing a demo from cmdline */
extern FILE *debugfile;
extern int bodyqueslot;
extern skill_t startskill;
extern int startepisode;
extern int startmap;
extern boolean autostart;
/*
===============================================================================
GLOBAL FUNCTIONS
===============================================================================
*/
fixed_t FixedMul (fixed_t a, fixed_t b);
fixed_t FixedDiv (fixed_t a, fixed_t b);
fixed_t FixedDiv2 (fixed_t a, fixed_t b);
#undef _HAVE_FIXED_ASM
#if !defined(_DISABLE_ASM)
#if defined(__i386__) || defined(__386__) || defined(_M_IX86)
#if defined(__WATCOMC__)
#define _HAVE_FIXED_ASM 1
#pragma aux FixedMul = \
"imul ebx", \
"shrd eax,edx,16" \
parm [eax] [ebx] \
value [eax] \
modify exact [eax edx]
#pragma aux FixedDiv2 = \
"cdq", \
"shld edx,eax,16", \
"sal eax,16", \
"idiv ebx" \
parm [eax] [ebx] \
value [eax] \
modify exact [eax edx]
#elif defined(__GNUC__)
#define _HAVE_FIXED_ASM 1
# if defined(_INLINE_FIXED_ASM)
# if (__GNUC__ == 2) && (__GNUC_MINOR__ <= 91)
# define FixedMul(fa,fb) ({ int __value, __fb = (fb); \
__asm__("imul %%ebx; shrd $16,%%edx,%%eax" \
: "=a" (__value) \
: "0" (fa), "b" (__fb) \
: "eax", "edx" ); __value; })
# define FixedDiv2(fa,fb) ({ int __value; \
__asm__("cdq; shld $16,%%eax,%%edx; sall $16,%%eax; idiv %%ebx" \
: "=a" (__value) \
: "0" (fa), "b" (fb) \
: "eax", "edx" ); __value; })
# else /* GCC > 2.91.x */
# define FixedMul(fa,fb) ({ int __value, __fb = (fb); \
__asm__("imul %%ebx; shrd $16,%%edx,%%eax" \
: "=a" (__value) \
: "0" (fa), "b" (__fb) \
: "edx" ); __value; })
# define FixedDiv2(fa,fb) ({ int __value; \
__asm__("cdq; shld $16,%%eax,%%edx; sall $16,%%eax; idiv %%ebx" \
: "=a" (__value) \
: "0" (fa), "b" (fb) \
: "edx" ); __value; })
# endif /* GCC/EGCS versions */
# endif /* _INLINE_FIXED_ASM */
#endif
#endif /* X86 */
#endif /* !_DISABLE_ASM */
#define FIX2FLT(x) ((float)((x)>>FRACBITS) + (float)((x)&(FRACUNIT-1)) / (float)(FRACUNIT))
#define Q_FIX2FLT(x) ((float)((x)>>FRACBITS))
int16_t ShortSwap(int16_t) __attribute__((__const__));
int32_t LongSwap (int32_t) __attribute__((__const__));
#if defined(__GNUC__)
static inline __attribute__((__const__)) int16_t _H2_SWAP16(int16_t x)
{
return (int16_t) (((uint16_t)x << 8) | ((uint16_t)x >> 8));
}
static inline __attribute__((__const__)) int32_t _H2_SWAP32(int32_t x)
{
return (int32_t) (((uint32_t)x << 24) | ((uint32_t)x >> 24) |
(((uint32_t)x & (uint32_t)0x0000ff00UL) << 8) |
(((uint32_t)x & (uint32_t)0x00ff0000UL) >> 8));
}
#endif /* GCC */
/*
#ifdef __BIG_ENDIAN__
*/
#ifdef WORDS_BIGENDIAN
# ifdef __GNUC__
# define SHORT(a) _H2_SWAP16((a))
# define LONG(a) _H2_SWAP32((a))
# else
# define SHORT(x) ShortSwap((x))
# define LONG(x) LongSwap((x))
# endif
#else
#define SHORT(x) (x)
#define LONG(x) (x)
#endif
/* ---- READ_INT16/32 --- */
#define READ_INT16(b) ((b)[0] | ((b)[1] << 8))
#define READ_INT32(b) ((b)[0] | ((b)[1] << 8) | ((b)[2] << 16) | ((b)[3] << 24))
#define INCR_INT16(b) (b)+=2
#define INCR_INT32(b) (b)+=4
/* ----- MEMORY ZONE ---- */
/* tags < 100 are not overwritten until freed */
#define PU_STATIC 1 /* static entire execution time */
#define PU_SOUND 2 /* static while playing */
#define PU_MUSIC 3 /* static while playing */
#define PU_DAVE 4 /* anything else Dave wants static */
#define PU_LEVEL 50 /* static until level exited */
#define PU_LEVSPEC 51 /* a special thinker in a level */
/* tags >= 100 are purgable whenever needed */
#define PU_PURGELEVEL 100
#define PU_CACHE 101
#define ZONEID 0x1d4a11
void Z_Init (void);
void *Z_Malloc (int size, int tag, void *ptr);
void Z_Free (void *ptr);
void Z_FreeTags (int lowtag, int hightag);
void Z_CheckHeap (void);
void Z_ChangeTag2 (void *ptr, int tag);
void Z_DumpHeap (int lowtag, int hightag);
void Z_FileDumpHeap (FILE *f);
int Z_FreeMemory (void);
extern boolean MallocFailureOk;
typedef struct memblock_s
{
int size; /* including the header and possibly tiny fragments */
void **user; /* NULL if a free block */
int tag; /* purgelevel */
int id; /* should be ZONEID */
struct memblock_s *next, *prev;
} memblock_t;
#define Z_ChangeTag(p,t) \
{ \
if (((memblock_t *)((byte *)((p)) - sizeof(memblock_t)))->id != ZONEID) \
I_Error("Z_CT at %s:%i", __FILE__, __LINE__); \
Z_ChangeTag2((p),(t)); \
};
/* ------- WADFILE ------- */
typedef struct
{
char name[8];
int handle, position, size;
} lumpinfo_t;
extern lumpinfo_t *lumpinfo;
extern int numlumps;
extern const char *waddir;
boolean W_IsWadPresent(const char *filename);
void W_InitMultipleFiles(const char **filenames);
int W_CheckNumForName(const char *name);
int W_GetNumForName(const char *name);
int W_LumpLength(int lump);
void W_ReadLump(int lump, void *dest);
void *W_CacheLumpNum(int lump, int tag);
void *W_CacheLumpName(const char *name, int tag);
/* ---------- BASE LEVEL ---------- */
void D_DoomMain(void);
/* not a globally visible function, just included for source reference
* calls all startup code
* parses command line options
* if not overrided, calls N_AdvanceDemo
*/
void IncThermo(void);
void InitThermo(int max);
void tprintf(const char *string, int initflag);
void D_DoomLoop(void);
/* not a globally visible function, just included for source reference
* called by D_DoomMain, never exits
* manages timing and IO
* calls all ?_Responder, ?_Ticker, and ?_Drawer functions
* calls I_GetTime, I_StartFrame, and I_StartTic
*/
void D_PostEvent(event_t *ev);
/* called by IO functions when input is detected */
void NetUpdate (void);
/* create any new ticcmds and broadcast to other players */
void D_QuitNetGame (void);
/* broadcasts special packets to other players to notify of game exit */
void TryRunTics (void);
#if !(defined(__WATCOMC__) || defined(__DJGPP__) || defined(_WIN32))
char *strupr (char *str);
char *strlwr (char *str);
int filelength(int handle);
#endif
/* --------- SYSTEM IO --------- */
#if 1
#define SCREENWIDTH 320
#define SCREENHEIGHT 200
#else
#define SCREENWIDTH 560
#define SCREENHEIGHT 375
#endif
byte *I_ZoneBase (int *size);
/* called by startup code to get the ammount of memory to malloc
* for the zone management
*/
int I_GetTime (void);
/* called by D_DoomLoop
* returns current time in tics
*/
void I_StartFrame (void);
/* called by D_DoomLoop
* called before processing any tics in a frame (just after displaying a frame)
* time consuming syncronous operations are performed here (joystick reading)
* can call D_PostEvent
*/
void I_StartTic (void);
/* called by D_DoomLoop
* called before processing each tic in a frame
* quick syncronous operations are performed here
* can call D_PostEvent
*
* asyncronous interrupt functions should maintain private ques that are
* read by the syncronous functions to be converted into events
*/
void I_Init (void);
/* called by D_DoomMain
* determines the hardware configuration and sets up the video mode
*/
void I_InitGraphics (void);
void I_InitNetwork (void);
void I_NetCmd (void);
void I_Error (const char *error, ...) __attribute__((__format__(__printf__,1,2), __noreturn__));
/* called by anything that can generate a terminal error
* bad exit with diagnostic message
*/
void I_Quit (void) __attribute__((__noreturn__));
/* called by M_Responder when quit is selected
* clean exit, displays sell blurb
*/
void I_SetPalette (byte *palette);
/* takes full 8 bit values */
void I_Update(void);
/* Copy buffer to video */
void I_WipeUpdate(wipe_t wipe);
/* Copy buffer to video with wipe effect */
void I_WaitVBL(int count);
/* wait for vertical retrace or pause a bit */
void I_BeginRead (void);
void I_EndRead (void);
byte *I_AllocLow (int length);
/* allocates from low memory under dos, just mallocs under unix */
extern boolean useexterndriver;
#if defined(__WATCOMC__) && defined(_DOS)
#define EBT_FIRE 1
#define EBT_OPENDOOR 2
#define EBT_SPEED 4
#define EBT_STRAFE 8
#define EBT_MAP 0x10
#define EBT_INVENTORYLEFT 0x20
#define EBT_INVENTORYRIGHT 0x40
#define EBT_USEARTIFACT 0x80
#define EBT_FLYDROP 0x100
#define EBT_CENTERVIEW 0x200
#define EBT_PAUSE 0x400
#define EBT_WEAPONCYCLE 0x800
typedef struct
{
short vector; /* Interrupt vector */
signed char moveForward; /* forward/backward (maxes at 50) */
signed char moveSideways; /* strafe (maxes at 24) */
short angleTurn; /* turning speed (640 [slow] 1280 [fast]) */
short angleHead; /* head angle (+2080 [left] : 0 [center] : -2048 [right]) */
signed char pitch; /* look up/down (-110 : +90) */
signed char flyDirection; /* flyheight (+1/-1) */
unsigned short buttons; /* EBT_* flags */
} externdata_t;
void I_Tactile (int on, int off, int total);
#endif /* externdriver, DOS */
/* ---- GAME ---- */
void G_DeathMatchSpawnPlayer (int playernum);
void G_InitNew (skill_t skill, int episode, int map);
void G_DeferedInitNew (skill_t skill, int episode, int map);
/* can be called by the startup code or M_Responder
* a normal game starts at map 1, but a warp test can start elsewhere
*/
void G_DeferedPlayDemo (const char *demo);
void G_LoadGame (int slot);
/* can be called by the startup code or M_Responder
* calls P_SetupLevel or W_EnterWorld
*/
void G_DoLoadGame (void);
void G_SaveGame (int slot, const char *description);
/* called by M_Responder */
void G_RecordDemo (skill_t skill, int numplayers, int episode,
int map, const char *name);
/* only called by startup code */
void G_PlayDemo (const char *name);
void G_TimeDemo (const char *name);
void G_ExitLevel (void);
void G_SecretExitLevel (void);
void G_WorldDone (void);
void G_Ticker (void);
boolean G_Responder (event_t *ev);
void G_ScreenShot (void);
/* ------- SV_SAVE ------- */
#define SAVEVERSIONSIZE 16
#define SAVESTRINGSIZE 24
void SV_SaveGame(int slot, const char *description);
void SV_LoadGame(int slot);
/* ----- PLAY ----- */
void P_Ticker (void);
/* called by C_Ticker
* can call G_PlayerExited
* carries out all thinking of monsters and players
*/
void P_SetupLevel (int episode, int map, int playermask, skill_t skill);
/* called by W_Ticker */
void P_Init (void);
/* called by startup code */
/* ------- REFRESH ------- */
extern boolean setsizeneeded;
extern boolean BorderNeedRefresh;
extern boolean BorderTopRefresh;
extern int UpdateState;
/* define the different areas for the dirty map */
#define I_NOUPDATE 0
#define I_FULLVIEW 1
#define I_STATBAR 2
#define I_MESSAGES 4
#define I_FULLSCRN 8
void R_RenderPlayerView (player_t *player);
/* called by G_Drawer */
void R_Init (void);
/* called by startup code */
void R_DrawViewBorder (void);
void R_DrawTopBorder (void);
/* if the view size is not full screen, draws a border around it */
void R_SetViewSize (int blocks, int detail);
/* called by M_Responder */
int R_FlatNumForName (const char *name);
int R_TextureNumForName (const char *name);
int R_CheckTextureNumForName (const char *name);
/* called by P_Ticker for switches and animations
* returns the texture number for the texture name
*/
/* ---- MISC ---- */
extern const char **myargv;
extern int myargc;
int M_CheckParm(const char *check);
/* returns the position of the given parameter in the arg list (0 if not found) */
boolean M_ValidEpisodeMap(int episode, int map);
/* returns true if the episode/map combo is valid for the current
* game configuration
*/
void M_ExtractFileBase(const char *path, char *dest);
void M_ForceUppercase(char *text);
/* Changes a string to uppercase */
int M_Random (void);
/* returns a number from 0 to 255 */
int P_Random (void);
int P_Random2 (void);
/* as M_Random, but used only by the play simulation */
void M_ClearRandom (void);
/* fix randoms for demos */
void M_FindResponseFile(void);
void M_ClearBox (fixed_t *box);
void M_AddToBox (fixed_t *box, fixed_t x, fixed_t y);
/* bounding box functions */
boolean M_WriteFile(char const *name, const void *source, int length);
int M_ReadFile(char const *name, void **buffer);
void M_ScreenShot (void);
void M_LoadDefaults(const char *fileName);
void M_SaveDefaults (void);
int M_DrawText (int x, int y, boolean direct, const char *string);
/* ---- Interlude (IN_lude.c) ---- */
extern boolean intermission;
void IN_Start(void);
void IN_Ticker(void);
void IN_Drawer(void);
/* ---- Finale (F_finale.c) ------ */
void F_Drawer(void);
void F_Ticker(void);
void F_StartFinale(void);
/* ---- Chat mode (CT_chat.c) ---- */
void CT_Init(void);
void CT_Drawer(void);
boolean CT_Responder(event_t *ev);
void CT_Ticker(void);
char CT_dequeueChatChar(void);
extern char chat_macros[10][80];
extern boolean chatmodeon;
extern boolean ultimatemsg;
/* ---- STATUS BAR (SB_bar.c) ---- */
extern int SB_state;
void SB_Init(void);
boolean SB_Responder(event_t *event);
void SB_Ticker(void);
void SB_Drawer(void);
/* ---- MENU (MN_menu.c) ---- */
void MN_Init(void);
void MN_ActivateMenu(void);
void MN_DeactivateMenu(void);
boolean MN_Responder(event_t *event);
void MN_Ticker(void);
void MN_Drawer(void);
void MN_DrTextA(const char *text, int x, int y);
int MN_TextAWidth(const char *text);
void MN_DrTextB(const char *text, int x, int y);
int MN_TextBWidth(const char *text);
/* --- AUTOMAP---- */
#define AM_TRANSPARENT 1 /* compile time option. 0: old style map drawn */
/* onto solid background. 1: transparent map. */
extern boolean automapactive;
/* ---- VIDEO ---- */
extern int dirtybox[4];
extern byte gammatable[5][256];
extern int usegamma;
void V_Init(void); /* Allocates buffer screens, call before R_Init */
void V_DrawPatch(int x, int y, patch_t *patch);
void V_DrawFuzzPatch(int x, int y, patch_t *patch);
void V_DrawShadowedPatch(int x, int y, patch_t *patch);
void V_DrawRawScreen(byte *raw);
#pragma pack off
#include "sounds.h"
#endif /* __DOOMDEF__ */