1 // SONIC ROBO BLAST 2
2 //-----------------------------------------------------------------------------
3 // Copyright (C) 1993-1996 by id Software, Inc.
4 // Copyright (C) 1998-2000 by DooM Legacy Team.
5 // Copyright (C) 1999-2020 by Sonic Team Junior.
6 //
7 // This program is free software distributed under the
8 // terms of the GNU General Public License, version 2.
9 // See the 'LICENSE' file for more details.
10 //-----------------------------------------------------------------------------
11 /// \file  doomdef.h
12 /// \brief Internally used data structures for virtually everything,
13 ///        key definitions, lots of other stuff.
14 
15 #ifndef __DOOMDEF__
16 #define __DOOMDEF__
17 
18 // Sound system select
19 // This should actually be in the makefile,
20 // but I can't stand that gibberish. D:
21 #define SOUND_DUMMY   0
22 #define SOUND_SDL     1
23 #define SOUND_MIXER   2
24 #define SOUND_FMOD    3
25 
26 #ifndef SOUND
27 #ifdef HAVE_SDL
28 
29 // Use Mixer interface?
30 #ifdef HAVE_MIXER
31     #define SOUND SOUND_MIXER
32     #ifdef HW3SOUND
33     #undef HW3SOUND
34     #endif
35 #endif
36 
37 // Use generic SDL interface.
38 #ifndef SOUND
39 #define SOUND SOUND_SDL
40 #endif
41 
42 #else // No SDL.
43 
44 // Use FMOD?
45 #ifdef HAVE_FMOD
46     #define SOUND SOUND_FMOD
47     #ifdef HW3SOUND
48     #undef HW3SOUND
49     #endif
50 #else
51     // No more interfaces. :(
52     #define SOUND SOUND_DUMMY
53 #endif
54 
55 #endif
56 #endif
57 
58 #ifdef _WINDOWS
59 #define NONET
60 #if !defined (HWRENDER) && !defined (NOHW)
61 #define HWRENDER
62 #endif
63 #endif
64 
65 #ifdef _WIN32
66 #define ASMCALL __cdecl
67 #else
68 #define ASMCALL
69 #endif
70 
71 #ifdef _MSC_VER
72 #pragma warning(disable : 4127 4152 4213 4514)
73 #ifdef _WIN64
74 #pragma warning(disable : 4306)
75 #endif
76 #endif
77 // warning level 4
78 // warning C4127: conditional expression is constant
79 // warning C4152: nonstandard extension, function/data pointer conversion in expression
80 // warning C4213: nonstandard extension used : cast on l-value
81 
82 
83 #include "version.h"
84 #include "doomtype.h"
85 
86 #include <stdarg.h>
87 #include <stdio.h>
88 #include <stdlib.h>
89 #include <string.h>
90 
91 #define _USE_MATH_DEFINES // fixes M_PI errors in r_plane.c for Visual Studio
92 #include <math.h>
93 
94 #ifdef GETTEXT
95 #include <libintl.h>
96 #endif
97 #include <locale.h> // locale should not be dependent on GETTEXT -- 11/01/20 Monster Iestyn
98 
99 #include <sys/types.h>
100 #include <sys/stat.h>
101 #include <ctype.h>
102 
103 #if defined (_WIN32) || defined (__DJGPP__)
104 #include <io.h>
105 #endif
106 
107 //#define NOMD5
108 
109 // Uncheck this to compile debugging code
110 //#define RANGECHECK
111 //#ifndef PARANOIA
112 //#define PARANOIA // do some tests that never fail but maybe
113 // turn this on by make etc.. DEBUGMODE = 1 or use the Debug profile in the VC++ projects
114 //#endif
115 #if defined (_WIN32) || (defined (__unix__) && !defined (MSDOS)) || defined(__APPLE__) || defined (UNIXCOMMON) || defined (macintosh)
116 #define LOGMESSAGES // write message in log.txt
117 #endif
118 
119 #ifdef LOGMESSAGES
120 extern FILE *logstream;
121 extern char logfilename[1024];
122 #endif
123 
124 /* A mod name to further distinguish versions. */
125 #define SRB2APPLICATION "SRB2"
126 
127 //#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3
128 #ifdef DEVELOP
129 #define VERSIONSTRING "Development EXE"
130 // most interface strings are ignored in development mode.
131 // we use comprevision and compbranch instead.
132 // VERSIONSTRING_RC is for the resource-definition script used by windows builds
133 #else
134 #ifdef BETAVERSION
135 #define VERSIONSTRING "v"SRB2VERSION" "BETAVERSION
136 #define VERSIONSTRING_RC SRB2VERSION " " BETAVERSION "\0"
137 #else
138 #define VERSIONSTRING "v"SRB2VERSION
139 #define VERSIONSTRING_RC SRB2VERSION "\0"
140 #endif
141 // Hey! If you change this, add 1 to the MODVERSION below!
142 // Otherwise we can't force updates!
143 #endif
144 
145 #define VERSIONSTRINGW WSTRING (VERSIONSTRING)
146 
147 /* A custom URL protocol for server links. */
148 #define SERVER_URL_PROTOCOL "srb2://"
149 
150 // Does this version require an added patch file?
151 // Comment or uncomment this as necessary.
152 #define USE_PATCH_DTA
153 
154 // Use .kart extension addons
155 //#define USE_KART
156 
157 // Modification options
158 // If you want to take advantage of the Master Server's ability to force clients to update
159 // to the latest version, fill these out.  Otherwise, just comment out UPDATE_ALERT and leave
160 // the other options the same.
161 
162 // Comment out this line to completely disable update alerts (recommended for testing, but not for release)
163 #ifndef BETAVERSION
164 #define UPDATE_ALERT
165 #endif
166 
167 // The string used in the alert that pops up in the event of an update being available.
168 // Please change to apply to your modification (we don't want everyone asking where your mod is on SRB2.org!).
169 #define UPDATE_ALERT_STRING \
170 "A new update is available for SRB2.\n"\
171 "Please visit SRB2.org to download it.\n"\
172 "\n"\
173 "You are using version: %s\n"\
174 "The newest version is: %s\n"\
175 "\n"\
176 "This update is required for online\n"\
177 "play using the Master Server.\n"\
178 "You will not be able to connect to\n"\
179 "the Master Server until you update to\n"\
180 "the newest version of the game.\n"\
181 "\n"\
182 "(Press a key)\n"
183 
184 // The string used in the I_Error alert upon trying to host through command line parameters.
185 // Generally less filled with newlines, since Windows gives you lots more room to work with.
186 #define UPDATE_ALERT_STRING_CONSOLE \
187 "A new update is available for SRB2.\n"\
188 "Please visit SRB2.org to download it.\n"\
189 "\n"\
190 "You are using version: %s\n"\
191 "The newest version is: %s\n"\
192 "\n"\
193 "This update is required for online play using the Master Server.\n"\
194 "You will not be able to connect to the Master Server\n"\
195 "until you update to the newest version of the game.\n"
196 
197 // For future use, the codebase is the version of SRB2 that the modification is based on,
198 // and should not be changed unless you have merged changes between versions of SRB2
199 // (such as 2.0.4 to 2.0.5, etc) into your working copy.
200 // Will always resemble the versionstring, 205 = 2.0.5, 210 = 2.1, etc.
201 #define CODEBASE 220
202 
203 // To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
204 // Increment MINOREXECVERSION whenever a config change is needed that does not correspond
205 // to an increment in MODVERSION. This might never happen in practice.
206 // If MODVERSION increases, set MINOREXECVERSION to 0.
207 #define MAJOREXECVERSION MODVERSION
208 #define MINOREXECVERSION 0
209 // (It would have been nice to use VERSION and SUBVERSION but those are zero'd out for DEVELOP builds)
210 
211 // Macros
212 #define GETMAJOREXECVERSION(v) (v & 0xFFFF)
213 #define GETMINOREXECVERSION(v) (v >> 16)
214 #define GETEXECVERSION(major,minor) (major + (minor << 16))
215 #define EXECVERSION GETEXECVERSION(MAJOREXECVERSION, MINOREXECVERSION)
216 
217 // =========================================================================
218 
219 // The maximum number of players, multiplayer/networking.
220 // NOTE: it needs more than this to increase the number of players...
221 
222 #define MAXPLAYERS 32
223 #define MAXSKINS 32
224 #define PLAYERSMASK (MAXPLAYERS-1)
225 #define MAXPLAYERNAME 21
226 
227 #define COLORRAMPSIZE 16
228 #define MAXCOLORNAME 32
229 #define NUMCOLORFREESLOTS 1024
230 
231 typedef struct skincolor_s
232 {
233 	char name[MAXCOLORNAME+1];  // Skincolor name
234 	UINT8 ramp[COLORRAMPSIZE];  // Colormap ramp
235 	UINT16 invcolor;            // Signpost color
236 	UINT8 invshade;             // Signpost color shade
237 	UINT16 chatcolor;           // Chat color
238 	boolean accessible;         // Accessible by the color command + setup menu
239 } skincolor_t;
240 
241 typedef enum
242 {
243 	SKINCOLOR_NONE = 0,
244 
245 	// Greyscale ranges
246 	SKINCOLOR_WHITE,
247 	SKINCOLOR_BONE,
248 	SKINCOLOR_CLOUDY,
249 	SKINCOLOR_GREY,
250 	SKINCOLOR_SILVER,
251 	SKINCOLOR_CARBON,
252 	SKINCOLOR_JET,
253 	SKINCOLOR_BLACK,
254 
255 	// Desaturated
256 	SKINCOLOR_AETHER,
257 	SKINCOLOR_SLATE,
258 	SKINCOLOR_BLUEBELL,
259 	SKINCOLOR_PINK,
260 	SKINCOLOR_YOGURT,
261 	SKINCOLOR_BROWN,
262 	SKINCOLOR_BRONZE,
263 	SKINCOLOR_TAN,
264 	SKINCOLOR_BEIGE,
265 	SKINCOLOR_MOSS,
266 	SKINCOLOR_AZURE,
267 	SKINCOLOR_LAVENDER,
268 
269 	// Viv's vivid colours (toast 21/07/17)
270 	SKINCOLOR_RUBY,
271 	SKINCOLOR_SALMON,
272 	SKINCOLOR_RED,
273 	SKINCOLOR_CRIMSON,
274 	SKINCOLOR_FLAME,
275 	SKINCOLOR_KETCHUP,
276 	SKINCOLOR_PEACHY,
277 	SKINCOLOR_QUAIL,
278 	SKINCOLOR_SUNSET,
279 	SKINCOLOR_COPPER,
280 	SKINCOLOR_APRICOT,
281 	SKINCOLOR_ORANGE,
282 	SKINCOLOR_RUST,
283 	SKINCOLOR_GOLD,
284 	SKINCOLOR_SANDY,
285 	SKINCOLOR_YELLOW,
286 	SKINCOLOR_OLIVE,
287 	SKINCOLOR_LIME,
288 	SKINCOLOR_PERIDOT,
289 	SKINCOLOR_APPLE,
290 	SKINCOLOR_GREEN,
291 	SKINCOLOR_FOREST,
292 	SKINCOLOR_EMERALD,
293 	SKINCOLOR_MINT,
294 	SKINCOLOR_SEAFOAM,
295 	SKINCOLOR_AQUA,
296 	SKINCOLOR_TEAL,
297 	SKINCOLOR_WAVE,
298 	SKINCOLOR_CYAN,
299 	SKINCOLOR_SKY,
300 	SKINCOLOR_CERULEAN,
301 	SKINCOLOR_ICY,
302 	SKINCOLOR_SAPPHIRE, // sweet mother, i cannot weave – slender aphrodite has overcome me with longing for a girl
303 	SKINCOLOR_CORNFLOWER,
304 	SKINCOLOR_BLUE,
305 	SKINCOLOR_COBALT,
306 	SKINCOLOR_VAPOR,
307 	SKINCOLOR_DUSK,
308 	SKINCOLOR_PASTEL,
309 	SKINCOLOR_PURPLE,
310 	SKINCOLOR_BUBBLEGUM,
311 	SKINCOLOR_MAGENTA,
312 	SKINCOLOR_NEON,
313 	SKINCOLOR_VIOLET,
314 	SKINCOLOR_LILAC,
315 	SKINCOLOR_PLUM,
316 	SKINCOLOR_RASPBERRY,
317 	SKINCOLOR_ROSY,
318 
319 	FIRSTSUPERCOLOR,
320 
321 	// Super special awesome Super flashing colors!
322 	SKINCOLOR_SUPERSILVER1 = FIRSTSUPERCOLOR,
323 	SKINCOLOR_SUPERSILVER2,
324 	SKINCOLOR_SUPERSILVER3,
325 	SKINCOLOR_SUPERSILVER4,
326 	SKINCOLOR_SUPERSILVER5,
327 
328 	SKINCOLOR_SUPERRED1,
329 	SKINCOLOR_SUPERRED2,
330 	SKINCOLOR_SUPERRED3,
331 	SKINCOLOR_SUPERRED4,
332 	SKINCOLOR_SUPERRED5,
333 
334 	SKINCOLOR_SUPERORANGE1,
335 	SKINCOLOR_SUPERORANGE2,
336 	SKINCOLOR_SUPERORANGE3,
337 	SKINCOLOR_SUPERORANGE4,
338 	SKINCOLOR_SUPERORANGE5,
339 
340 	SKINCOLOR_SUPERGOLD1,
341 	SKINCOLOR_SUPERGOLD2,
342 	SKINCOLOR_SUPERGOLD3,
343 	SKINCOLOR_SUPERGOLD4,
344 	SKINCOLOR_SUPERGOLD5,
345 
346 	SKINCOLOR_SUPERPERIDOT1,
347 	SKINCOLOR_SUPERPERIDOT2,
348 	SKINCOLOR_SUPERPERIDOT3,
349 	SKINCOLOR_SUPERPERIDOT4,
350 	SKINCOLOR_SUPERPERIDOT5,
351 
352 	SKINCOLOR_SUPERSKY1,
353 	SKINCOLOR_SUPERSKY2,
354 	SKINCOLOR_SUPERSKY3,
355 	SKINCOLOR_SUPERSKY4,
356 	SKINCOLOR_SUPERSKY5,
357 
358 	SKINCOLOR_SUPERPURPLE1,
359 	SKINCOLOR_SUPERPURPLE2,
360 	SKINCOLOR_SUPERPURPLE3,
361 	SKINCOLOR_SUPERPURPLE4,
362 	SKINCOLOR_SUPERPURPLE5,
363 
364 	SKINCOLOR_SUPERRUST1,
365 	SKINCOLOR_SUPERRUST2,
366 	SKINCOLOR_SUPERRUST3,
367 	SKINCOLOR_SUPERRUST4,
368 	SKINCOLOR_SUPERRUST5,
369 
370 	SKINCOLOR_SUPERTAN1,
371 	SKINCOLOR_SUPERTAN2,
372 	SKINCOLOR_SUPERTAN3,
373 	SKINCOLOR_SUPERTAN4,
374 	SKINCOLOR_SUPERTAN5,
375 
376 	SKINCOLOR_FIRSTFREESLOT,
377 	SKINCOLOR_LASTFREESLOT = SKINCOLOR_FIRSTFREESLOT + NUMCOLORFREESLOTS - 1,
378 
379 	MAXSKINCOLORS,
380 
381 	NUMSUPERCOLORS = ((SKINCOLOR_FIRSTFREESLOT - FIRSTSUPERCOLOR)/5)
382 } skincolornum_t;
383 
384 extern UINT16 numskincolors;
385 
386 extern skincolor_t skincolors[MAXSKINCOLORS];
387 
388 // State updates, number of tics / second.
389 // NOTE: used to setup the timer rate, see I_StartupTimer().
390 #define TICRATE 35
391 #define NEWTICRATERATIO 1 // try 4 for 140 fps :)
392 #define NEWTICRATE (TICRATE*NEWTICRATERATIO)
393 
394 #define MUSICRATE 1000 // sound timing is calculated by milliseconds
395 
396 #define RING_DIST 512*FRACUNIT // how close you need to be to a ring to attract it
397 
398 #define PUSHACCEL (2*FRACUNIT) // Acceleration for MF2_SLIDEPUSH items.
399 
400 // Special linedef executor tag numbers!
401 enum {
402 	LE_PINCHPHASE      =    -2, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!)
403 	LE_ALLBOSSESDEAD   =    -3, // All bosses in the map are dead (Egg capsule raise)
404 	LE_BOSSDEAD        =    -4, // A boss in the map died (Chaos mode boss tally)
405 	LE_BOSS4DROP       =    -5, // CEZ boss dropped its cage (also subtract the number of hitpoints it's lost)
406 	LE_BRAKVILEATACK   =    -6, // Brak's doing his LOS attack, oh noes
407 	LE_TURRET          = 32000, // THZ turret
408 	LE_BRAKPLATFORM    =  4200, // v2.0 Black Eggman destroys platform
409 	LE_CAPSULE2        =   682, // Egg Capsule
410 	LE_CAPSULE1        =   681, // Egg Capsule
411 	LE_CAPSULE0        =   680, // Egg Capsule
412 	LE_KOOPA           =   650, // Distant cousin to Gay Bowser
413 	LE_AXE             =   649, // MKB Axe object
414 	LE_PARAMWIDTH      =  -100  // If an object that calls LinedefExecute has a nonzero parameter value, this times the parameter will be subtracted. (Mostly for the purpose of coexisting bosses...)
415 };
416 
417 // Name of local directory for config files and savegames
418 #if (((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON)) && !defined (__CYGWIN__)) && !defined (__APPLE__)
419 #define DEFAULTDIR ".srb2"
420 #else
421 #define DEFAULTDIR "srb2"
422 #endif
423 
424 #include "g_state.h"
425 
426 // commonly used routines - moved here for include convenience
427 
428 /**	\brief	The I_Error function
429 
430 	\param	error	the error message
431 
432 	\return	void
433 
434 
435 */
436 void I_Error(const char *error, ...) FUNCIERROR;
437 
438 /**	\brief	write a message to stderr (use before I_Quit) for when you need to quit with a msg, but need
439  the return code 0 of I_Quit();
440 
441 	\param	error	message string
442 
443 	\return	void
444 */
445 void I_OutputMsg(const char *error, ...) FUNCPRINTF;
446 
447 // console.h
448 typedef enum
449 {
450 	CONS_NOTICE,
451 	CONS_WARNING,
452 	CONS_ERROR
453 } alerttype_t;
454 
455 void CONS_Printf(const char *fmt, ...) FUNCPRINTF;
456 void CONS_Alert(alerttype_t level, const char *fmt, ...) FUNCDEBUG;
457 void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG;
458 
459 // For help debugging functions.
460 #define POTENTIALLYUNUSED CONS_Alert(CONS_WARNING, "(%s:%d) Unused code appears to be used.\n", __FILE__, __LINE__)
461 
462 #include "m_swap.h"
463 
464 // Things that used to be in dstrings.h
465 #define SAVEGAMENAME "srb2sav"
466 extern char savegamename[256];
467 extern char liveeventbackup[256];
468 
469 // m_misc.h
470 #ifdef GETTEXT
471 #define M_GetText(String) gettext(String)
472 #else
473 // If no translations are to be used, make a stub
474 // M_GetText function that just returns the string.
475 #define M_GetText(x) (x)
476 #endif
477 void M_StartupLocale(void);
478 extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL;
479 char *va(const char *format, ...) FUNCPRINTF;
480 char *M_GetToken(const char *inputString);
481 void M_UnGetToken(void);
482 UINT32 M_GetTokenPos(void);
483 void M_SetTokenPos(UINT32 newPos);
484 char *sizeu1(size_t num);
485 char *sizeu2(size_t num);
486 char *sizeu3(size_t num);
487 char *sizeu4(size_t num);
488 char *sizeu5(size_t num);
489 
490 // d_main.c
491 extern int    VERSION;
492 extern int SUBVERSION;
493 extern boolean devparm; // development mode (-debug)
494 // d_netcmd.c
495 extern INT32 cv_debug;
496 
497 #define DBG_BASIC       0x0001
498 #define DBG_DETAILED    0x0002
499 #define DBG_PLAYER      0x0004
500 #define DBG_RENDER      0x0008
501 #define DBG_NIGHTSBASIC 0x0010
502 #define DBG_NIGHTS      0x0020
503 #define DBG_POLYOBJ     0x0040
504 #define DBG_GAMELOGIC   0x0080
505 #define DBG_NETPLAY     0x0100
506 #define DBG_MEMORY      0x0200
507 #define DBG_SETUP       0x0400
508 #define DBG_LUA         0x0800
509 #define DBG_RANDOMIZER  0x1000
510 #define DBG_VIEWMORPH   0x2000
511 
512 // =======================
513 // Misc stuff for later...
514 // =======================
515 
516 #define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
517 
518 // Modifier key variables, accessible anywhere
519 extern UINT8 shiftdown, ctrldown, altdown;
520 extern boolean capslock;
521 
522 // if we ever make our alloc stuff...
523 #define ZZ_Alloc(x) Z_Malloc(x, PU_STATIC, NULL)
524 #define ZZ_Calloc(x) Z_Calloc(x, PU_STATIC, NULL)
525 
526 // i_system.c, replace getchar() once the keyboard has been appropriated
527 INT32 I_GetKey(void);
528 
529 #ifndef min // Double-Check with WATTCP-32's cdefs.h
530 #define min(x, y) (((x) < (y)) ? (x) : (y))
531 #endif
532 #ifndef max // Double-Check with WATTCP-32's cdefs.h
533 #define max(x, y) (((x) > (y)) ? (x) : (y))
534 #endif
535 
536 // Max gamepad/joysticks that can be detected/used.
537 #define MAX_JOYSTICKS 4
538 
539 #ifndef M_PIl
540 #define M_PIl 3.1415926535897932384626433832795029L
541 #endif
542 
543 // Floating point comparison epsilons from float.h
544 #ifndef FLT_EPSILON
545 #define FLT_EPSILON 1.1920928955078125e-7f
546 #endif
547 
548 #ifndef DBL_EPSILON
549 #define DBL_EPSILON 2.2204460492503131e-16l
550 #endif
551 
552 // An assert-type mechanism.
553 #ifdef PARANOIA
554 #define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
555 #else
556 #define I_Assert(e) ((void)0)
557 #endif
558 
559 // The character that separates pathnames. Forward slash on
560 // most systems, but reverse solidus (\) on Windows.
561 #if defined (_WIN32)
562 	#define PATHSEP "\\"
563 #else
564 	#define PATHSEP "/"
565 #endif
566 
567 #define PUNCTUATION "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
568 
569 // Compile date and time and revision.
570 extern const char *compdate, *comptime, *comprevision, *compbranch;
571 
572 // Disabled code and code under testing
573 // None of these that are disabled in the normal build are guaranteed to work perfectly
574 // Compile them at your own risk!
575 
576 ///	Allows the use of devmode in multiplayer. AKA "fishcake"
577 //#define NETGAME_DEVMODE
578 
579 ///	Allows gravity changes in netgames, no questions asked.
580 //#define NETGAME_GRAVITY
581 
582 ///	Dumps the contents of a network save game upon consistency failure for debugging.
583 //#define DUMPCONSISTENCY
584 
585 ///	Who put weights on my recycler?  ... Inuyasha did.
586 ///	\note	XMOD port.
587 //#define WEIGHTEDRECYCLER
588 
589 ///	Allow loading of savegames between different versions of the game.
590 ///	\note	XMOD port.
591 ///	    	Most modifications should probably enable this.
592 //#define SAVEGAME_OTHERVERSIONS
593 
594 ///	Shuffle's incomplete OpenGL sorting code.
595 #define SHUFFLE // This has nothing to do with sorting, why was it disabled?
596 
597 ///	Allow the use of the SOC RESETINFO command.
598 ///	\note	Builds that are tight on memory should disable this.
599 ///	    	This stops the game from storing backups of the states, sprites, and mobjinfo tables.
600 ///	    	Though this info is compressed under normal circumstances, it's still a lot of extra
601 ///	    	memory that never gets touched.
602 #define ALLOW_RESETDATA
603 
604 /// Experimental tweaks to analog mode. (Needs a lot of work before it's ready for primetime.)
605 //#define REDSANALOG
606 
607 /// Backwards compatibility with musicslots.
608 /// \note	You should leave this enabled unless you're working with a future SRB2 version.
609 #define MUSICSLOT_COMPATIBILITY
610 
611 /// Experimental attempts at preventing MF_PAPERCOLLISION objects from getting stuck in walls.
612 //#define PAPER_COLLISIONCORRECTION
613 
614 /// FINALLY some real clipping that doesn't make walls dissappear AND speeds the game up
615 /// (that was the original comment from SRB2CB, sadly it is a lie and actually slows game down)
616 /// on the bright side it fixes some weird issues with translucent walls
617 /// \note	SRB2CB port.
618 ///      	SRB2CB itself ported this from PrBoom+
619 #define NEWCLIP
620 
621 /// OpenGL shaders
622 #define GL_SHADERS
623 
624 /// Handle touching sector specials in P_PlayerAfterThink instead of P_PlayerThink.
625 /// \note   Required for proper collision with moving sloped surfaces that have sector specials on them.
626 #define SECTORSPECIALSAFTERTHINK
627 
628 /// Sprite rotation
629 #define ROTSPRITE
630 #define ROTANGLES 72 // Needs to be a divisor of 360 (45, 60, 90, 120...)
631 #define ROTANGDIFF (360 / ROTANGLES)
632 
633 /// PNG support
634 #ifndef HAVE_PNG
635 #define NO_PNG_LUMPS
636 #endif
637 
638 /// Render flats on walls
639 #define WALLFLATS
640 
641 /// Maintain compatibility with older 2.2 demos
642 #define OLD22DEMOCOMPAT
643 
644 #if defined (HAVE_CURL) && ! defined (NONET)
645 #define MASTERSERVER
646 #else
647 #undef UPDATE_ALERT
648 #endif
649 
650 #endif // __DOOMDEF__
651