2014-03-15 16:59:03 +00:00
|
|
|
// SONIC ROBO BLAST 2
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
|
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
2019-12-06 18:49:42 +00:00
|
|
|
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
2014-03-15 16:59:03 +00:00
|
|
|
//
|
|
|
|
// This program is free software distributed under the
|
|
|
|
// terms of the GNU General Public License, version 2.
|
|
|
|
// See the 'LICENSE' file for more details.
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/// \file doomstat.h
|
|
|
|
/// \brief All the global variables that store the internal state.
|
|
|
|
///
|
|
|
|
/// Theoretically speaking, the internal state of the engine
|
|
|
|
/// should be found by looking at the variables collected
|
|
|
|
/// here, and every relevant module will have to include
|
|
|
|
/// this header file. In practice... things are a bit messy.
|
|
|
|
|
|
|
|
#ifndef __DOOMSTAT__
|
|
|
|
#define __DOOMSTAT__
|
|
|
|
|
|
|
|
// We need globally shared data structures, for defining the global state variables.
|
|
|
|
#include "doomdata.h"
|
|
|
|
|
|
|
|
// We need the player data structure as well.
|
|
|
|
#include "d_player.h"
|
|
|
|
|
|
|
|
// =============================
|
|
|
|
// Selected map etc.
|
|
|
|
// =============================
|
|
|
|
|
|
|
|
// Selected by user.
|
|
|
|
extern INT16 gamemap;
|
2016-01-08 03:48:20 +00:00
|
|
|
extern char mapmusname[7];
|
|
|
|
extern UINT16 mapmusflags;
|
2018-09-18 14:22:17 +00:00
|
|
|
extern UINT32 mapmusposition;
|
2016-01-08 03:48:20 +00:00
|
|
|
#define MUSIC_TRACKMASK 0x0FFF // ----************
|
|
|
|
#define MUSIC_RELOADRESET 0x8000 // *---------------
|
2018-09-18 14:22:17 +00:00
|
|
|
#define MUSIC_FORCERESET 0x4000 // -*--------------
|
2016-01-08 03:48:20 +00:00
|
|
|
// Use other bits if necessary.
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2019-12-18 16:24:10 +00:00
|
|
|
extern UINT32 maptol;
|
2014-03-15 16:59:03 +00:00
|
|
|
extern UINT8 globalweather;
|
|
|
|
extern INT32 curWeather;
|
|
|
|
extern INT32 cursaveslot;
|
2017-08-04 17:57:47 +00:00
|
|
|
//extern INT16 lastmapsaved;
|
2017-08-04 00:27:31 +00:00
|
|
|
extern INT16 lastmaploaded;
|
2014-03-15 16:59:03 +00:00
|
|
|
extern boolean gamecomplete;
|
|
|
|
|
2017-08-17 23:58:16 +00:00
|
|
|
#define maxgameovers 13
|
|
|
|
extern UINT8 numgameovers;
|
|
|
|
extern SINT8 startinglivesbalance[maxgameovers+1];
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
#define PRECIP_NONE 0
|
|
|
|
#define PRECIP_STORM 1
|
|
|
|
#define PRECIP_SNOW 2
|
|
|
|
#define PRECIP_RAIN 3
|
|
|
|
#define PRECIP_BLANK 4
|
|
|
|
#define PRECIP_STORM_NORAIN 5
|
|
|
|
#define PRECIP_STORM_NOSTRIKES 6
|
|
|
|
|
|
|
|
// Set if homebrew PWAD stuff has been added.
|
|
|
|
extern boolean modifiedgame;
|
|
|
|
extern UINT16 mainwads;
|
|
|
|
extern boolean savemoddata; // This mod saves time/emblem data.
|
|
|
|
extern boolean disableSpeedAdjust; // Don't alter the duration of player states if true
|
|
|
|
extern boolean imcontinuing; // Temporary flag while continuing
|
|
|
|
extern boolean metalrecording;
|
|
|
|
|
|
|
|
#define ATTACKING_NONE 0
|
|
|
|
#define ATTACKING_RECORD 1
|
|
|
|
#define ATTACKING_NIGHTS 2
|
|
|
|
extern UINT8 modeattacking;
|
|
|
|
|
|
|
|
// menu demo things
|
|
|
|
extern UINT8 numDemos;
|
|
|
|
extern UINT32 demoDelayTime;
|
|
|
|
extern UINT32 demoIdleTime;
|
|
|
|
|
|
|
|
// Netgame? only true in a netgame
|
|
|
|
extern boolean netgame;
|
|
|
|
extern boolean addedtogame; // true after the server has added you
|
|
|
|
// Only true if >1 player. netgame => multiplayer but not (multiplayer=>netgame)
|
|
|
|
extern boolean multiplayer;
|
|
|
|
|
|
|
|
extern INT16 gametype;
|
2019-12-18 15:14:18 +00:00
|
|
|
extern UINT32 gametyperules;
|
2019-12-18 15:30:01 +00:00
|
|
|
extern INT16 gametypecount;
|
2019-12-18 15:23:42 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
extern boolean splitscreen;
|
|
|
|
extern boolean circuitmap; // Does this level have 'circuit mode'?
|
|
|
|
extern boolean fromlevelselect;
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
// Internal parameters for sound rendering.
|
|
|
|
// ========================================
|
|
|
|
|
2018-08-23 16:42:15 +00:00
|
|
|
extern boolean midi_disabled;
|
2014-03-15 16:59:03 +00:00
|
|
|
extern boolean sound_disabled;
|
|
|
|
extern boolean digital_disabled;
|
|
|
|
|
|
|
|
// =========================
|
|
|
|
// Status flags for refresh.
|
|
|
|
// =========================
|
|
|
|
//
|
|
|
|
|
|
|
|
extern boolean menuactive; // Menu overlaid?
|
|
|
|
extern UINT8 paused; // Game paused?
|
2015-01-01 19:50:31 +00:00
|
|
|
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
extern boolean nodrawers;
|
|
|
|
extern boolean noblit;
|
|
|
|
extern boolean lastdraw;
|
|
|
|
extern postimg_t postimgtype;
|
|
|
|
extern INT32 postimgparam;
|
|
|
|
extern postimg_t postimgtype2;
|
|
|
|
extern INT32 postimgparam2;
|
|
|
|
|
|
|
|
extern INT32 viewwindowx, viewwindowy;
|
|
|
|
extern INT32 viewwidth, scaledviewwidth;
|
|
|
|
|
|
|
|
extern boolean gamedataloaded;
|
|
|
|
|
|
|
|
// Player taking events, and displaying.
|
|
|
|
extern INT32 consoleplayer;
|
|
|
|
extern INT32 displayplayer;
|
|
|
|
extern INT32 secondarydisplayplayer; // for splitscreen
|
|
|
|
|
|
|
|
// Maps of special importance
|
|
|
|
extern INT16 spstage_start;
|
2018-06-06 15:07:14 +00:00
|
|
|
extern INT16 sstage_start, sstage_end, smpstage_start, smpstage_end;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2017-04-18 21:36:54 +00:00
|
|
|
extern INT16 titlemap;
|
|
|
|
extern boolean hidetitlepics;
|
2017-05-13 00:54:06 +00:00
|
|
|
extern INT16 bootmap; //bootmap for loading a map on startup
|
2017-04-18 21:36:54 +00:00
|
|
|
|
2018-11-10 14:32:53 +00:00
|
|
|
extern INT16 tutorialmap; // map to load for tutorial
|
|
|
|
extern boolean tutorialmode; // are we in a tutorial right now?
|
2018-11-12 21:51:43 +00:00
|
|
|
extern INT32 tutorialgcs; // which control scheme is loaded?
|
2018-11-12 22:24:46 +00:00
|
|
|
extern INT32 tutorialusemouse; // store cv_usemouse user value
|
|
|
|
extern INT32 tutorialfreelook; // store cv_alwaysfreelook user value
|
|
|
|
extern INT32 tutorialmousemove; // store cv_mousemove user value
|
2019-12-30 20:01:14 +00:00
|
|
|
extern INT32 tutorialanalog; // store cv_analog[0] user value
|
2018-11-10 14:32:53 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
extern boolean looptitle;
|
|
|
|
|
|
|
|
// CTF colors.
|
|
|
|
extern UINT8 skincolor_redteam, skincolor_blueteam, skincolor_redring, skincolor_bluering;
|
|
|
|
|
|
|
|
extern tic_t countdowntimer;
|
|
|
|
extern boolean countdowntimeup;
|
2019-03-15 15:01:41 +00:00
|
|
|
extern boolean exitfadestarted;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
UINT8 numpics;
|
|
|
|
char picname[8][8];
|
|
|
|
UINT8 pichires[8];
|
|
|
|
char *text;
|
|
|
|
UINT16 xcoord[8];
|
|
|
|
UINT16 ycoord[8];
|
|
|
|
UINT16 picduration[8];
|
|
|
|
UINT8 musicloop;
|
|
|
|
UINT16 textxpos;
|
|
|
|
UINT16 textypos;
|
|
|
|
|
2016-01-08 03:48:20 +00:00
|
|
|
char musswitch[7];
|
|
|
|
UINT16 musswitchflags;
|
2018-09-18 14:22:17 +00:00
|
|
|
UINT32 musswitchposition;
|
2016-01-08 03:48:20 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
UINT8 fadecolor; // Color number for fade, 0 means don't do the first fade
|
|
|
|
UINT8 fadeinid; // ID of the first fade, to a color -- ignored if fadecolor is 0
|
|
|
|
UINT8 fadeoutid; // ID of the second fade, to the new screen
|
|
|
|
} scene_t; // TODO: It would probably behoove us to implement subsong/track selection here, too, but I'm lazy -SH
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
scene_t scene[128]; // 128 scenes per cutscene.
|
|
|
|
INT32 numscenes; // Number of scenes in this cutscene
|
|
|
|
} cutscene_t;
|
|
|
|
|
|
|
|
extern cutscene_t *cutscenes[128];
|
|
|
|
|
2018-11-10 15:06:51 +00:00
|
|
|
// Reserve prompt space for tutorials
|
|
|
|
#define TUTORIAL_PROMPT 201 // one-based
|
|
|
|
#define TUTORIAL_AREAS 6
|
|
|
|
#define TUTORIAL_AREA_PROMPTS 5
|
|
|
|
#define MAX_PROMPTS (TUTORIAL_PROMPT+TUTORIAL_AREAS*TUTORIAL_AREA_PROMPTS*3) // 3 control modes
|
2018-11-10 02:55:14 +00:00
|
|
|
#define MAX_PAGES 128
|
|
|
|
|
2018-11-10 17:42:13 +00:00
|
|
|
#define PROMPT_PIC_PERSIST 0
|
|
|
|
#define PROMPT_PIC_LOOP 1
|
|
|
|
#define PROMPT_PIC_DESTROY 2
|
|
|
|
#define MAX_PROMPT_PICS 8
|
2018-11-03 05:27:32 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2018-11-10 15:30:33 +00:00
|
|
|
UINT8 numpics;
|
2018-11-10 17:42:13 +00:00
|
|
|
UINT8 picmode; // sequence mode after displaying last pic, 0 = persist, 1 = loop, 2 = destroy
|
|
|
|
UINT8 pictoloop; // if picmode == loop, which pic to loop to?
|
2018-11-13 04:16:24 +00:00
|
|
|
UINT8 pictostart; // initial pic number to show
|
2018-11-10 17:42:13 +00:00
|
|
|
char picname[MAX_PROMPT_PICS][8];
|
|
|
|
UINT8 pichires[MAX_PROMPT_PICS];
|
|
|
|
UINT16 xcoord[MAX_PROMPT_PICS]; // gfx
|
|
|
|
UINT16 ycoord[MAX_PROMPT_PICS]; // gfx
|
|
|
|
UINT16 picduration[MAX_PROMPT_PICS];
|
2018-11-10 15:30:33 +00:00
|
|
|
|
|
|
|
char musswitch[7];
|
|
|
|
UINT16 musswitchflags;
|
|
|
|
UINT8 musicloop;
|
|
|
|
|
2018-11-10 14:38:32 +00:00
|
|
|
char tag[33]; // page tag
|
|
|
|
char name[34]; // narrator name, extra char for color
|
2018-11-03 05:27:32 +00:00
|
|
|
char iconname[8]; // narrator icon lump
|
|
|
|
boolean rightside; // narrator side, false = left, true = right
|
2018-11-04 02:57:39 +00:00
|
|
|
boolean iconflip; // narrator flip icon horizontally
|
2018-11-10 04:26:41 +00:00
|
|
|
UINT8 hidehud; // hide hud, 0 = show all, 1 = hide depending on prompt position (top/bottom), 2 = hide all
|
2018-11-03 05:27:32 +00:00
|
|
|
UINT8 lines; // # of lines to show. If name is specified, name takes one of the lines. If 0, defaults to 4.
|
2018-11-10 03:38:55 +00:00
|
|
|
INT32 backcolor; // see CON_SetupBackColormap: 0-11, INT32_MAX for user-defined (CONS_BACKCOLOR)
|
2018-11-03 05:27:32 +00:00
|
|
|
UINT8 align; // text alignment, 0 = left, 1 = right, 2 = center
|
|
|
|
UINT8 verticalalign; // vertical text alignment, 0 = top, 1 = bottom, 2 = middle
|
2018-11-04 01:53:17 +00:00
|
|
|
UINT8 textspeed; // text speed, delay in tics between characters.
|
2018-11-03 05:27:32 +00:00
|
|
|
sfxenum_t textsfx; // sfx_ id for printing text
|
2018-11-03 17:06:05 +00:00
|
|
|
UINT8 nextprompt; // next prompt to jump to, one-based. 0 = current prompt
|
|
|
|
UINT8 nextpage; // next page to jump to, one-based. 0 = next page within prompt->numpages
|
2018-11-13 05:13:36 +00:00
|
|
|
char nexttag[33]; // next tag to jump to. If set, this overrides nextprompt and nextpage.
|
2018-11-04 01:53:17 +00:00
|
|
|
INT32 timetonext; // time in tics to jump to next page automatically. 0 = don't jump automatically
|
2018-11-03 05:27:32 +00:00
|
|
|
char *text;
|
|
|
|
} textpage_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2018-11-10 02:55:14 +00:00
|
|
|
textpage_t page[MAX_PAGES];
|
2018-11-03 05:27:32 +00:00
|
|
|
INT32 numpages; // Number of pages in this prompt
|
|
|
|
} textprompt_t;
|
|
|
|
|
2018-11-10 02:55:14 +00:00
|
|
|
extern textprompt_t *textprompts[MAX_PROMPTS];
|
2018-11-03 05:27:32 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
// For the Custom Exit linedef.
|
|
|
|
extern INT16 nextmapoverride;
|
2019-07-29 13:55:36 +00:00
|
|
|
extern UINT8 skipstats;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2018-06-03 21:41:54 +00:00
|
|
|
extern UINT32 ssspheres; // Total # of spheres in a level
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
// Fun extra stuff
|
|
|
|
extern INT16 lastmap; // Last level you were at (returning from special stages).
|
|
|
|
extern mobj_t *redflag, *blueflag; // Pointers to physical flags
|
|
|
|
extern mapthing_t *rflagpoint, *bflagpoint; // Pointers to the flag spawn locations
|
|
|
|
#define GF_REDFLAG 1
|
|
|
|
#define GF_BLUEFLAG 2
|
|
|
|
|
|
|
|
// A single point in space.
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
fixed_t x, y, z;
|
|
|
|
} mappoint_t;
|
|
|
|
|
|
|
|
extern struct quake
|
|
|
|
{
|
|
|
|
// camera offsets and duration
|
|
|
|
fixed_t x,y,z;
|
|
|
|
UINT16 time;
|
|
|
|
|
|
|
|
// location, radius, and intensity...
|
|
|
|
mappoint_t *epicenter;
|
|
|
|
fixed_t radius, intensity;
|
|
|
|
} quake;
|
|
|
|
|
|
|
|
// NiGHTS grades
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
UINT32 grade[6]; // D, C, B, A, S, X (F: failed to reach any of these)
|
|
|
|
} nightsgrades_t;
|
|
|
|
|
2014-08-04 03:49:33 +00:00
|
|
|
// Custom Lua values
|
|
|
|
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
char option[32]; // 31 usable characters
|
|
|
|
char value[256]; // 255 usable characters. If this seriously isn't enough then wtf.
|
|
|
|
} customoption_t;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
/** Map header information.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
// The original eight, plus one.
|
|
|
|
char lvlttl[22]; ///< Level name without "Zone". (21 character limit instead of 32, 21 characters can display on screen max anyway)
|
|
|
|
char subttl[33]; ///< Subtitle for level
|
|
|
|
UINT8 actnum; ///< Act number or 0 for none.
|
2019-12-18 15:40:46 +00:00
|
|
|
UINT32 typeoflevel; ///< Combination of typeoflevel flags.
|
2014-03-15 16:59:03 +00:00
|
|
|
INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end.
|
2020-01-08 22:41:38 +00:00
|
|
|
char keywords[33]; ///< Keywords separated by space to search for. 32 characters.
|
2016-01-08 03:48:20 +00:00
|
|
|
char musname[7]; ///< Music track to play. "" for no music.
|
|
|
|
UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
|
2018-09-18 14:22:17 +00:00
|
|
|
UINT32 muspos; ///< Music position to jump to.
|
2014-03-15 16:59:03 +00:00
|
|
|
char forcecharacter[17]; ///< (SKINNAMESIZE+1) Skin to switch to or "" to disable.
|
|
|
|
UINT8 weather; ///< 0 = sunny day, 1 = storm, 2 = snow, 3 = rain, 4 = blank, 5 = thunder w/o rain, 6 = rain w/o lightning, 7 = heat wave.
|
|
|
|
INT16 skynum; ///< Sky number to use.
|
|
|
|
INT16 skybox_scalex; ///< Skybox X axis scale. (0 = no movement, 1 = 1:1 movement, 16 = 16:1 slow movement, -4 = 1:4 fast movement, etc.)
|
|
|
|
INT16 skybox_scaley; ///< Skybox Y axis scale.
|
|
|
|
INT16 skybox_scalez; ///< Skybox Z axis scale.
|
|
|
|
|
|
|
|
// Extra information.
|
|
|
|
char interscreen[8]; ///< 320x200 patch to display at intermission.
|
|
|
|
char runsoc[33]; ///< SOC to execute at start of level (32 character limit instead of 63)
|
|
|
|
char scriptname[33]; ///< Script to use when the map is switched to. (32 character limit instead of 191)
|
|
|
|
UINT8 precutscenenum; ///< Cutscene number to play BEFORE a level starts.
|
|
|
|
UINT8 cutscenenum; ///< Cutscene number to use, 0 for none.
|
|
|
|
INT16 countdown; ///< Countdown until level end?
|
|
|
|
UINT16 palette; ///< PAL lump to use on this map
|
2014-03-21 18:42:55 +00:00
|
|
|
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
|
2014-03-15 16:59:03 +00:00
|
|
|
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
|
|
|
UINT8 levelselect; ///< Is this map available in the level select? If so, which map list is it available in?
|
|
|
|
SINT8 bonustype; ///< What type of bonus does this level have? (-1 for null.)
|
2018-08-13 18:16:33 +00:00
|
|
|
SINT8 maxbonuslives; ///< How many bonus lives to award at Intermission? (-1 for unlimited.)
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2019-12-18 03:28:58 +00:00
|
|
|
UINT16 levelflags; ///< LF_flags: merged booleans into one UINT16 for space, see below
|
2014-03-15 16:59:03 +00:00
|
|
|
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
|
|
|
|
2017-01-27 00:02:47 +00:00
|
|
|
char selectheading[22]; ///< Level select heading. Allows for controllable grouping.
|
2019-06-23 22:15:40 +00:00
|
|
|
UINT16 startrings; ///< Number of rings players start with.
|
2017-01-26 19:14:52 +00:00
|
|
|
|
2019-12-18 03:28:58 +00:00
|
|
|
// Title card.
|
|
|
|
char ltzzpatch[8]; ///< Zig zag patch.
|
|
|
|
char ltzztext[8]; ///< Zig zag text.
|
|
|
|
char ltactdiamond[8]; ///< Act diamond.
|
|
|
|
|
2016-12-27 21:01:20 +00:00
|
|
|
// Freed animals stuff.
|
2016-12-29 17:02:05 +00:00
|
|
|
UINT8 numFlickies; ///< Internal. For freed flicky support.
|
|
|
|
mobjtype_t *flickies; ///< List of freeable flickies in this level. Allocated dynamically for space reasons. Be careful.
|
2016-12-27 21:01:20 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
// NiGHTS stuff.
|
|
|
|
UINT8 numGradedMares; ///< Internal. For grade support.
|
|
|
|
nightsgrades_t *grades; ///< NiGHTS grades. Allocated dynamically for space reasons. Be careful.
|
2014-08-04 03:49:33 +00:00
|
|
|
|
2018-10-21 18:51:49 +00:00
|
|
|
// Music stuff.
|
2019-03-15 05:00:50 +00:00
|
|
|
UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds
|
2018-10-21 18:51:49 +00:00
|
|
|
char musintername[7]; ///< Intermission screen music.
|
2019-10-16 02:54:21 +00:00
|
|
|
|
2019-08-04 11:03:57 +00:00
|
|
|
char muspostbossname[7]; ///< Post-bossdeath music.
|
|
|
|
UINT16 muspostbosstrack; ///< Post-bossdeath track.
|
|
|
|
UINT32 muspostbosspos; ///< Post-bossdeath position
|
|
|
|
UINT32 muspostbossfadein; ///< Post-bossdeath fade-in milliseconds.
|
2018-10-21 18:51:49 +00:00
|
|
|
|
2019-08-05 00:02:38 +00:00
|
|
|
SINT8 musforcereset; ///< Force resetmusic (-1 for default; 0 for force off; 1 for force on)
|
|
|
|
|
2014-08-04 03:49:33 +00:00
|
|
|
// Lua stuff.
|
|
|
|
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
|
|
|
UINT8 numCustomOptions; ///< Internal. For Lua custom value support.
|
|
|
|
customoption_t *customopts; ///< Custom options. Allocated dynamically for space reasons. Be careful.
|
2014-03-15 16:59:03 +00:00
|
|
|
} mapheader_t;
|
|
|
|
|
|
|
|
// level flags
|
|
|
|
#define LF_SCRIPTISFILE 1 ///< True if the script is a file, not a lump.
|
|
|
|
#define LF_SPEEDMUSIC 2 ///< Speed up act music for super sneakers
|
|
|
|
#define LF_NOSSMUSIC 4 ///< Disable Super Sonic music
|
|
|
|
#define LF_NORELOAD 8 ///< Don't reload level on death
|
|
|
|
#define LF_NOZONE 16 ///< Don't include "ZONE" on level title
|
2017-08-06 20:36:55 +00:00
|
|
|
#define LF_SAVEGAME 32 ///< Save the game upon loading this level
|
2019-03-15 03:10:14 +00:00
|
|
|
#define LF_MIXNIGHTSCOUNTDOWN 64 ///< Play sfx_timeup instead of music change for NiGHTS countdown
|
2019-11-18 18:04:40 +00:00
|
|
|
#define LF_WARNINGTITLE 128 ///< WARNING! WARNING! WARNING! WARNING!
|
|
|
|
#define LF_NOTITLECARD 256 ///< Don't start the title card
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
#define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu
|
|
|
|
#define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen
|
|
|
|
#define LF2_RECORDATTACK 4 ///< Show this map in Time Attack
|
|
|
|
#define LF2_NIGHTSATTACK 8 ///< Show this map in NiGHTS mode menu
|
|
|
|
#define LF2_NOVISITNEEDED 16 ///< Available in time attack/nights mode without visiting the level
|
2017-02-17 01:45:21 +00:00
|
|
|
#define LF2_WIDEICON 32 ///< If you're in a circumstance where it fits, use a wide map icon
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
extern mapheader_t* mapheaderinfo[NUMMAPS];
|
|
|
|
|
|
|
|
// Gametypes
|
2019-12-18 15:36:54 +00:00
|
|
|
#define NUMGAMETYPEFREESLOTS 128
|
2014-03-15 16:59:03 +00:00
|
|
|
enum GameType
|
|
|
|
{
|
|
|
|
GT_COOP = 0, // also used in single player
|
|
|
|
GT_COMPETITION, // Classic "Race"
|
|
|
|
GT_RACE,
|
|
|
|
|
|
|
|
GT_MATCH,
|
|
|
|
GT_TEAMMATCH,
|
|
|
|
|
|
|
|
GT_TAG,
|
|
|
|
GT_HIDEANDSEEK,
|
|
|
|
|
|
|
|
GT_CTF, // capture the flag
|
|
|
|
|
2019-12-18 03:52:50 +00:00
|
|
|
GT_FIRSTFREESLOT,
|
|
|
|
GT_LASTFREESLOT = GT_FIRSTFREESLOT + NUMGAMETYPEFREESLOTS - 1,
|
2014-03-15 16:59:03 +00:00
|
|
|
NUMGAMETYPES
|
|
|
|
};
|
2017-06-25 16:28:07 +00:00
|
|
|
// If you alter this list, update dehacked.c, MISC_ChangeGameTypeMenu in m_menu.c, and Gametype_Names in g_game.c
|
|
|
|
|
2019-12-24 19:30:18 +00:00
|
|
|
// Gametype rules
|
2019-12-18 04:25:57 +00:00
|
|
|
enum GameTypeRules
|
|
|
|
{
|
2019-12-23 22:24:06 +00:00
|
|
|
GTR_CAMPAIGN = 1, // Linear Co-op map progression, don't allow random maps
|
2019-12-19 19:12:10 +00:00
|
|
|
GTR_RINGSLINGER = 1<<1, // Outside of Co-op, Competition, and Race (overriden by cv_ringslinger)
|
|
|
|
GTR_SPECTATORS = 1<<2, // Outside of Co-op, Competition, and Race
|
2019-12-28 23:18:21 +00:00
|
|
|
GTR_LIVES = 1<<3, // Co-op and Competition
|
|
|
|
GTR_TEAMS = 1<<4, // Team Match, CTF
|
|
|
|
GTR_FIRSTPERSON = 1<<5, // First person camera
|
|
|
|
GTR_POWERSTONES = 1<<6, // Power stones (Match and CTF)
|
|
|
|
GTR_TEAMFLAGS = 1<<7, // Gametype has team flags (CTF)
|
|
|
|
GTR_FRIENDLY = 1<<8, // Co-op
|
|
|
|
GTR_SPECIALSTAGES = 1<<9, // Allow special stages
|
|
|
|
GTR_EMERALDTOKENS = 1<<10, // Spawn emerald tokens
|
|
|
|
GTR_EMERALDHUNT = 1<<11, // Emerald Hunt
|
|
|
|
GTR_RACE = 1<<12, // Race and Competition
|
|
|
|
GTR_TAG = 1<<13, // Tag and Hide and Seek
|
|
|
|
GTR_POINTLIMIT = 1<<14, // Ringslinger point limit
|
|
|
|
GTR_TIMELIMIT = 1<<15, // Ringslinger time limit
|
|
|
|
GTR_OVERTIME = 1<<16, // Allow overtime
|
|
|
|
GTR_HURTMESSAGES = 1<<17, // Hit and death messages
|
|
|
|
GTR_FRIENDLYFIRE = 1<<18, // Always allow friendly fire
|
|
|
|
GTR_STARTCOUNTDOWN = 1<<19, // Hide time countdown (Tag and Hide and Seek)
|
|
|
|
GTR_HIDEFROZEN = 1<<20, // Frozen after hide time (Hide and Seek, but not Tag)
|
|
|
|
GTR_BLINDFOLDED = 1<<21, // Blindfolded view (Tag and Hide and Seek)
|
|
|
|
GTR_RESPAWNDELAY = 1<<22, // Respawn delay
|
|
|
|
GTR_PITYSHIELD = 1<<23, // Award pity shield
|
|
|
|
GTR_DEATHPENALTY = 1<<24, // Death score penalty
|
|
|
|
GTR_NOSPECTATORSPAWN = 1<<25, // Use with GTR_SPECTATORS, spawn in the map instead of with the spectators
|
|
|
|
GTR_DEATHMATCHSTARTS = 1<<26, // Use deathmatch starts
|
|
|
|
GTR_SPAWNINVUL = 1<<27, // Babysitting deterrent
|
|
|
|
GTR_SPAWNENEMIES = 1<<28, // Spawn enemies
|
|
|
|
GTR_ALLOWEXIT = 1<<29, // Allow exit sectors
|
|
|
|
GTR_NOTITLECARD = 1<<30, // Don't show the title card
|
2019-12-28 23:33:28 +00:00
|
|
|
GTR_CUTSCENES = 1<<31, // Play cutscenes, ending, credits, and evaluation
|
2019-12-18 04:25:57 +00:00
|
|
|
};
|
|
|
|
|
2017-06-25 16:28:07 +00:00
|
|
|
// String names for gametypes
|
|
|
|
extern const char *Gametype_Names[NUMGAMETYPES];
|
2019-12-18 17:37:48 +00:00
|
|
|
extern const char *Gametype_ConstantNames[NUMGAMETYPES];
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2019-12-18 23:12:52 +00:00
|
|
|
// Point and time limits for every gametype
|
|
|
|
extern INT32 pointlimits[NUMGAMETYPES];
|
|
|
|
extern INT32 timelimits[NUMGAMETYPES];
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
enum TypeOfLevel
|
|
|
|
{
|
|
|
|
TOL_SP = 0x01, ///< Single Player
|
|
|
|
TOL_COOP = 0x02, ///< Cooperative
|
|
|
|
TOL_COMPETITION = 0x04, ///< Competition
|
|
|
|
TOL_RACE = 0x08, ///< Race
|
|
|
|
// Single Player default = 15
|
|
|
|
|
|
|
|
TOL_MATCH = 0x10, ///< Match
|
|
|
|
TOL_TAG = 0x20, ///< Tag
|
|
|
|
// Match/Tag default = 48
|
|
|
|
|
|
|
|
TOL_CTF = 0x40, ///< Capture the Flag
|
|
|
|
// CTF default = 64
|
|
|
|
|
2019-12-18 16:24:10 +00:00
|
|
|
// 0x80 was here
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
TOL_2D = 0x0100, ///< 2D
|
|
|
|
TOL_MARIO = 0x0200, ///< Mario
|
|
|
|
TOL_NIGHTS = 0x0400, ///< NiGHTS
|
|
|
|
TOL_ERZ3 = 0x0800, ///< ERZ3
|
2019-12-18 16:24:10 +00:00
|
|
|
TOL_XMAS = 0x1000, ///< Christmas NiGHTS
|
2014-03-15 16:59:03 +00:00
|
|
|
};
|
|
|
|
|
2019-12-18 16:24:10 +00:00
|
|
|
#define NUMBASETOL 18
|
|
|
|
#define NUMMAXTOL (18 + NUMGAMETYPEFREESLOTS)
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2019-12-18 16:24:10 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
UINT32 flag;
|
|
|
|
} tolinfo_t;
|
|
|
|
extern tolinfo_t TYPEOFLEVEL[NUMMAXTOL];
|
|
|
|
extern INT32 numtolinfo;
|
2019-12-18 19:00:02 +00:00
|
|
|
extern UINT32 lastcustomtol;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
extern tic_t totalplaytime;
|
|
|
|
|
|
|
|
extern UINT8 stagefailed;
|
|
|
|
|
|
|
|
// Emeralds stored as bits to throw savegame hackers off.
|
|
|
|
extern UINT16 emeralds;
|
|
|
|
#define EMERALD1 1
|
|
|
|
#define EMERALD2 2
|
|
|
|
#define EMERALD3 4
|
|
|
|
#define EMERALD4 8
|
|
|
|
#define EMERALD5 16
|
|
|
|
#define EMERALD6 32
|
|
|
|
#define EMERALD7 64
|
|
|
|
#define ALL7EMERALDS(v) ((v & (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) == (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7))
|
|
|
|
|
2019-08-24 17:25:27 +00:00
|
|
|
// yes, even in non HAVE_BLUA
|
2019-09-11 18:22:56 +00:00
|
|
|
#define NUM_LUABANKS 16 // please only make this number go up between versions, never down. you'll break saves otherwise. also, must fit in UINT8
|
2019-08-24 17:25:27 +00:00
|
|
|
extern INT32 luabanks[NUM_LUABANKS];
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
extern INT32 nummaprings; //keep track of spawned rings/coins
|
|
|
|
|
|
|
|
/** Time attack information, currently a very small structure.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
tic_t time; ///< Time in which the level was finished.
|
|
|
|
UINT32 score; ///< Score when the level was finished.
|
|
|
|
UINT16 rings; ///< Rings when the level was finished.
|
|
|
|
} recorddata_t;
|
|
|
|
|
|
|
|
/** Setup for one NiGHTS map.
|
|
|
|
* These are dynamically allocated because I am insane
|
|
|
|
*/
|
|
|
|
#define GRADE_F 0
|
|
|
|
#define GRADE_E 1
|
|
|
|
#define GRADE_D 2
|
|
|
|
#define GRADE_C 3
|
|
|
|
#define GRADE_B 4
|
|
|
|
#define GRADE_A 5
|
|
|
|
#define GRADE_S 6
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
// 8 mares, 1 overall (0)
|
|
|
|
UINT8 nummares;
|
|
|
|
UINT32 score[9];
|
|
|
|
UINT8 grade[9];
|
|
|
|
tic_t time[9];
|
|
|
|
} nightsdata_t;
|
|
|
|
|
|
|
|
extern nightsdata_t *nightsrecords[NUMMAPS];
|
|
|
|
extern recorddata_t *mainrecords[NUMMAPS];
|
|
|
|
|
|
|
|
// mapvisited is now a set of flags that says what we've done in the map.
|
|
|
|
#define MV_VISITED 1
|
|
|
|
#define MV_BEATEN 2
|
|
|
|
#define MV_ALLEMERALDS 4
|
|
|
|
#define MV_ULTIMATE 8
|
|
|
|
#define MV_PERFECT 16
|
2019-12-05 09:47:29 +00:00
|
|
|
#define MV_PERFECTRA 32
|
|
|
|
#define MV_MAX 63 // used in gamedata check, update whenever MV's are added
|
2017-09-15 19:34:46 +00:00
|
|
|
#define MV_MP 128
|
2014-03-15 16:59:03 +00:00
|
|
|
extern UINT8 mapvisited[NUMMAPS];
|
|
|
|
|
|
|
|
// Temporary holding place for nights data for the current map
|
|
|
|
nightsdata_t ntemprecords;
|
|
|
|
|
|
|
|
extern UINT32 token; ///< Number of tokens collected in a level
|
|
|
|
extern UINT32 tokenlist; ///< List of tokens collected
|
2017-04-24 20:56:17 +00:00
|
|
|
extern boolean gottoken; ///< Did you get a token? Used for end of act
|
2014-03-15 16:59:03 +00:00
|
|
|
extern INT32 tokenbits; ///< Used for setting token bits
|
|
|
|
extern INT32 sstimer; ///< Time allotted in the special stage
|
|
|
|
extern UINT32 bluescore; ///< Blue Team Scores
|
|
|
|
extern UINT32 redscore; ///< Red Team Scores
|
|
|
|
|
|
|
|
// Eliminates unnecessary searching.
|
|
|
|
extern boolean CheckForBustableBlocks;
|
|
|
|
extern boolean CheckForBouncySector;
|
|
|
|
extern boolean CheckForQuicksand;
|
|
|
|
extern boolean CheckForMarioBlocks;
|
|
|
|
extern boolean CheckForFloatBob;
|
|
|
|
extern boolean CheckForReverseGravity;
|
|
|
|
|
|
|
|
// Powerup durations
|
|
|
|
extern UINT16 invulntics;
|
|
|
|
extern UINT16 sneakertics;
|
|
|
|
extern UINT16 flashingtics;
|
|
|
|
extern UINT16 tailsflytics;
|
|
|
|
extern UINT16 underwatertics;
|
|
|
|
extern UINT16 spacetimetics;
|
|
|
|
extern UINT16 extralifetics;
|
2018-08-10 03:14:14 +00:00
|
|
|
extern UINT16 nightslinktics;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
extern UINT8 introtoplay;
|
|
|
|
extern UINT8 creditscutscene;
|
|
|
|
|
|
|
|
extern UINT8 use1upSound;
|
|
|
|
extern UINT8 maxXtraLife; // Max extra lives from rings
|
|
|
|
|
|
|
|
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
|
|
|
|
|
|
|
// For racing
|
|
|
|
extern UINT32 countdown;
|
|
|
|
extern UINT32 countdown2;
|
|
|
|
|
|
|
|
extern fixed_t gravity;
|
|
|
|
|
|
|
|
//for CTF balancing
|
|
|
|
extern INT16 autobalance;
|
|
|
|
extern INT16 teamscramble;
|
|
|
|
extern INT16 scrambleplayers[MAXPLAYERS]; //for CTF team scramble
|
|
|
|
extern INT16 scrambleteams[MAXPLAYERS]; //for CTF team scramble
|
|
|
|
extern INT16 scrambletotal; //for CTF team scramble
|
|
|
|
extern INT16 scramblecount; //for CTF team scramble
|
|
|
|
|
|
|
|
extern INT32 cheats;
|
|
|
|
|
|
|
|
extern tic_t hidetime;
|
|
|
|
|
|
|
|
extern UINT32 timesBeaten; // # of times the game has been beaten.
|
|
|
|
extern UINT32 timesBeatenWithEmeralds;
|
|
|
|
extern UINT32 timesBeatenUltimate;
|
|
|
|
|
|
|
|
// ===========================
|
|
|
|
// Internal parameters, fixed.
|
|
|
|
// ===========================
|
|
|
|
// These are set by the engine, and not changed
|
|
|
|
// according to user inputs. Partly load from
|
|
|
|
// WAD, partly set at startup time.
|
|
|
|
|
|
|
|
extern tic_t gametic;
|
|
|
|
#define localgametic leveltime
|
|
|
|
|
|
|
|
// Player spawn spots.
|
|
|
|
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
|
|
|
extern mapthing_t *bluectfstarts[MAXPLAYERS]; // CTF
|
|
|
|
extern mapthing_t *redctfstarts[MAXPLAYERS]; // CTF
|
|
|
|
|
|
|
|
// =====================================
|
|
|
|
// Internal parameters, used for engine.
|
|
|
|
// =====================================
|
|
|
|
|
|
|
|
#if defined (macintosh)
|
|
|
|
#define DEBFILE(msg) I_OutputMsg(msg)
|
|
|
|
#else
|
|
|
|
#define DEBUGFILE
|
|
|
|
#ifdef DEBUGFILE
|
|
|
|
#define DEBFILE(msg) { if (debugfile) { fputs(msg, debugfile); fflush(debugfile); } }
|
|
|
|
#else
|
|
|
|
#define DEBFILE(msg) {}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef DEBUGFILE
|
2017-01-25 19:36:32 +00:00
|
|
|
extern FILE *debugfile;
|
2014-03-15 16:59:03 +00:00
|
|
|
extern INT32 debugload;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// if true, load all graphics at level load
|
|
|
|
extern boolean precache;
|
|
|
|
|
|
|
|
// wipegamestate can be set to -1
|
|
|
|
// to force a wipe on the next draw
|
|
|
|
extern gamestate_t wipegamestate;
|
2018-11-17 21:32:30 +00:00
|
|
|
extern INT16 wipetypepre;
|
|
|
|
extern INT16 wipetypepost;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
// debug flag to cancel adaptiveness
|
|
|
|
extern boolean singletics;
|
|
|
|
|
|
|
|
// =============
|
|
|
|
// Netgame stuff
|
|
|
|
// =============
|
|
|
|
|
|
|
|
#include "d_clisrv.h"
|
|
|
|
|
|
|
|
extern consvar_t cv_timetic; // display high resolution timer
|
2018-03-26 22:53:09 +00:00
|
|
|
extern consvar_t cv_powerupdisplay; // display powerups
|
2017-10-15 12:37:05 +00:00
|
|
|
extern consvar_t cv_showinputjoy; // display joystick in time attack
|
2014-03-15 16:59:03 +00:00
|
|
|
extern consvar_t cv_forceskin; // force clients to use the server's skin
|
|
|
|
extern consvar_t cv_downloading; // allow clients to downloading WADs.
|
|
|
|
extern ticcmd_t netcmds[BACKUPTICS][MAXPLAYERS];
|
2017-11-11 05:34:37 +00:00
|
|
|
extern INT32 serverplayer;
|
2017-12-08 04:45:39 +00:00
|
|
|
extern INT32 adminplayers[MAXPLAYERS];
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
/// \note put these in d_clisrv outright?
|
|
|
|
|
|
|
|
#endif //__DOOMSTAT__
|