From a91a40f18eb3a353025b21bf22599c30f65a1cd3 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Mon, 5 Oct 2009 20:25:53 +0000 Subject: Fix desync in ep1-0500.lmp on 64-bit (thanks exp(x)). Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1710 --- src/p_doors.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/p_doors.c b/src/p_doors.c index b681a8d0..89b65328 100644 --- a/src/p_doors.c +++ b/src/p_doors.c @@ -420,8 +420,41 @@ EV_VerticalDoor { if (!thing->player) return; // JDC: bad guys never close doors - - door->direction = -1; // start going down immediately + + // When is a door not a door? + // In Vanilla, door->direction is set, even though + // "specialdata" might not actually point at a door. + + if (door->thinker.function.acp1 == (actionf_p1) T_VerticalDoor) + { + door->direction = -1; // start going down immediately + } + else if (door->thinker.function.acp1 == (actionf_p1) T_PlatRaise) + { + // Erm, this is a plat, not a door. + // This notably causes a problem in ep1-0500.lmp where + // a plat and a door are cross-referenced; the door + // doesn't open on 64-bit. + // The direction field in vldoor_t corresponds to the wait + // field in plat_t. Let's set that to -1 instead. + + plat_t *plat; + + plat = (plat_t *) door; + plat->wait = -1; + } + else + { + // This isn't a door OR a plat. Now we're in trouble. + + fprintf(stderr, "EV_VerticalDoor: Tried to close " + "something that wasn't a door.\n"); + + // Try closing it anyway. At least it will work on 32-bit + // machines. + + door->direction = -1; + } } return; } -- cgit v1.2.3 From cc92d31eeaa40ae966196cfa5402474ffda0bbc7 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 10 Oct 2009 01:02:58 +0000 Subject: Don't crash when using the donut special type and the joining linedef is one sided (thanks Alexander Waldmann). Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1711 --- src/p_spec.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src') diff --git a/src/p_spec.c b/src/p_spec.c index 27042b5d..5bb6f19d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1199,6 +1199,24 @@ int EV_DoDonut(line_t* line) rtn = 1; s2 = getNextSector(s1->lines[0],s1); + + // Vanilla Doom does not check if the linedef is one sided. The + // game does not crash, but reads invalid memory and causes the + // sector floor to move "down" to some unknown height. + // DOSbox prints a warning about an invalid memory access. + // + // I'm not sure exactly what invalid memory is being read. This + // isn't something that should be done, anyway. + // Just print a warning and return. + + if (s2 == NULL) + { + fprintf(stderr, + "EV_DoDonut: linedef had no second sidedef! " + "Unexpected behavior may occur in Vanilla Doom. \n"); + break; + } + for (i = 0;i < s2->linecount;i++) { if ((!s2->lines[i]->flags & ML_TWOSIDED) || -- cgit v1.2.3 From a3ab0a6910f55c6f45a3f4eaf48b4a99c4e16e22 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 17 Oct 2009 19:29:46 +0000 Subject: Import donut overrun emulation code from PrBoom+ (Thanks entryway). Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1720 --- src/m_misc.c | 8 ++++ src/m_misc.h | 1 + src/p_spec.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 129 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/m_misc.c b/src/m_misc.c index acab0a5b..9a5fb84a 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -198,3 +198,11 @@ char *M_TempFile(char *s) return result; } +boolean M_StrToInt(const char *str, int *result) +{ + return sscanf(str, " 0x%x", result) == 1 + || sscanf(str, " 0X%x", result) == 1 + || sscanf(str, " 0%o", result) == 1 + || sscanf(str, " %d", result) == 1; +} + diff --git a/src/m_misc.h b/src/m_misc.h index 0fea7e92..0fe8e62e 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -39,6 +39,7 @@ void M_MakeDirectory(char *dir); char *M_TempFile(char *s); boolean M_FileExists(char *file); long M_FileLength(FILE *handle); +boolean M_StrToInt(const char *str, int *result); #endif diff --git a/src/p_spec.c b/src/p_spec.c index 5bb6f19d..37beb850 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -38,6 +38,7 @@ #include "i_system.h" #include "z_zone.h" #include "m_argv.h" +#include "m_misc.h" #include "m_random.h" #include "w_wad.h" @@ -1169,10 +1170,94 @@ void P_UpdateSpecials (void) memset(&buttonlist[i],0,sizeof(button_t)); } } - } +// +// Donut overrun emulation +// +// Derived from the code from PrBoom+. Thanks go to Andrey Budko (entryway) +// as usual :-) +// + +#define DONUT_FLOORHEIGHT_DEFAULT 0x00000000 +#define DONUT_FLOORPIC_DEFAULT 0x16 + +static void DonutOverrun(fixed_t *s3_floorheight, short *s3_floorpic, + line_t *line, sector_t *pillar_sector) +{ + static int first = 1; + static int tmp_s3_floorheight; + static int tmp_s3_floorpic; + + extern int numflats; + + if (first) + { + int p; + + // This is the first time we have had an overrun. + first = 0; + + // Default values + tmp_s3_floorheight = DONUT_FLOORHEIGHT_DEFAULT; + tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT; + + //! + // @category compat + // @arg + // + // Use the specified magic values when emulating behavior caused + // by memory overruns from improperly constructed donuts. + // In Vanilla Doom this can differ depending on the operating + // system. The default (if this option is not specified) is to + // emulate the behavior when running under Windows 98. + + p = M_CheckParm("-donut"); + + if (p > 0 && p < myargc - 2) + { + // Dump of needed memory: (fixed_t)0000:0000 and (short)0000:0008 + // + // C:\>debug + // -d 0:0 + // + // DOS 6.22: + // 0000:0000 (57 92 19 00) F4 06 70 00-(16 00) + // DOS 7.1: + // 0000:0000 (9E 0F C9 00) 65 04 70 00-(16 00) + // Win98: + // 0000:0000 (00 00 00 00) 65 04 70 00-(16 00) + // DOSBox under XP: + // 0000:0000 (00 00 00 F1) ?? ?? ?? 00-(07 00) + + M_StrToInt(myargv[p + 1], &tmp_s3_floorheight); + M_StrToInt(myargv[p + 2], &tmp_s3_floorpic); + + if (tmp_s3_floorpic >= numflats) + { + fprintf(stderr, + "DonutOverrun: The second parameter for \"-donut\" " + "switch should be greater than 0 and less than number " + "of flats (%d). Using default value (%d) instead. \n", + numflats, DONUT_FLOORPIC_DEFAULT); + tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT; + } + } + } + + /* + fprintf(stderr, + "Linedef: %d; Sector: %d; " + "New floor height: %d; New floor pic: %d\n", + line->iLineID, pillar_sector->iSectorID, + tmp_s3_floorheight >> 16, tmp_s3_floorpic); + */ + + *s3_floorheight = (fixed_t) tmp_s3_floorheight; + *s3_floorpic = (short) tmp_s3_floorpic; +} + // // Special Stuff that can not be categorized @@ -1186,17 +1271,19 @@ int EV_DoDonut(line_t* line) int rtn; int i; floormove_t* floor; - + fixed_t s3_floorheight; + short s3_floorpic; + secnum = -1; rtn = 0; while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) { s1 = §ors[secnum]; - + // ALREADY MOVING? IF SO, KEEP GOING... if (s1->specialdata) continue; - + rtn = 1; s2 = getNextSector(s1->lines[0],s1); @@ -1217,13 +1304,34 @@ int EV_DoDonut(line_t* line) break; } - for (i = 0;i < s2->linecount;i++) + for (i = 0; i < s2->linecount; i++) { - if ((!s2->lines[i]->flags & ML_TWOSIDED) || - (s2->lines[i]->backsector == s1)) - continue; s3 = s2->lines[i]->backsector; - + + if (s3 == s1) + continue; + + if (s3 == NULL) + { + // e6y + // s3 is NULL, so + // s3->floorheight is an int at 0000:0000 + // s3->floorpic is a short at 0000:0008 + // Trying to emulate + + fprintf(stderr, + "EV_DoDonut: WARNING: emulating buffer overrun due to " + "NULL back sector. " + "Unexpected behavior may occur in Vanilla Doom.\n"); + + DonutOverrun(&s3_floorheight, &s3_floorpic, line, s1); + } + else + { + s3_floorheight = s3->floorheight; + s3_floorpic = s3->floorpic; + } + // Spawn rising slime floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); P_AddThinker (&floor->thinker); @@ -1234,9 +1342,9 @@ int EV_DoDonut(line_t* line) floor->direction = 1; floor->sector = s2; floor->speed = FLOORSPEED / 2; - floor->texture = s3->floorpic; + floor->texture = s3_floorpic; floor->newspecial = 0; - floor->floordestheight = s3->floorheight; + floor->floordestheight = s3_floorheight; // Spawn lowering donut-hole floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); @@ -1248,7 +1356,7 @@ int EV_DoDonut(line_t* line) floor->direction = -1; floor->sector = s1; floor->speed = FLOORSPEED / 2; - floor->floordestheight = s3->floorheight; + floor->floordestheight = s3_floorheight; break; } } -- cgit v1.2.3 From 1290c2496e85105871ab457b91e159d43c4cc7b4 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 17 Oct 2009 19:39:37 +0000 Subject: Use M_StrToInt() when processing values passed with -spechit, so that hex values can be specified. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1721 --- src/p_map.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/p_map.c b/src/p_map.c index 42f2a60f..db512673 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -36,6 +36,7 @@ #include "doomdef.h" #include "m_argv.h" +#include "m_misc.h" #include "p_local.h" #include "s_sound.h" @@ -1412,7 +1413,7 @@ static void SpechitOverrun(line_t *ld) if (p > 0) { - baseaddr = atoi(myargv[p+1]); + M_StrToInt(atoi(myargv[p+1]), &baseaddr); } else { -- cgit v1.2.3 From 42454af827d204444874558ccb340fc6e65f9ac1 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 17 Oct 2009 20:13:54 +0000 Subject: Fix error in last change. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1722 --- src/p_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/p_map.c b/src/p_map.c index db512673..89f8f3f8 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1413,7 +1413,7 @@ static void SpechitOverrun(line_t *ld) if (p > 0) { - M_StrToInt(atoi(myargv[p+1]), &baseaddr); + M_StrToInt(myargv[p+1], (int *) &baseaddr); } else { -- cgit v1.2.3 From 3771126689527293eb4ad658b338d7910bf79012 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Mon, 26 Oct 2009 19:28:12 +0000 Subject: Initial hacks for compiling under SDL 1.3. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1726 --- src/i_video.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/i_video.c b/src/i_video.c index 062c9c9c..481ee0ea 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -334,7 +334,9 @@ static int TranslateKey(SDL_keysym *sym) case SDLK_PAUSE: return KEY_PAUSE; +#if !SDL_VERSION_ATLEAST(1, 3, 0) case SDLK_EQUALS: return KEY_EQUALS; +#endif case SDLK_MINUS: return KEY_MINUS; @@ -347,9 +349,11 @@ static int TranslateKey(SDL_keysym *sym) return KEY_RCTRL; case SDLK_LALT: - case SDLK_LMETA: case SDLK_RALT: +#if !SDL_VERSION_ATLEAST(1, 3, 0) + case SDLK_LMETA: case SDLK_RMETA: +#endif return KEY_RALT; case SDLK_CAPSLOCK: return KEY_CAPSLOCK; @@ -420,9 +424,15 @@ void I_StartFrame (void) static int MouseButtonState(void) { - Uint8 state = SDL_GetMouseState(NULL, NULL); + Uint8 state; int result = 0; +#if SDL_VERSION_ATLEAST(1, 3, 0) + state = SDL_GetMouseState(0, NULL, NULL); +#else + state = SDL_GetMouseState(NULL, NULL); +#endif + // Note: button "0" is left, button "1" is right, // button "2" is middle for Doom. This is different // to how SDL sees things. @@ -585,7 +595,11 @@ static void CenterMouse(void) // Clear any relative movement caused by warping SDL_PumpEvents(); +#if SDL_VERSION_ATLEAST(1, 3, 0) + SDL_GetRelativeMouseState(0, NULL, NULL); +#else SDL_GetRelativeMouseState(NULL, NULL); +#endif } // @@ -599,7 +613,11 @@ static void I_ReadMouse(void) int x, y; event_t ev; +#if SDL_VERSION_ATLEAST(1, 3, 0) + SDL_GetRelativeMouseState(0, &x, &y); +#else SDL_GetRelativeMouseState(&x, &y); +#endif if (x != 0 || y != 0) { @@ -1553,7 +1571,9 @@ void I_InitGraphics(void) // has to be done before the call to SDL_SetVideoMode. I_SetWindowCaption(); +#if !SDL_VERSION_ATLEAST(1, 3, 0) I_SetWindowIcon(); +#endif // Set the video mode. -- cgit v1.2.3 From 43b0dbd272da1d590797d2974e94413971131129 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Thu, 19 Nov 2009 21:49:13 +0000 Subject: Rework the OS X MIDI disabling code, as SDL_mixer 1.2.11 fixes the crash. Check and disable MIDI by default if using an older version of SDL on OS X. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1730 --- src/i_sdlmusic.c | 32 +++++++++++++++++++++----------- src/m_config.c | 19 +++++++++++++++++++ src/s_sound.c | 10 +--------- 3 files changed, 41 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c index 81f492b5..7f9bd8ec 100644 --- a/src/i_sdlmusic.c +++ b/src/i_sdlmusic.c @@ -81,18 +81,28 @@ static boolean SDLIsInitialized(void) // Initialize music subsystem static boolean I_SDL_InitMusic(void) -{ - // When trying to run with music enabled on OSX, display - // a warning message. - -#ifdef __APPLE__ - printf("\n" - " *** WARNING ***\n" - " Music playback on OSX may cause crashes and\n" - " is disabled by default.\n" - "\n"); +{ + // SDL_mixer prior to v1.2.11 has a bug that causes crashes + // with MIDI playback. Print a warning message if we are + // using an old version. + +#ifdef __MACOSX__ + { + const SDL_version *v = Mix_Linked_Version(); + + if (SDL_VERSIONNUM(v->major, v->minor, v->patch) + < SDL_VERSIONNUM(1, 2, 11)) + { + printf("\n" + " *** WARNING ***\n" + " You are using an old version of SDL_mixer.\n" + " Music playback on this version may cause crashes\n" + " under OS X and is disabled by default.\n" + "\n"); + } + } #endif - + // If SDL_mixer is not initialized, we have to initialize it // and have the responsibility to shut it down later on. diff --git a/src/m_config.c b/src/m_config.c index 4f789845..73f0da2c 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -36,6 +36,8 @@ #include #endif +#include "SDL_mixer.h" + #include "config.h" #include "deh_main.h" #include "doomdef.h" @@ -53,6 +55,7 @@ #include "i_swap.h" #include "i_system.h" #include "i_video.h" +#include "s_sound.h" #include "v_video.h" #include "hu_stuff.h" @@ -1456,5 +1459,21 @@ void M_ApplyPlatformDefaults(void) #ifdef _WIN32_WCE M_ApplyWindowsCEDefaults(); #endif + + // Before SDL_mixer version 1.2.11, MIDI music caused the game + // to crash when it looped. If this is an old SDL_mixer version, + // disable MIDI. + +#ifdef __MACOSX__ + { + const SDL_version *v = Mix_Linked_Version(); + + if (SDL_VERSIONNUM(v->major, v->minor, v->patch) + < SDL_VERSIONNUM(1, 2, 11)) + { + snd_musicdevice = SNDDEVICE_NONE; + } + } +#endif } diff --git a/src/s_sound.c b/src/s_sound.c index 9b4f71aa..1c56efb2 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -69,14 +69,6 @@ #define NORM_PRIORITY 64 #define NORM_SEP 128 -// Disable music on OSX by default; there are problems with SDL_mixer. - -#ifndef __APPLE__ -#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB -#else -#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE -#endif - typedef struct { // sound information (if null, channel avail.) @@ -128,7 +120,7 @@ static musicinfo_t *mus_playing = NULL; int numChannels = 8; -int snd_musicdevice = DEFAULT_MUSIC_DEVICE; +int snd_musicdevice = SNDDEVICE_SB; int snd_sfxdevice = SNDDEVICE_SB; // Sound modules -- cgit v1.2.3 From 1dfad75870fa6b8e0a3aa41b3f9bb6ea260c9d9f Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 21 Nov 2009 00:38:16 +0000 Subject: Don't crash if key settings are set in a configuration file that are out of range (thanks entryway). Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1732 --- src/m_config.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/m_config.c b/src/m_config.c index 73f0da2c..a2f3ac58 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -1237,7 +1237,14 @@ static void LoadDefaultCollection(default_collection_t *collection) intparm = ParseIntParameter(strparm); defaults[i].untranslated = intparm; - intparm = scantokey[intparm]; + if (intparm >= 0 && intparm < 128) + { + intparm = scantokey[intparm]; + } + else + { + intparm = 0; + } defaults[i].original_translated = intparm; * (int *) def->location = intparm; -- cgit v1.2.3