dxx-rebirth/common/main/game.h

381 lines
10 KiB
C
Raw Normal View History

2006-03-20 17:12:09 +00:00
/*
2014-06-01 17:55:23 +00:00
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING.txt.
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below.
* See COPYING.txt for license details.
2006-03-20 17:12:09 +00:00
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* Constants & prototypes which pertain to the game only
*
*/
2015-04-19 04:18:51 +00:00
#pragma once
2006-03-20 17:12:09 +00:00
2013-12-26 04:18:28 +00:00
#include <physfs.h>
2015-04-19 04:18:51 +00:00
#include "maths.h"
2006-03-20 17:12:09 +00:00
#ifdef __cplusplus
#include <cstdint>
2014-06-26 02:24:32 +00:00
#include "pack.h"
#include "segnum.h"
#include "fwd-object.h"
#include "fwd-segment.h"
#include "fwd-window.h"
#define DESIGNATED_GAME_FPS 30 // assuming the original intended Framerate was 30
#define DESIGNATED_GAME_FRAMETIME (F1_0/DESIGNATED_GAME_FPS)
#ifdef NDEBUG
#define MINIMUM_FPS DESIGNATED_GAME_FPS
#define MAXIMUM_FPS 200
#else
#define MINIMUM_FPS 1
#define MAXIMUM_FPS 1000
#endif
2006-03-20 17:12:09 +00:00
extern struct window *Game_wind;
2006-03-20 17:12:09 +00:00
// from mglobal.c
namespace dcx {
extern fix FrameTime; // time in seconds since last frame
extern fix64 GameTime64; // time in game (sum of FrameTime)
extern int d_tick_count; // increments according to DESIGNATED_GAME_FRAMETIME
extern int d_tick_step; // true once in interval of DESIGNATED_GAME_FRAMETIME
extern fix64 Next_laser_fire_time; // Time at which player can next fire his selected laser.
extern fix64 Next_missile_fire_time; // Time at which player can next fire his selected missile.
extern fix64 Next_flare_fire_time;
}
2006-03-20 17:12:09 +00:00
#if defined(DXX_BUILD_DESCENT_II)
2015-03-22 18:49:21 +00:00
class object_signature_t;
namespace dsx {
extern struct object *Missile_viewer;
2015-03-22 18:49:21 +00:00
extern object_signature_t Missile_viewer_sig;
2006-03-20 17:12:09 +00:00
#define CV_NONE 0
#define CV_ESCORT 1
#define CV_REAR 2
#define CV_COOP 3
#define CV_MARKER 4
2015-04-02 02:36:52 +00:00
extern array<int, 2> Coop_view_player; // left & right
extern array<int, 2> Marker_viewer_num; // left & right
}
#endif
2006-03-20 17:12:09 +00:00
// The following bits define the game modes.
#define GM_EDITOR 1 // You came into the game from the editor
// #define GM_SERIAL 2 // You are in serial mode // OBSOLETE
2006-03-20 17:12:09 +00:00
#define GM_NETWORK 4 // You are in network mode
#define GM_MULTI_ROBOTS 8 // You are in a multiplayer mode with robots.
#define GM_MULTI_COOP 16 // You are in a multiplayer mode and can't hurt other players.
// #define GM_MODEM 32 // You are in a modem (serial) game // OBSOLETE
2006-03-20 17:12:09 +00:00
#define GM_UNKNOWN 64 // You are not in any mode, kind of dangerous...
#define GM_GAME_OVER 128 // Game has been finished
#define GM_TEAM 256 // Team mode for network play
#if defined(DXX_BUILD_DESCENT_I)
#define GM_BOUNTY 512 // New bounty mode by Matt1360
#elif defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
#define GM_CAPTURE 512 // Capture the flag mode for D2
#define GM_HOARD 1024 // New hoard mode for D2 Christmas
#define GM_BOUNTY 2048 /* New bounty mode by Matt1360 */
#endif
2006-03-20 17:12:09 +00:00
#define GM_NORMAL 0 // You are in normal play mode, no multiplayer stuff
2016-04-06 03:34:14 +00:00
#define GM_MULTI GM_NETWORK // You are in some type of multiplayer game (GM_NETWORK /* | GM_SERIAL | GM_MODEM */)
2006-03-20 17:12:09 +00:00
#define NDL 5 // Number of difficulty levels.
namespace dcx {
2006-03-20 17:12:09 +00:00
extern int Game_mode;
2015-05-14 02:23:13 +00:00
extern screen_mode Game_screen_mode;
}
2006-03-20 17:12:09 +00:00
#ifndef NDEBUG // if debugging, these are variables
extern int Slew_on; // in slew or sim mode?
#else // if not debugging, these are constants
#define Slew_on 0 // no slewing in real game
#endif
// Suspend flags
#define SUSP_ROBOTS 1 // Robot AI doesn't move
#define SHOW_EXIT_PATH 1
2006-03-20 17:12:09 +00:00
// from game.c
void close_game(void);
void calc_frame_time(void);
namespace dcx {
void calc_d_tick();
2006-03-20 17:12:09 +00:00
extern int Game_suspended; // if non-zero, nothing moves but player
2006-03-20 17:12:09 +00:00
extern int Difficulty_level; // Difficulty level in 0..NDL-1, 0 = easiest, NDL-1 = hardest
extern int Global_laser_firing_count;
extern int Global_missile_firing_count;
extern fix64 Auto_fire_fusion_cannon_time;
extern fix Fusion_charge;
2006-03-20 17:12:09 +00:00
extern int PaletteRedAdd, PaletteGreenAdd, PaletteBlueAdd;
}
2006-03-20 17:12:09 +00:00
#define MAX_PALETTE_ADD 30
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
2015-12-13 18:00:49 +00:00
namespace dsx {
2016-01-09 16:38:12 +00:00
void game();
void init_game();
void init_cockpit();
2006-03-20 17:12:09 +00:00
extern void PALETTE_FLASH_ADD(int dr, int dg, int db);
}
#endif
2006-03-20 17:12:09 +00:00
//sets the rgb values for palette flash
#define PALETTE_FLASH_SET(_r,_g,_b) PaletteRedAdd=(_r), PaletteGreenAdd=(_g), PaletteBlueAdd=(_b)
namespace dcx {
void game_flush_respawn_inputs();
2006-03-20 17:12:09 +00:00
extern int last_drawn_cockpit;
2006-03-20 17:12:09 +00:00
class pause_game_world_time
{
public:
pause_game_world_time();
~pause_game_world_time();
};
void stop_time();
void start_time();
void reset_time(); // called when starting level
}
2006-03-20 17:12:09 +00:00
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
namespace dcx {
2006-03-20 17:12:09 +00:00
// If automap_flag == 1, then call automap routine to write message.
extern void save_screen_shot(int automap_flag);
}
#endif
enum cockpit_mode_t
{
2006-03-20 17:12:09 +00:00
//valid modes for cockpit
CM_FULL_COCKPIT, // normal screen with cockpit
CM_REAR_VIEW, // looking back with bitmap
CM_STATUS_BAR, // small status bar, w/ reticle
CM_FULL_SCREEN, // full screen, no cockpit (w/ reticle)
CM_LETTERBOX // half-height window (for cutscenes)
};
2006-03-20 17:12:09 +00:00
extern int Rear_view; // if true, looking back.
2016-01-09 16:38:15 +00:00
#ifdef dsx
namespace dsx {
void game_flush_inputs(); // clear all inputs
2006-03-20 17:12:09 +00:00
// initalize flying
2014-10-02 03:02:34 +00:00
void fly_init(vobjptr_t obj);
}
#endif
2006-03-20 17:12:09 +00:00
// selects a given cockpit (or lack of one).
void select_cockpit(cockpit_mode_t mode);
2006-03-20 17:12:09 +00:00
// force cockpit redraw next time. call this if you've trashed the screen
namespace dcx {
void reset_cockpit(); // called if you've trashed the screen
2006-03-20 17:12:09 +00:00
// functions to save, clear, and resture palette flash effects
void reset_palette_add(void);
}
2006-03-20 17:12:09 +00:00
void palette_restore(void);
2013-10-28 03:41:44 +00:00
#if defined(DXX_BUILD_DESCENT_I)
2015-12-04 03:36:31 +00:00
void palette_save();
2013-10-28 03:41:44 +00:00
static inline void full_palette_save(void)
{
palette_save();
}
#elif defined(DXX_BUILD_DESCENT_II)
void full_palette_save(void); // all of the above plus gr_palette_load(gr_palette)
#endif
2006-03-20 17:12:09 +00:00
// put up the help message
void show_help();
void show_netgame_help();
void show_newdemo_help();
2006-03-20 17:12:09 +00:00
// show a message in a nice little box
void show_boxed_message(const char *msg, int RenderFlag);
2006-03-20 17:12:09 +00:00
// turns off rear view & rear view cockpit
void reset_rear_view(void);
namespace dcx {
2013-09-24 01:46:10 +00:00
void game_init_render_sub_buffers(int x, int y, int w, int h);
// Sets up the canvases we will be rendering to
static inline void game_init_render_buffers (int render_max_w, int render_max_h)
{
game_init_render_sub_buffers( 0, 0, render_max_w, render_max_h );
}
2012-11-11 00:14:30 +00:00
extern int netplayerinfo_on;
}
2012-11-11 00:14:30 +00:00
2016-01-09 16:38:15 +00:00
#ifdef dsx
namespace dsx {
#if defined(DXX_BUILD_DESCENT_I)
static inline int game_mode_capture_flag()
{
return 0;
}
static inline int game_mode_hoard()
{
return 0;
}
#elif defined(DXX_BUILD_DESCENT_II)
static inline int game_mode_capture_flag()
{
return (Game_mode & GM_CAPTURE);
}
static inline int game_mode_hoard()
{
return (Game_mode & GM_HOARD);
}
2006-03-20 17:12:09 +00:00
// returns ptr to escort robot, or NULL
2014-10-25 15:19:20 +00:00
objptridx_t find_escort();
2006-03-20 17:12:09 +00:00
//Flickering light system
struct flickering_light {
segnum_t segnum;
short sidenum;
uint32_t mask; // determines flicker pattern
2006-03-20 17:12:09 +00:00
fix timer; // time until next change
fix delay; // time between changes
};
2006-03-20 17:12:09 +00:00
#define MAX_FLICKERING_LIGHTS 100
2014-11-23 04:36:58 +00:00
typedef array<flickering_light, MAX_FLICKERING_LIGHTS> Flickering_light_array_t;
extern Flickering_light_array_t Flickering_lights;
extern unsigned Num_flickering_lights;
2012-11-11 00:14:30 +00:00
extern int BigWindowSwitch;
void compute_slide_segs();
2006-03-20 17:12:09 +00:00
// turn flickering off (because light has been turned off)
void disable_flicker(segnum_t segnum, int sidenum);
2006-03-20 17:12:09 +00:00
// turn flickering off (because light has been turned on)
void enable_flicker(segnum_t segnum, int sidenum);
2006-03-20 17:12:09 +00:00
/*
* reads a flickering_light structure from a PHYSFS_File
2006-03-20 17:12:09 +00:00
*/
void flickering_light_read(flickering_light *fl, PHYSFS_File *fp);
2006-03-20 17:12:09 +00:00
2016-02-12 04:02:28 +00:00
void flickering_light_write(const flickering_light *fl, PHYSFS_File *fp);
#endif
void game_render_frame_mono();
2015-12-24 04:01:28 +00:00
static inline void game_render_frame_mono(int skip_flip)
{
game_render_frame_mono();
2015-12-24 04:01:28 +00:00
if (!skip_flip)
gr_flip();
}
}
#endif
void game_leave_menus(void);
//Cheats
2016-01-09 16:38:15 +00:00
#ifdef dsx
namespace dsx {
2014-06-26 02:24:32 +00:00
struct game_cheats : prohibit_void_ptr<game_cheats>
{
int enabled;
int wowie;
int allkeys;
int invul;
int shields;
int killreactor;
int exitpath;
int levelwarp;
int fullautomap;
int ghostphysics;
int rapidfire;
int turbo;
int robotfiringsuspended;
int acid;
#if defined(DXX_BUILD_DESCENT_I)
int wowie2;
int cloak;
int extralife;
int baldguy;
#elif defined(DXX_BUILD_DESCENT_II)
int lamer;
int accessory;
int bouncyfire;
int killallrobots;
int robotskillrobots;
int monsterdamage;
int buddyclone;
int buddyangry;
#endif
2014-06-26 02:24:32 +00:00
};
extern game_cheats cheats;
void move_player_2_segment(vsegptridx_t seg, int side);
2016-01-09 16:38:12 +00:00
window *game_setup();
window_event_result game_handler(window *wind,const d_event &event, const unused_window_userdata_t *);
window_event_result ReadControls(const d_event &event);
}
2015-07-18 03:49:47 +00:00
#endif
int cheats_enabled();
void game_disable_cheats();
2012-11-11 00:14:30 +00:00
int allowed_to_fire_laser(void);
int allowed_to_fire_flare(void);
int allowed_to_fire_missile(void);
void check_rear_view(void);
int create_special_path(void);
2014-10-04 21:47:13 +00:00
window_event_result ReadControls(const d_event &event);
2012-11-11 00:14:30 +00:00
void toggle_cockpit(void);
void game_render_frame();
extern fix Show_view_text_timer;
extern fix ThisLevelTime;
extern int Last_level_path_created;
namespace dcx {
2012-11-11 00:14:30 +00:00
extern int force_cockpit_redraw;
}
#if defined(DXX_BUILD_DESCENT_II)
2015-12-13 18:00:49 +00:00
namespace dsx {
extern ubyte DemoDoingRight,DemoDoingLeft;
2012-11-11 00:14:30 +00:00
extern fix64 Time_flash_last_played;
}
#endif
2012-11-11 00:14:30 +00:00
#ifdef EDITOR
void dump_used_textures_all();
#endif
#endif