2 * $Logfile: /Freespace2/code/GlobalIncs/PsTypes.h $
7 * Header file containg global typedefs, constants and macros
10 * Revision 1.2 2002/05/28 06:28:20 theoddone33
11 * Filesystem mods, actually reads some data files now
13 * Revision 1.1.1.1 2002/05/03 03:28:12 root
17 * 34 6/16/00 3:16p Jefff
18 * sim of the year dvd version changes, a few german soty localization
21 * 33 10/05/99 2:29p Danw
23 * 32 10/01/99 9:10a Daveb
26 * 31 9/13/99 12:22a Dave
29 * 30 8/28/99 4:54p Dave
30 * Fixed directives display for multiplayer clients for wings with
31 * multiple waves. Fixed hud threat indicator rendering color.
33 * 29 8/09/99 4:18p Andsager
34 * Make french and german defines, needed specifically to enable language
35 * under launcher misc. tab
37 * 28 7/20/99 1:49p Dave
38 * Peter Drake build. Fixed some release build warnings.
40 * 27 7/18/99 5:19p Dave
41 * Jump node icon. Fixed debris fogging. Framerate warning stuff.
43 * 26 7/15/99 9:21a Andsager
46 * 25 7/09/99 9:51a Dave
47 * Added thick polyline code.
49 * 24 6/29/99 10:35a Dave
50 * Interface polygon bitmaps! Whee!
52 * 23 6/14/99 10:45a Dave
53 * Made beam weapons specify accuracy by skill level in the weapons.tbl
55 * 22 6/03/99 10:15p Dave
56 * Put in temporary main hall screen.
58 * 21 5/09/99 8:57p Dave
59 * Final E3 build preparations.
61 * 20 4/25/99 7:43p Dave
62 * Misc small bug fixes. Made sun draw properly.
64 * 19 4/25/99 3:03p Dave
65 * Removed E3_BUILD from pstypes
67 * 18 4/25/99 3:02p Dave
68 * Build defines for the E3 build.
70 * 17 4/15/99 1:29p Dave
71 * Remove multiplayer beta build define.
73 * 16 4/15/99 1:24p Dave
74 * Final Beta 1 checkin.
76 * 15 4/14/99 5:28p Dave
79 * 14 4/12/99 2:22p Dave
80 * More checks for dogfight stats.
82 * 13 4/09/99 2:21p Dave
83 * Multiplayer beta stuff. CD checking.
85 * 12 2/25/99 4:19p Dave
86 * Added multiplayer_beta defines. Added cd_check define. Fixed a few
87 * release build warnings. Added more data to the squad war request and
90 * 11 2/23/99 2:29p Dave
91 * First run of oldschool dogfight mode.
93 * 10 2/07/99 8:51p Andsager
94 * Add inner bound to asteroid field. Inner bound tries to stay astroid
95 * free. Wrap when within and don't throw at ships inside.
97 * 9 1/15/99 11:29a Neilk
98 * Fixed D3D screen/texture pixel formatting problem.
100 * 8 1/08/99 2:08p Dave
101 * Fixed software rendering for pofview. Super early support for AWACS and
104 * 7 1/06/99 2:24p Dave
105 * Stubs and release build fixes.
107 * 6 11/30/98 1:07p Dave
108 * 16 bit conversion, first run.
110 * 5 11/05/98 4:18p Dave
111 * First run nebula support. Beefed up localization a bit. Removed all
112 * conditional compiles for foreign versions. Modified mission file
115 * 4 10/13/98 9:28a Dave
116 * Started neatening up freespace.h. Many variables renamed and
117 * reorganized. Added AlphaColors.[h,cpp]
119 * 3 10/07/98 11:28a Dave
121 * 2 10/07/98 10:52a Dave
124 * 1 10/07/98 10:48a Dave
126 * 75 8/20/98 5:30p Dave
127 * Put in handy multiplayer logfile system. Now need to put in useful
128 * applications of it all over the code.
130 * 74 6/17/98 11:01a Lawrance
131 * set correct offset for English special font chars
133 * 73 6/12/98 4:52p Hoffoss
134 * Added support for special characters in in forgeign languages.
136 * 72 6/09/98 6:49p Lawrance
137 * Comment out UK_BUILD
139 * 71 6/09/98 5:15p Lawrance
140 * French/German localization
142 * 70 6/09/98 12:12p Hoffoss
143 * Added XSTR localization code.
145 * 69 6/05/98 9:49a Lawrance
148 * 68 5/22/98 3:13p Allender
149 * no Int3()'s and Asserts
151 * 67 5/20/98 12:59p John
152 * Turned optimizations on for debug builds. Also turning on automatic
153 * function inlining. Turned off the unreachable code warning.
155 * 66 5/04/98 1:49p Allender
156 * make Int3's do nothing when InterplayQA is defined
158 * 65 4/25/98 11:55p Lawrance
159 * compile out Int3() and Assert() for release demo build
170 // Build defines. Comment in/out for whatever build is necessary:
171 // #define OEM_BUILD // enable for OEM builds
172 // #define MULTIPLAYER_BETA_BUILD // enable for multiplayer beta build
173 // #define E3_BUILD // enable for 3dfx E3 build
174 // #define PRESS_TOUR_BUILD // enable for press tour build
175 #define FS2_DEMO // enable demo build for FS2
176 // #define PD_BUILD // fred documentation/evaluation build
177 // #define FRENCH_BUILD // build for French (obsolete)
178 // #define GERMAN_BUILD // build for German (this is now used)
179 //#define RELEASE_REAL // this means that it is an actual release candidate, not just an optimized/release build
181 // uncomment this #define for DVD version (makes popups say DVD instead of CD 2 or whatever): JCF 5/10/2000
182 // #define DVD_MESSAGE_HACK
185 #if defined(MULTIPLAYER_BETA_BUILD) || defined(E3_BUILD) || defined(RELEASE_REAL)
186 #define GAME_CD_CHECK
189 // 4127 is constant conditional (assert)
190 // 4100 is unreferenced formal parameters,
191 // 4514 is unreferenced inline function removed,
192 // 4201 is nameless struct extension used. (used by windows header files)
193 // 4410 illegal size for operand... ie... fxch st(1)
194 // 4611 is _setjmp warning. Since we use setjmp alot, and we don't really use constructors or destructors, this warning doesn't really apply to us.
195 // 4725 is the pentium division bug warning, and I can't seem to get rid of it, even with this pragma.
196 // JS: I figured out the disabling 4725 works, but not on the first function in the module.
197 // So to disable this, I add in a stub function at the top of each module that does nothing.
198 // 4710 is inline function not expanded (who cares?)
199 // 4711 tells us an inline function was expanded (who cares?)
200 // 4702 unreachable code. I care, but too many to deal with
201 // 4201 nonstandard extension used : nameless struct/union (happens a lot in Windows include headers)
202 // 4390 emptry control statement (triggered by nprintf and mprintf's inside of one-line if's, etc)
204 #pragma warning(disable: 4127 4100 4514 4201 4410 4611 4725 4710 4711 4702 4201 4390)
207 #include <stdio.h> // For NULL, etc
216 // value to represent an uninitialized state in any int or uint
217 #define UNINITIALIZED 0x7f8e6d9c
219 #if defined(DEMO) || defined(OEM_BUILD) // no change for FS2_DEMO
220 #define MAX_PLAYERS 1
222 #define MAX_PLAYERS 12
227 #define USE_INLINE_ASM 1 // Define this to use inline assembly
228 #define STRUCT_CMP(a, b) memcmp((void *) &a, (void *) &b, sizeof(a))
230 #define LOCAL static // make module local varilable static.
232 typedef __int64 longlong;
234 typedef unsigned char ubyte;
235 typedef unsigned short ushort;
236 typedef unsigned int uint;
238 #define HARDWARE_ONLY
240 //Stucture to store clipping codes in a word
241 typedef struct ccodes {
242 ubyte vor,vand; //or is low byte, and is high byte
245 typedef struct vector {
254 // A vector referenced as an array
255 typedef struct vectora {
259 typedef struct vec2d {
263 // Used for some 2d primitives, like gr_poly
264 typedef struct vert2df {
268 typedef struct angles {
272 typedef struct matrix {
275 vector rvec, uvec, fvec;
282 typedef struct uv_pair {
286 // Used to store rotated points for mines.
287 // Has flag to indicate if projected.
288 typedef struct vertex {
289 float x, y, z; // world space position
290 float sx, sy, sw; // screen space position (sw == 1/z)
291 float u, v; // texture position
292 ubyte r, g, b, a; // color. Use b for darkening;
293 ubyte codes; // what sides of view pyramid this point is on/off. 0 = Inside view pyramid.
294 ubyte flags; // Projection flags. Indicates whether it is projected or not or if projection overflowed.
295 ubyte pad[2]; // pad structure to be 4 byte aligned.
298 #define BMP_AABITMAP (1<<0) // antialiased bitmap
299 #define BMP_TEX_XPARENT (1<<1) // transparent texture
300 #define BMP_TEX_NONDARK (1<<2) // nondarkening texture
301 #define BMP_TEX_OTHER (1<<3) // so we can identify all "normal" textures
304 #define BMP_TEX_ANY ( BMP_TEX_XPARENT | BMP_TEX_NONDARK | BMP_TEX_OTHER )
306 // max res == 1024x768. max texture size == 256
307 #define MAX_BMAP_SECTIONS_X 4
308 #define MAX_BMAP_SECTIONS_Y 3
309 #define MAX_BMAP_SECTION_SIZE 256
310 typedef struct bitmap_section_info {
311 ushort sx[MAX_BMAP_SECTIONS_X]; // x offset of each section
312 ushort sy[MAX_BMAP_SECTIONS_Y]; // y offset of each section
314 ubyte num_x, num_y; // number of x and y sections
315 } bitmap_section_info;
317 typedef struct bitmap {
318 short w, h; // Width and height
319 short rowsize; // What you need to add to go to next row
320 ubyte bpp; // How many bits per pixel it is. (7,8,15,16,24,32)
321 ubyte flags; // See the BMP_???? defines for values
322 uint data; // Pointer to data, or maybe offset into VRAM.
323 ubyte *palette; // If bpp==8, this is pointer to palette. If the BMP_NO_PALETTE_MAP flag
324 // is not set, this palette just points to the screen palette. (gr_palette)
326 bitmap_section_info sections;
329 //This are defined in MainWin.c
330 extern void _cdecl WinAssert(char * text,char *filename, int line);
331 extern void _cdecl Error( char * filename, int line, char * format, ... );
332 extern void _cdecl Warning( char * filename, int line, char * format, ... );
336 // To debug printf do this:
337 // mprintf(( "Error opening %s\n", filename ));
339 #define mprintf(args) outwnd_printf2 args
340 #define nprintf(args) outwnd_printf args
342 #define mprintf(args)
343 #define nprintf(args)
346 #define LOCATION __FILE__,__LINE__
348 // To flag an error, you can do this:
349 // Error( __FILE__, __LINE__, "Error opening %s", filename );
351 // Error( LOCATION, "Error opening %s", filename );
354 #define Assert(x) do {} while (0)
356 void gr_activate(int);
357 #define Assert(x) do { if (!(x)){ gr_activate(0); WinAssert(#x,__FILE__,__LINE__); gr_activate(1); } } while (0)
360 //#define Int3() _asm { int 3 }
363 // Interplay QA version of Int3
364 #define Int3() do { } while (0)
366 // define to call from Warning function above since it calls Int3, so without this, we
367 // get put into infinite dialog boxes
368 #define AsmInt3() _asm { int 3 }
372 // No debug version of Int3
373 #define Int3() do { } while (0)
377 // Debug version of Int3
378 #define Int3() debug_int3()
379 #endif // NDEBUG && DEMO
380 #endif // INTERPLAYQA
382 #define min(a,b) (((a) < (b)) ? (a) : (b))
383 #define max(a,b) (((a) > (b)) ? (a) : (b))
385 #define PI 3.141592654f
386 #define PI2 (3.141592654f*2.0f) // PI*2
387 #define ANG_TO_RAD(x) ((x)*PI/180)
390 extern int Fred_running; // Is Fred running, or FreeSpace?
391 extern int Pofview_running;
392 extern int Nebedit_running;
395 //======================================================================================
396 //====== D E B U G C O N S O L E S T U F F ========================
397 //======================================================================================
399 // Here is a a sample command to toggle something that would
400 // be called by doing "toggle it" from the debug console command window/
403 DCF(toggle_it,"description")
406 This_var = !This_var;
410 dc_printf( "Usage: sample\nToggles This_var on/off.\n" );
414 dc_printf( "The status is %d.\n", This_var );
418 class debug_command {
423 debug_command(char *name,char *help,void (*func)()); // constructor
426 #define DCF(function_name,help_text) \
427 void dcf_##function_name(); \
428 debug_command dc_##function_name(#function_name,help_text,dcf_##function_name); \
429 void dcf_##function_name()
431 // Starts the debug console
432 extern void debug_console( void (*func)() = NULL );
434 // The next three variables tell your function what to do. It should
435 // only change something if the dc_command is set. A minimal function
436 // needs to process the dc_command. Usually, these will be called in
437 // these combinations:
438 // dc_command=true, dc_status=true means process it and show status
439 // dc_help=true means show help only
440 // dc_status=true means show status only
441 // I would recommend doing this in each function:
442 // if (dc_command) { process command }
443 // if (dc_help) { print out help }
444 // if (dc_status) { print out status }
445 // with the last two being optional
447 extern int Dc_command; // If this is set, then process the command
448 extern int Dc_help; // If this is set, then print out the help text in the form, "usage: ... \nLong description\n" );
449 extern int Dc_status; // If this is set, then print out the current status of the command.
451 void dc_get_arg(uint flags); // Gets the next argument. If it doesn't match the flags, this function will print an error and not return.
452 extern char *Dc_arg; // The (lowercased) string value of the argument retrieved from dc_arg
453 extern char *Dc_arg_org; // Dc_arg before it got converted to lowercase
454 extern uint Dc_arg_type; // The type of dc_arg.
455 extern char *Dc_command_line; // The rest of the command line, from the end of the last processed arg on.
456 extern int Dc_arg_int; // If Dc_arg_type & ARG_INT or ARG_HEX is set, then this is the value
457 extern float Dc_arg_float; // If Dc_arg_type & ARG_FLOAT is set, then this is the value
459 // Outputs text to the console
460 void dc_printf( char *format, ... );
462 // Each dc_arg_type can have one or more of these flags set.
463 // This is because some things can fit into two catagories.
464 // Like 1 can be an integer, a float, a string, or a true boolean
466 #define ARG_NONE (1<<0) // no argument
467 #define ARG_ANY 0xFFFFFFFF // Anything.
468 #define ARG_STRING (1<<1) // any valid string
469 #define ARG_QUOTE (1<<2) // a quoted string
470 #define ARG_INT (1<<3) // a valid integer
471 #define ARG_FLOAT (1<<4) // a valid floating point number
473 // some specific commonly used predefined types. Can add up to (1<<31)
474 #define ARG_HEX (1<<5) // a valid hexadecimal integer. Note that ARG_INT will always be set also in this case.
475 #define ARG_TRUE (1<<6) // on, true, non-zero number
476 #define ARG_FALSE (1<<7) // off, false, zero
477 #define ARG_PLUS (1<<8) // Plus sign
478 #define ARG_MINUS (1<<9) // Minus sign
479 #define ARG_COMMA (1<<10) // a comma
481 // A shortcut for boolean only variables.
483 // DCF_BOOL( lighting, Show_lighting )
485 #define DCF_BOOL( function_name, bool_variable ) \
486 void dcf_##function_name(); \
487 debug_command dc_##function_name(#function_name,"Toggles "#bool_variable,dcf_##function_name ); \
488 void dcf_##function_name() { \
489 if ( Dc_command ) { \
490 dc_get_arg(ARG_TRUE|ARG_FALSE|ARG_NONE); \
491 if ( Dc_arg_type & ARG_TRUE ) bool_variable = 1; \
492 else if ( Dc_arg_type & ARG_FALSE ) bool_variable = 0; \
493 else if ( Dc_arg_type & ARG_NONE ) bool_variable ^= 1; \
495 if ( Dc_help ) dc_printf( "Usage: %s [bool]\nSets %s to true or false. If nothing passed, then toggles it.\n", #function_name, #bool_variable ); \
496 if ( Dc_status ) dc_printf( "%s is %s\n", #function_name, (bool_variable?"TRUE":"FALSE") ); \
500 //======================================================================================
501 //======================================================================================
502 //======================================================================================
507 #include "floating.h"
509 // Some constants for stuff
510 #define MAX_FILENAME_LEN 32 // Length for filenames, ie "title.pcx"
511 #define MAX_PATH_LEN 128 // Length for pathnames, ie "c:\bitmaps\title.pcx"
513 // contants and defined for byteswapping routines (useful for mac)
515 #define SWAPSHORT(x) ( \
520 #define SWAPINT(x) ( \
522 (((ulong)x) >> 24) | \
523 ((x & 0x0000ff00) << 8) | \
524 ((x & 0x00ff0000) >> 8) \
528 #define INTEL_INT(x) x
529 #define INTEL_SHORT(x) x
531 #define INTEL_INT(x) SWAPINT(x)
532 #define INTEL_SHORT(x) SWAPSHORT(x)
542 // Callback Loading function.
543 // If you pass a function to this, that function will get called
544 // around 10x per second, so you can update the screen.
545 // Pass NULL to turn it off.
546 // Call this with the name of a function. That function will
547 // then get called around 10x per second. The callback function
548 // gets passed a 'count' which is how many times game_busy has
549 // been called since the callback was set. It gets called
550 // one last time with count=-1 when you turn off the callback
551 // by calling game_busy_callback(NULL). Game_busy_callback
552 // returns the current count, so you can tell how many times
553 // game_busy got called.
554 // If delta_step is above 0, then it will also make sure it
555 // calls the callback each time count steps 'delta_step' even
556 // if 1/10th of a second hasn't elapsed.
557 extern int game_busy_callback( void (*callback)(int count), int delta_step = -1 );
559 // Call whenever loading to display cursor
560 extern void game_busy();
563 //=========================================================
564 // Functions to monitor performance
570 int value; // Value that gets cleared to 0 each frame.
571 int min, max, sum, cnt; // Min & Max of value. Sum is used to calculate average
572 monitor(char *name); // constructor
575 // Creates a monitor variable
576 #define MONITOR(function_name) monitor mon_##function_name(#function_name)
578 // Increments a monitor variable
579 #define MONITOR_INC(function_name,inc) do { mon_##function_name.value+=(inc); } while(0)
581 // Call this once per frame to update monitor file
582 void monitor_update();
586 #define MONITOR(function_name)
588 #define MONITOR_INC(function_name,inc) do { } while(0)
590 // Call this once per frame to update monitor file
591 #define monitor_update() do { } while(0)
597 char *XSTR(char *str, int index);
599 // Caps V between MN and MX.
600 template <class T> void CAP( T& v, T mn, T mx )
604 } else if ( v > mx ) {
609 // ========================================================
610 // stamp checksum stuff
611 // ========================================================
613 // here is the define for the stamp for this set of code
614 #define STAMP_STRING "\001\001\001\001\002\002\002\002Read the Foundation Novels from Asimov. I liked them."
615 #define STAMP_STRING_LENGTH 80
616 #define DEFAULT_CHECKSUM_STRING "\001\001\001\001"
617 #define DEFAULT_TIME_STRING "\002\002\002\002"
619 // macro to calculate the checksum for the stamp. Put here so that we can use different methods
620 // for different applications. Requires the local variable 'checksum' to be defined!!!
621 #define CALCULATE_STAMP_CHECKSUM() do { \
625 for ( i = 0; i < (int)strlen(ptr); i++ ) { \
627 checksum += ptr[i]; \
628 if ( checksum & 0x01 ) \
630 checksum = checksum >> 1; \
632 checksum |= 0x80000000; \
634 checksum |= 0x80000000; \
637 //=========================================================
638 // Memory management functions
639 //=========================================================
644 // Returns 0 if not enough RAM.
645 int vm_init(int min_heap_size);
647 // Allocates some RAM.
648 void *vm_malloc( int size, char *filename=NULL, int line=-1 );
651 char *vm_strdup( const char *ptr, char *filename, int line );
654 void vm_free( void *ptr, char *filename=NULL, int line=-1 );
659 // Easy to use macros
660 #define VM_MALLOC(size) vm_malloc((size),__FILE__,__LINE__)
661 #define VM_FREE(ptr) vm_free((ptr),__FILE__,__LINE__)
663 #define malloc(size) vm_malloc((size),__FILE__,__LINE__)
664 #define free(ptr) vm_free((ptr),__FILE__,__LINE__)
665 #define strdup(ptr) vm_strdup((ptr),__FILE__,__LINE__)
670 // Returns 0 if not enough RAM.
671 int vm_init(int min_heap_size);
673 // Allocates some RAM.
674 void *vm_malloc( int size );
677 char *vm_strdup( const char *ptr );
680 void vm_free( void *ptr );
685 // Easy to use macros
686 #define VM_MALLOC(size) vm_malloc(size)
687 #define VM_FREE(ptr) vm_free(ptr)
689 #define malloc(size) vm_malloc(size)
690 #define free(ptr) vm_free(ptr)
691 #define strdup(ptr) vm_strdup(ptr)