1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 
14 #ifndef _GAME_H
15 #define _GAME_H
16 
17 #include <setjmp.h>
18 
19 #include "vecmat.h"
20 #include "object.h"
21 
22 //#include "segment.h"
23 
24 #ifdef MACINTOSH
25 extern ubyte Scanline_double;
26 #endif
27 
28 #ifdef WINDOWS
29 typedef struct cockpit_span_line {
30 	short num;
31 	struct {
32 		short xmin, xmax;
33 	} span[5];
34 } cockpit_span_line;
35 
36 extern cockpit_span_line win_cockpit_mask[480];
37 #endif
38 
39 
40 
41 //from mglobal.c
42 extern fix FrameTime;					//time in seconds since last frame
43 extern fix RealFrameTime;					//time in seconds since last frame
44 extern fix GameTime;						//time in game (sum of FrameTime)
45 extern int FrameCount;					//how many frames rendered
46 extern fix	Next_laser_fire_time;	//	Time at which player can next fire his selected laser.
47 extern fix	Last_laser_fired_time;
48 extern fix	Next_missile_fire_time;	//	Time at which player can next fire his selected missile.
49 extern fix	Laser_delay_time;			//	Delay between laser fires.
50 extern int Cheats_enabled;
51 
52 extern int Missile_view_enabled;
53 
54 extern object *Missile_viewer;
55 
56 #define CV_NONE	0
57 #define CV_ESCORT	1
58 #define CV_REAR	2
59 #define CV_COOP	3
60 #define CV_MARKER	4
61 
62 extern int Cockpit_3d_view[2];		//left & right
63 extern int Coop_view_player[2];		//left & right
64 extern int Marker_viewer_num[2];		//left & right
65 
66 //constants for ft_preference
67 #define FP_RIGHT		0
68 #define FP_UP			1
69 #define FP_FORWARD	2		//this is the default
70 #define FP_LEFT		3
71 #define FP_DOWN		4
72 #define FP_FIRST_TIME	5
73 
74 extern int ft_preference;
75 
76 //	The following bits define the game modes.
77 #define GM_EDITOR						1			//	You came into the game from the editor
78 #define GM_SERIAL						2			// You are in serial mode
79 #define GM_NETWORK					4			// You are in network mode
80 #define GM_MULTI_ROBOTS				8			//	You are in a multiplayer mode with robots.
81 #define GM_MULTI_COOP				16			//	You are in a multiplayer mode and can't hurt other players.
82 #define GM_MODEM						32			// You are in a modem (serial) game
83 
84 #define GM_UNKNOWN					64			//	You are not in any mode, kind of dangerous...
85 #define GM_GAME_OVER					128		//	Game has been finished
86 
87 #define GM_TEAM						256		// Team mode for network play
88 #define GM_CAPTURE					512		// Capture the flag mode for D2
89 #define GM_HOARD						1024		// New hoard mode for D2 Christmas
90 
91 #define GM_NORMAL						0			//	You are in normal play mode, no multiplayer stuff
92 #define GM_MULTI						38			//	You are in some type of multiplayer game
93 
94 //	Examples:
95 //	Deathmatch mode on a network is GM_NETWORK
96 //	Deathmatch mode via modem with robots is GM_MODEM | GM_MULTI_ROBOTS
97 // Cooperative mode via serial link is GM_SERIAL | GM_MULTI_COOP
98 
99 #define	NDL	5		//	Number of difficulty levels.
100 #define	NUM_DETAIL_LEVELS	6
101 
102 extern int Game_mode;
103 
104 extern int Game_paused;
105 extern int gauge_message_on;
106 
107 #ifndef NDEBUG		//if debugging, these are variables
108 
109 extern int Slew_on;							//in slew or sim mode?
110 extern int Game_double_buffer;			//double buffering?
111 
112 
113 #else					//if not debugging, these are constants
114 
115 #define Slew_on 				0		//no slewing in real game
116 #define Game_double_buffer	1		//always double buffer in real game
117 
118 
119 #endif
120 
121 #ifndef MACINTOSH
122 
123 #define Scanline_double		0		// PC doesn't do scanline doubling
124 
125 #else
126 
127 extern ubyte Scanline_double;			// but the Macintosh does
128 
129 #endif
130 
131 //Suspend flags
132 
133 #define SUSP_NONE			0			//Everything moving normally
134 #define SUSP_ROBOTS		1			//Robot AI doesn't move
135 #define SUSP_WEAPONS		2			//Lasers, etc. don't move
136 
137 extern int Game_suspended;			//if non-zero, nothing moves but player
138 
139 // from game.c
140 void init_game(void);
141 void game(void);
142 void close_game(void);
143 void init_cockpit(void);
144 void calc_frame_time(void);
145 
146 int do_flythrough(object *obj,int first_time);
147 
148 extern jmp_buf LeaveGame;					// Do a long jump to this when game is over.
149 extern int	Difficulty_level;				//	Difficulty level in 0..NDL-1, 0 = easiest, NDL-1 = hardest
150 extern int	Detail_level;					//	Detail level in 0..NUM_DETAIL_LEVELS-1, 0 = boringest, NUM_DETAIL_LEVELS = coolest
151 extern int	Global_laser_firing_count;
152 extern int	Global_missile_firing_count;
153 extern int	Render_depth;
154 extern fix	Auto_fire_fusion_cannon_time, Fusion_charge;
155 
156 extern int PaletteRedAdd, PaletteGreenAdd, PaletteBlueAdd;
157 
158 #define	MAX_PALETTE_ADD	30
159 
160 extern void PALETTE_FLASH_ADD(int dr, int dg, int db);
161 
162 //sets the rgb values for palette flash
163 #define PALETTE_FLASH_SET(_r,_g,_b) PaletteRedAdd=(_r), PaletteGreenAdd=(_g), PaletteBlueAdd=(_b)
164 
165 extern int draw_gauges_on;
166 
167 extern void init_game_screen(void);
168 
169 extern void game_flush_inputs();		// clear all inputs
170 
171 extern int Playing_game;		// True if playing game
172 extern int Auto_flythrough;	//if set, start flythough automatically
173 extern int Mark_count;			// number of debugging marks set
174 extern char faded_in;
175 
176 extern void stop_time(void);
177 extern void start_time(void);
178 extern void reset_time(void);		//called when starting level
179 
180 //	If automap_flag == 1, then call automap routine to write message.
181 extern void save_screen_shot(int automap_flag);
182 
183 #ifndef WINDOWS
184 extern grs_canvas * get_current_game_screen();
185 #endif
186 
187 //valid modes for cockpit
188 #define CM_FULL_COCKPIT 	0	//normal screen with cockput
189 #define CM_REAR_VIEW			1	//looking back with bitmap
190 #define CM_STATUS_BAR		2	//small status bar, w/ reticle
191 #define CM_FULL_SCREEN		3	//full screen, no cockpit (w/ reticle)
192 #define CM_LETTERBOX			4	//half-height window (for cutscenes)
193 
194 extern int Cockpit_mode;		//what sort of cockpit or window is up?
195 extern int Game_window_w,		//width and height of player's game window
196 			  Game_window_h;
197 
198 extern int Rear_view;			//if true, looking back.
199 
200 //initalize flying
201 void fly_init(object *obj);
202 
203 //selects a given cockpit (or lack of one).
204 void select_cockpit(int mode);
205 
206 //force cockpit redraw next time. call this if you've trashed the screen
207 void reset_cockpit(void);		//called if you've trashed the screen
208 
209 //functions to save, clear, and resture palette flash effects
210 void palette_save(void);
211 void reset_palette_add(void);
212 void palette_restore(void);
213 
214 //put up the help message
215 void do_show_help();
216 
217 //show a message in a nice little box
218 void show_boxed_message(char *msg);
219 
220 //erases message drawn with show_boxed_message()
221 void clear_boxed_message();
222 
223 //turns off rear view & rear view cockpit
224 void reset_rear_view(void);
225 
226 extern int Game_turbo_mode;
227 
228 //returns ptr to escort robot, or NULL
229 object *find_escort();
230 
231 extern void apply_modified_palette(void);
232 
233 //Flickering light system
234 typedef struct  {
235 	short segnum,sidenum;
236 	ulong	mask;					// determines flicker pattern
237 	fix	timer;				// time until next change
238 	fix	delay;				// time between changes
239 } flickering_light;
240 
241 #define MAX_FLICKERING_LIGHTS 100
242 
243 extern flickering_light Flickering_lights[MAX_FLICKERING_LIGHTS];
244 extern int Num_flickering_lights;
245 
246 //returns ptr to flickering light structure, or NULL if can't find
247 flickering_light *find_flicker(int segnum,int sidenum);
248 
249 //turn flickering off (because light has been turned off)
250 void disable_flicker(int segnum,int sidenum);
251 
252 //turn flickering off (because light has been turned on)
253 void enable_flicker(int segnum,int sidenum);
254 
255 //returns 1 if ok, 0 if error
256 int add_flicker(int segnum,int sidenum,fix delay,ulong mask);
257 
258 int gr_toggle_fullscreen_game(void);
259 
260 /*
261  * reads a flickering_light structure from a CFILE
262  */
263 void flickering_light_read(flickering_light *fl, CFILE *fp);
264 
265 extern int maxfps;
266 
267 #endif
268