2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/GlobalIncs/PsTypes.h $
15 * Header file containg global typedefs, constants and macros
18 * Revision 1.12 2005/10/01 21:38:32 taylor
19 * some reorg of includes to not requires the same headers in many different files
20 * handle FS1 specific language changes
21 * some OS X changes for paths and to handle socklen_t better
23 * Revision 1.11 2004/12/15 04:10:45 taylor
24 * outwnd_unix.cpp from fs2_open for logging to file in debug mode
25 * fixes for default function values
26 * always use vm_* functions for sanity sake
27 * make cfilearchiver 64-bit compatible
28 * fix crash on exit from double free()
29 * fix crash on startup from extra long GL extension string in debug
31 * Revision 1.10 2004/07/04 11:31:43 taylor
32 * amd64 support, compiler warning fixes, don't use software rendering
34 * Revision 1.9 2004/06/11 21:39:44 taylor
35 * x86 compile fixes for OSX patch
37 * Revision 1.8 2004/06/11 00:15:06 tigital
38 * byte-swapping changes for bigendian systems
40 * Revision 1.7 2002/07/13 19:47:02 theoddone33
41 * Fix some more warnings
43 * Change demo building, edit Makefile if you want the demo.
45 * Revision 1.6 2002/06/19 04:52:45 relnev
46 * MacOS X updates (Ryan)
48 * Revision 1.5 2002/06/17 06:33:08 relnev
49 * ryan's struct patch for gcc 2.95
51 * Revision 1.4 2002/06/09 04:41:14 relnev
52 * added copyright header
54 * Revision 1.3 2002/06/01 07:12:32 relnev
55 * a few NDEBUG updates.
57 * removed a few warnings.
59 * Revision 1.2 2002/05/28 06:28:20 theoddone33
60 * Filesystem mods, actually reads some data files now
62 * Revision 1.1.1.1 2002/05/03 03:28:12 root
66 * 34 6/16/00 3:16p Jefff
67 * sim of the year dvd version changes, a few german soty localization
70 * 33 10/05/99 2:29p Danw
72 * 32 10/01/99 9:10a Daveb
75 * 31 9/13/99 12:22a Dave
78 * 30 8/28/99 4:54p Dave
79 * Fixed directives display for multiplayer clients for wings with
80 * multiple waves. Fixed hud threat indicator rendering color.
82 * 29 8/09/99 4:18p Andsager
83 * Make french and german defines, needed specifically to enable language
84 * under launcher misc. tab
86 * 28 7/20/99 1:49p Dave
87 * Peter Drake build. Fixed some release build warnings.
89 * 27 7/18/99 5:19p Dave
90 * Jump node icon. Fixed debris fogging. Framerate warning stuff.
92 * 26 7/15/99 9:21a Andsager
95 * 25 7/09/99 9:51a Dave
96 * Added thick polyline code.
98 * 24 6/29/99 10:35a Dave
99 * Interface polygon bitmaps! Whee!
101 * 23 6/14/99 10:45a Dave
102 * Made beam weapons specify accuracy by skill level in the weapons.tbl
104 * 22 6/03/99 10:15p Dave
105 * Put in temporary main hall screen.
107 * 21 5/09/99 8:57p Dave
108 * Final E3 build preparations.
110 * 20 4/25/99 7:43p Dave
111 * Misc small bug fixes. Made sun draw properly.
113 * 19 4/25/99 3:03p Dave
114 * Removed E3_BUILD from pstypes
116 * 18 4/25/99 3:02p Dave
117 * Build defines for the E3 build.
119 * 17 4/15/99 1:29p Dave
120 * Remove multiplayer beta build define.
122 * 16 4/15/99 1:24p Dave
123 * Final Beta 1 checkin.
125 * 15 4/14/99 5:28p Dave
128 * 14 4/12/99 2:22p Dave
129 * More checks for dogfight stats.
131 * 13 4/09/99 2:21p Dave
132 * Multiplayer beta stuff. CD checking.
134 * 12 2/25/99 4:19p Dave
135 * Added multiplayer_beta defines. Added cd_check define. Fixed a few
136 * release build warnings. Added more data to the squad war request and
139 * 11 2/23/99 2:29p Dave
140 * First run of oldschool dogfight mode.
142 * 10 2/07/99 8:51p Andsager
143 * Add inner bound to asteroid field. Inner bound tries to stay astroid
144 * free. Wrap when within and don't throw at ships inside.
146 * 9 1/15/99 11:29a Neilk
147 * Fixed D3D screen/texture pixel formatting problem.
149 * 8 1/08/99 2:08p Dave
150 * Fixed software rendering for pofview. Super early support for AWACS and
153 * 7 1/06/99 2:24p Dave
154 * Stubs and release build fixes.
156 * 6 11/30/98 1:07p Dave
157 * 16 bit conversion, first run.
159 * 5 11/05/98 4:18p Dave
160 * First run nebula support. Beefed up localization a bit. Removed all
161 * conditional compiles for foreign versions. Modified mission file
164 * 4 10/13/98 9:28a Dave
165 * Started neatening up freespace.h. Many variables renamed and
166 * reorganized. Added AlphaColors.[h,cpp]
168 * 3 10/07/98 11:28a Dave
170 * 2 10/07/98 10:52a Dave
173 * 1 10/07/98 10:48a Dave
175 * 75 8/20/98 5:30p Dave
176 * Put in handy multiplayer logfile system. Now need to put in useful
177 * applications of it all over the code.
179 * 74 6/17/98 11:01a Lawrance
180 * set correct offset for English special font chars
182 * 73 6/12/98 4:52p Hoffoss
183 * Added support for special characters in in forgeign languages.
185 * 72 6/09/98 6:49p Lawrance
186 * Comment out UK_BUILD
188 * 71 6/09/98 5:15p Lawrance
189 * French/German localization
191 * 70 6/09/98 12:12p Hoffoss
192 * Added XSTR localization code.
194 * 69 6/05/98 9:49a Lawrance
197 * 68 5/22/98 3:13p Allender
198 * no Int3()'s and Asserts
200 * 67 5/20/98 12:59p John
201 * Turned optimizations on for debug builds. Also turning on automatic
202 * function inlining. Turned off the unreachable code warning.
204 * 66 5/04/98 1:49p Allender
205 * make Int3's do nothing when InterplayQA is defined
207 * 65 4/25/98 11:55p Lawrance
208 * compile out Int3() and SDL_assert() for release demo build
219 // Build defines. Comment in/out for whatever build is necessary:
220 // #define OEM_BUILD // enable for OEM builds
221 // #define MULTIPLAYER_BETA_BUILD // enable for multiplayer beta build
222 // #define E3_BUILD // enable for 3dfx E3 build
223 // #define PRESS_TOUR_BUILD // enable for press tour build
224 //#define FS2_DEMO // enable demo build for FS2
225 // #define PD_BUILD // fred documentation/evaluation build
226 // #define FRENCH_BUILD // build for French (obsolete)
227 // #define GERMAN_BUILD // build for German (this is now used)
228 //#define RELEASE_REAL // this means that it is an actual release candidate, not just an optimized/release build
230 // uncomment this #define for DVD version (makes popups say DVD instead of CD 2 or whatever): JCF 5/10/2000
231 // #define DVD_MESSAGE_HACK
234 #if defined(MULTIPLAYER_BETA_BUILD) || defined(E3_BUILD) || defined(RELEASE_REAL)
235 #define GAME_CD_CHECK
241 #include "platform.h"
244 // value to represent an uninitialized state in any int or uint
245 #define UNINITIALIZED 0x7f8e6d9c
247 #if defined(DEMO) || defined(OEM_BUILD) // no change for FS2_DEMO
248 #define MAX_PLAYERS 1
250 #define MAX_PLAYERS 12
255 #define USE_INLINE_ASM 1 // Define this to use inline assembly
260 typedef Uint16 ushort;
262 typedef Sint32 fs_time_t; // forced 32-bit version of time_t - **don't use this unless required**
264 // ptr_? is a value matching the size of a pointer on this specific platform
265 #if ( defined(__x86_64__) || defined(_WIN64) )
266 typedef Sint64 ptr_s;
267 typedef Uint64 ptr_u;
269 typedef Sint32 ptr_s;
270 typedef Uint32 ptr_u;
273 //Stucture to store clipping codes in a word
274 typedef struct ccodes {
275 ubyte vor,vand; //or is low byte, and is high byte
278 typedef struct vector {
287 // A vector referenced as an array
288 typedef struct vectora {
292 typedef struct angles {
296 typedef struct matrix {
299 vector rvec, uvec, fvec;
306 typedef struct uv_pair {
310 // Used to store rotated points for mines.
311 // Has flag to indicate if projected.
312 typedef struct vertex {
313 float x, y, z; // world space position
314 float sx, sy, sw; // screen space position (sw == 1/z)
315 float u, v; // texture position
316 ubyte r, g, b, a; // color. Use b for darkening;
317 ubyte codes; // what sides of view pyramid this point is on/off. 0 = Inside view pyramid.
318 ubyte flags; // Projection flags. Indicates whether it is projected or not or if projection overflowed.
319 ubyte pad[2]; // pad structure to be 4 byte aligned.
321 vertex() : x(0.0f), y(0.0f), z(0.0f), sx(0.0f), sy(0.0f), sw(0.0f), u(0.0f),
322 v(0.0f), r(0), g(0), b(0), a(0), codes(0), flags(0)
327 #define BMP_AABITMAP (1<<0) // antialiased bitmap
328 #define BMP_TEX_XPARENT (1<<1) // transparent texture
329 #define BMP_TEX_OTHER (1<<2) // so we can identify all "normal" textures
332 #define BMP_TEX_ANY ( BMP_TEX_XPARENT | BMP_TEX_OTHER )
334 // max res == 1024x768. max texture size == 256
335 #define MAX_BMAP_SECTIONS_X 4
336 #define MAX_BMAP_SECTIONS_Y 3
337 #define MAX_BMAP_SECTION_SIZE 256
338 typedef struct bitmap_section_info {
339 ushort sx[MAX_BMAP_SECTIONS_X]; // x offset of each section
340 ushort sy[MAX_BMAP_SECTIONS_Y]; // y offset of each section
342 ubyte num_x, num_y; // number of x and y sections
343 } bitmap_section_info;
345 typedef struct bitmap {
346 short w, h; // Width and height
347 short rowsize; // What you need to add to go to next row
348 ubyte bpp; // How many bits per pixel it is. (7,8,15,16,24,32)
349 ubyte flags; // See the BMP_???? defines for values
350 ptr_u data; // Pointer to data, or maybe offset into VRAM.
351 ubyte *palette; // If bpp==8, this is pointer to palette. If the BMP_NO_PALETTE_MAP flag
352 // is not set, this palette just points to the screen palette. (gr_palette)
354 bitmap_section_info sections;
357 //This are defined in MainWin.c
358 extern void __cdecl Error( const char * filename, int line, const char * format, ... );
359 extern void __cdecl Warning( const char * filename, int line, const char * format, ... );
363 // To debug printf do this:
364 // mprintf(( "Error opening %s\n", filename ));
366 #define mprintf(args) outwnd_printf2 args
367 #define nprintf(args) outwnd_printf args
369 #define mprintf(args)
370 #define nprintf(args)
373 #define LOCATION __FILE__,__LINE__
375 // To flag an error, you can do this:
376 // Error( __FILE__, __LINE__, "Error opening %s", filename );
378 // Error( LOCATION, "Error opening %s", filename );
381 #define STUB_FUNCTION
383 void gr_activate(int);
384 #define STUB_FUNCTION mprintf(("STUB: %s at %s, line %d\n", __FUNCTION__, LOCATION))
387 //#define Int3() _asm { int 3 }
390 // Interplay QA version of Int3
391 #define Int3() do { } while (0)
393 // define to call from Warning function above since it calls Int3, so without this, we
394 // get put into infinite dialog boxes
395 #define AsmInt3() _asm { int 3 }
399 // No debug version of Int3
400 #define Int3() do { } while (0)
404 // Debug version of Int3
405 #define Int3() debug_int3()
406 #endif // NDEBUG && DEMO
407 #endif // INTERPLAYQA
409 #define PI 3.141592654f
410 #define PI2 (3.141592654f*2.0f) // PI*2
411 #define ANG_TO_RAD(x) ((x)*PI/180)
414 extern int Fred_running; // Is Fred running, or FreeSpace?
415 extern int Pofview_running;
416 extern int Nebedit_running;
417 extern int Fonttool_running;
420 //======================================================================================
421 //====== D E B U G C O N S O L E S T U F F ========================
422 //======================================================================================
424 // Here is a a sample command to toggle something that would
425 // be called by doing "toggle it" from the debug console command window/
428 DCF(toggle_it,"description")
431 This_var = !This_var;
435 dc_printf( "Usage: sample\nToggles This_var on/off.\n" );
439 dc_printf( "The status is %d.\n", This_var );
443 class debug_command {
448 debug_command(const char *name, const char *help, void (*func)()); // constructor
451 #define DCF(function_name,help_text) \
452 void dcf_##function_name(); \
453 debug_command dc_##function_name(#function_name,help_text,dcf_##function_name); \
454 void dcf_##function_name()
456 // Starts the debug console
457 extern void debug_console( void (*func)() = NULL );
459 // The next three variables tell your function what to do. It should
460 // only change something if the dc_command is set. A minimal function
461 // needs to process the dc_command. Usually, these will be called in
462 // these combinations:
463 // dc_command=true, dc_status=true means process it and show status
464 // dc_help=true means show help only
465 // dc_status=true means show status only
466 // I would recommend doing this in each function:
467 // if (dc_command) { process command }
468 // if (dc_help) { print out help }
469 // if (dc_status) { print out status }
470 // with the last two being optional
472 extern int Dc_command; // If this is set, then process the command
473 extern int Dc_help; // If this is set, then print out the help text in the form, "usage: ... \nLong description\n" );
474 extern int Dc_status; // If this is set, then print out the current status of the command.
476 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.
477 extern char *Dc_arg; // The (lowercased) string value of the argument retrieved from dc_arg
478 extern char *Dc_arg_org; // Dc_arg before it got converted to lowercase
479 extern uint Dc_arg_type; // The type of dc_arg.
480 extern const char *Dc_command_line; // The rest of the command line, from the end of the last processed arg on.
481 extern int Dc_arg_int; // If Dc_arg_type & ARG_INT or ARG_HEX is set, then this is the value
482 extern float Dc_arg_float; // If Dc_arg_type & ARG_FLOAT is set, then this is the value
484 // Outputs text to the console
485 void dc_printf( const char *format, ... );
487 // Each dc_arg_type can have one or more of these flags set.
488 // This is because some things can fit into two catagories.
489 // Like 1 can be an integer, a float, a string, or a true boolean
491 #define ARG_NONE (1<<0) // no argument
492 #define ARG_ANY 0xFFFFFFFF // Anything.
493 #define ARG_STRING (1<<1) // any valid string
494 #define ARG_QUOTE (1<<2) // a quoted string
495 #define ARG_INT (1<<3) // a valid integer
496 #define ARG_FLOAT (1<<4) // a valid floating point number
498 // some specific commonly used predefined types. Can add up to (1<<31)
499 #define ARG_HEX (1<<5) // a valid hexadecimal integer. Note that ARG_INT will always be set also in this case.
500 #define ARG_TRUE (1<<6) // on, true, non-zero number
501 #define ARG_FALSE (1<<7) // off, false, zero
502 #define ARG_PLUS (1<<8) // Plus sign
503 #define ARG_MINUS (1<<9) // Minus sign
504 #define ARG_COMMA (1<<10) // a comma
506 // A shortcut for boolean only variables.
508 // DCF_BOOL( lighting, Show_lighting )
510 #define DCF_BOOL( function_name, bool_variable ) \
511 void dcf_##function_name(); \
512 debug_command dc_##function_name(#function_name,"Toggles "#bool_variable,dcf_##function_name ); \
513 void dcf_##function_name() { \
514 if ( Dc_command ) { \
515 dc_get_arg(ARG_TRUE|ARG_FALSE|ARG_NONE); \
516 if ( Dc_arg_type & ARG_TRUE ) bool_variable = 1; \
517 else if ( Dc_arg_type & ARG_FALSE ) bool_variable = 0; \
518 else if ( Dc_arg_type & ARG_NONE ) bool_variable ^= 1; \
520 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 ); \
521 if ( Dc_status ) dc_printf( "%s is %s\n", #function_name, (bool_variable?"TRUE":"FALSE") ); \
525 //======================================================================================
526 //======================================================================================
527 //======================================================================================
530 #include "floating.h"
532 // Some constants for stuff
533 #define MAX_FILENAME_LEN 32 // Length for filenames, ie "title.pcx"
534 #define MAX_PATH_LEN 256 // Length for pathnames, ie "c:\bitmaps\title.pcx"
536 // contants and defined for byteswapping routines (useful for mac)
538 #define INTEL_INT(x) SDL_SwapLE32(x)
539 #define INTEL_SHORT(x) SDL_SwapLE16(x)
540 #define INTEL_FLOAT(x) SDL_SwapFloatLE(x)
545 #define MY_RAND_MAX 0x7fff
550 // Callback Loading function.
551 // If you pass a function to this, that function will get called
552 // around 10x per second, so you can update the screen.
553 // Pass NULL to turn it off.
554 // Call this with the name of a function. That function will
555 // then get called around 10x per second. The callback function
556 // gets passed a 'count' which is how many times game_busy has
557 // been called since the callback was set. It gets called
558 // one last time with count=-1 when you turn off the callback
559 // by calling game_busy_callback(NULL). Game_busy_callback
560 // returns the current count, so you can tell how many times
561 // game_busy got called.
562 // If delta_step is above 0, then it will also make sure it
563 // calls the callback each time count steps 'delta_step' even
564 // if 1/10th of a second hasn't elapsed.
565 extern int game_busy_callback( void (*callback)(int count), int delta_step = -1 );
567 // Call whenever loading to display cursor
568 extern void game_busy();
571 //=========================================================
572 // Functions to monitor performance
578 int value; // Value that gets cleared to 0 each frame.
579 int min, max, sum, cnt; // Min & Max of value. Sum is used to calculate average
580 monitor(const char *name); // constructor
583 // Creates a monitor variable
584 #define MONITOR(function_name) monitor mon_##function_name(#function_name)
586 // Increments a monitor variable
587 #define MONITOR_INC(function_name,inc) do { mon_##function_name.value+=(inc); } while(0)
589 // Call this once per frame to update monitor file
590 void monitor_update();
594 #define MONITOR(function_name)
596 #define MONITOR_INC(function_name,inc) do { } while(0)
598 // Call this once per frame to update monitor file
599 #define monitor_update() do { } while(0)
605 const char *XSTR(const char *str, int index);
607 // Caps V between MN and MX.
608 template <class T> void CAP( T& v, T mn, T mx )
612 } else if ( v > mx ) {
617 // ========================================================
618 // stamp checksum stuff
619 // ========================================================
621 // here is the define for the stamp for this set of code
622 #define STAMP_STRING "\001\001\001\001\002\002\002\002Read the Foundation Novels from Asimov. I liked them."
623 #define STAMP_STRING_LENGTH 80
624 #define DEFAULT_CHECKSUM_STRING "\001\001\001\001"
625 #define DEFAULT_TIME_STRING "\002\002\002\002"
627 // macro to calculate the checksum for the stamp. Put here so that we can use different methods
628 // for different applications. Requires the local variable 'checksum' to be defined!!!
629 #define CALCULATE_STAMP_CHECKSUM() do { \
633 for ( i = 0; i < (int)strlen(ptr); i++ ) { \
635 checksum += ptr[i]; \
636 if ( checksum & 0x01 ) \
638 checksum = checksum >> 1; \
640 checksum |= 0x80000000; \
642 checksum |= 0x80000000; \
645 //=========================================================
646 // Memory management functions
647 //=========================================================
652 // Returns 0 if not enough RAM.
653 int vm_init(int min_heap_size);
655 // Allocates some RAM.
656 void *vm_malloc( int size, const char *filename=NULL, int line=-1 );
659 char *vm_strdup( const char *ptr, const char *filename, int line );
662 void vm_free( void *ptr, const char *filename=NULL, int line=-1 );
667 // Easy to use macros
668 #define VM_MALLOC(size) vm_malloc((size),__FILE__,__LINE__)
669 #define VM_FREE(ptr) vm_free((ptr),__FILE__,__LINE__)
671 #define malloc(size) vm_malloc((size),__FILE__,__LINE__)
672 #define free(ptr) vm_free((ptr),__FILE__,__LINE__)
673 #define strdup(ptr) vm_strdup((ptr),__FILE__,__LINE__)
678 // Returns 0 if not enough RAM.
679 int vm_init(int min_heap_size);
681 // Allocates some RAM.
682 void *vm_malloc( int size );
685 char *vm_strdup( const char *ptr );
688 void vm_free( void *ptr );
693 // Easy to use macros
694 #define VM_MALLOC(size) vm_malloc(size)
695 #define VM_FREE(ptr) vm_free(ptr)
697 #define malloc(size) vm_malloc(size)
698 #define free(ptr) vm_free(ptr)
699 #define strdup(ptr) vm_strdup(ptr)