diff options
author | Simon Howard | 2009-11-21 16:36:46 +0000 |
---|---|---|
committer | Simon Howard | 2009-11-21 16:36:46 +0000 |
commit | afa0c4c7979c1508605d0e79487f299cd03adda6 (patch) | |
tree | 7df1745badf169e4490e3a56a89a28ac37977c14 /src | |
parent | 095bc1110b3c11fbf2e17bfd51bf78909fe34662 (diff) | |
parent | 2c6e7b2f10c32ca0406ca6753e7701d83e6dea8f (diff) | |
download | chocolate-doom-afa0c4c7979c1508605d0e79487f299cd03adda6.tar.gz chocolate-doom-afa0c4c7979c1508605d0e79487f299cd03adda6.tar.bz2 chocolate-doom-afa0c4c7979c1508605d0e79487f299cd03adda6.zip |
Merge from trunk.
Subversion-branch: /branches/raven-branch
Subversion-revision: 1737
Diffstat (limited to 'src')
38 files changed, 473 insertions, 217 deletions
diff --git a/src/d_iwad.c b/src/d_iwad.c index 59760adb..ba9f9ae1 100644 --- a/src/d_iwad.c +++ b/src/d_iwad.c @@ -19,7 +19,7 @@ // 02111-1307, USA. // // DESCRIPTION: -// Search for and locate an IWAD file, and initialise according +// Search for and locate an IWAD file, and initialize according // to the IWAD type. // //----------------------------------------------------------------------------- diff --git a/src/d_iwad.h b/src/d_iwad.h index 055463a9..f95b4258 100644 --- a/src/d_iwad.h +++ b/src/d_iwad.h @@ -19,7 +19,7 @@ // 02111-1307, USA. // // DESCRIPTION: -// Find IWAD and initialise according to IWAD type. +// Find IWAD and initialize according to IWAD type. // //----------------------------------------------------------------------------- diff --git a/src/deh_str.c b/src/deh_str.c index 3ede4508..0baaa7e8 100644 --- a/src/deh_str.c +++ b/src/deh_str.c @@ -66,7 +66,7 @@ char *DEH_String(char *s) { int entry; - // Fallback if we have not initialised the hash table yet + // Fallback if we have not initialized the hash table yet if (hash_table_length < 0) return s; @@ -164,7 +164,7 @@ void DEH_AddStringReplacement(char *from_text, char *to_text) { deh_substitution_t *sub; - // Initialise the hash table if this is the first time + // Initialize the hash table if this is the first time if (hash_table_length < 0) { diff --git a/src/doom/d_main.c b/src/doom/d_main.c index 9fa9ae3b..4e7812cc 100644 --- a/src/doom/d_main.c +++ b/src/doom/d_main.c @@ -901,7 +901,7 @@ static struct { NULL, NULL, 0}, }; -// Initialise the game version +// Initialize the game version static void InitGameVersion(void) { @@ -1701,7 +1701,7 @@ void D_DoomMain (void) I_InitJoystick(); #ifdef FEATURE_MULTIPLAYER - printf ("NET_Init: Initialise network subsystem.\n"); + printf ("NET_Init: Init network subsystem.\n"); NET_Init (); #endif diff --git a/src/doom/d_net.h b/src/doom/d_net.h index 6d162d20..f801d216 100644 --- a/src/doom/d_net.h +++ b/src/doom/d_net.h @@ -42,7 +42,7 @@ void D_QuitNetGame (void); //? how many ticks to run? void TryRunTics (void); -// Called at start of game loop to initialise timers +// Called at start of game loop to initialize timers void D_StartGameLoop(void); extern boolean drone; diff --git a/src/doom/deh_defs.h b/src/doom/deh_defs.h index a6650544..e7b76182 100644 --- a/src/doom/deh_defs.h +++ b/src/doom/deh_defs.h @@ -41,7 +41,7 @@ struct deh_section_s { char *name; - // Called on startup to initialise code + // Called on startup to initialize code deh_section_init_t init; diff --git a/src/doom/deh_main.c b/src/doom/deh_main.c index 59e63ea3..63cae460 100644 --- a/src/doom/deh_main.c +++ b/src/doom/deh_main.c @@ -110,7 +110,7 @@ void DEH_Checksum(md5_digest_t digest) // Called on startup to call the Init functions -static void InitialiseSections(void) +static void InitializeSections(void) { unsigned int i; @@ -385,7 +385,7 @@ void DEH_Init(void) char *filename; int p; - InitialiseSections(); + InitializeSections(); //! // @category mod diff --git a/src/doom/deh_ptr.c b/src/doom/deh_ptr.c index 87daf7d8..d757a178 100644 --- a/src/doom/deh_ptr.c +++ b/src/doom/deh_ptr.c @@ -56,7 +56,7 @@ static void DEH_PointerInit(void) { int i; - // Initialise list of dehacked pointers + // Initialize list of dehacked pointers for (i=0; i<NUMSTATES; ++i) codeptrs[i] = states[i].action; diff --git a/src/doom/p_doors.c b/src/doom/p_doors.c index b681a8d0..89b65328 100644 --- a/src/doom/p_doors.c +++ b/src/doom/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; } diff --git a/src/doom/p_map.c b/src/doom/p_map.c index 9198d59e..3f88aabc 100644 --- a/src/doom/p_map.c +++ b/src/doom/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(myargv[p+1], (int *) &baseaddr); } else { diff --git a/src/doom/p_spec.c b/src/doom/p_spec.c index 27042b5d..37beb850 100644 --- a/src/doom/p_spec.c +++ b/src/doom/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 <x> <y> + // + // 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,26 +1271,67 @@ 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); - for (i = 0;i < s2->linecount;i++) + + // 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) || - (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); @@ -1216,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); @@ -1230,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; } } diff --git a/src/doomtype.h b/src/doomtype.h index e38d921f..b458c1cd 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -52,7 +52,7 @@ // // The packed attribute forces structures to be packed into the minimum // space necessary. If this is not done, the compiler may align structure -// fields differently to optimise memory access, inflating the overall +// fields differently to optimize memory access, inflating the overall // structure size. It is important to use the packed attribute on certain // structures where alignment is important, particularly data read/written // to disk. diff --git a/src/i_joystick.c b/src/i_joystick.c index d11d3084..7767c19d 100644 --- a/src/i_joystick.c +++ b/src/i_joystick.c @@ -115,7 +115,7 @@ void I_InitJoystick(void) SDL_JoystickEventState(SDL_ENABLE); - // Initialised okay! + // Initialized okay! printf("I_InitJoystick: %s\n", SDL_JoystickName(joystick_index)); } diff --git a/src/i_pcsound.c b/src/i_pcsound.c index 36d4873e..907aeb54 100644 --- a/src/i_pcsound.c +++ b/src/i_pcsound.c @@ -36,7 +36,7 @@ #include "pcsound.h" -static boolean pcs_initialised = false; +static boolean pcs_initialized = false; static SDL_mutex *sound_lock; static boolean use_sfx_prefix; @@ -178,7 +178,7 @@ static int I_PCS_StartSound(sfxinfo_t *sfxinfo, { int result; - if (!pcs_initialised) + if (!pcs_initialized) { return -1; } @@ -214,7 +214,7 @@ static int I_PCS_StartSound(sfxinfo_t *sfxinfo, static void I_PCS_StopSound(int handle) { - if (!pcs_initialised) + if (!pcs_initialized) { return; } @@ -258,7 +258,7 @@ static int I_PCS_GetSfxLumpNum(sfxinfo_t* sfx) static boolean I_PCS_SoundIsPlaying(int handle) { - if (!pcs_initialised) + if (!pcs_initialized) { return false; } @@ -279,21 +279,21 @@ static boolean I_PCS_InitSound(boolean _use_sfx_prefix) PCSound_SetSampleRate(snd_samplerate); - // Initialise the PC speaker subsystem. + // Initialize the PC speaker subsystem. - pcs_initialised = PCSound_Init(PCSCallbackFunc); + pcs_initialized = PCSound_Init(PCSCallbackFunc); - if (pcs_initialised) + if (pcs_initialized) { sound_lock = SDL_CreateMutex(); } - return pcs_initialised; + return pcs_initialized; } static void I_PCS_ShutdownSound(void) { - if (pcs_initialised) + if (pcs_initialized) { PCSound_Shutdown(); } diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c index 602fd17b..1e907739 100644 --- a/src/i_sdlmusic.c +++ b/src/i_sdlmusic.c @@ -43,12 +43,12 @@ #define MAXMIDLENGTH (96 * 1024) -static boolean music_initialised = false; +static boolean music_initialized = false; -// If this is true, this module initialised SDL sound and has the +// If this is true, this module initialized SDL sound and has the // responsibility to shut it down -static boolean sdl_was_initialised = false; +static boolean sdl_was_initialized = false; static boolean musicpaused = false; static int current_music_volume; @@ -57,21 +57,21 @@ static int current_music_volume; static void I_SDL_ShutdownMusic(void) { - if (music_initialised) + if (music_initialized) { Mix_HaltMusic(); - music_initialised = false; + music_initialized = false; - if (sdl_was_initialised) + if (sdl_was_initialized) { Mix_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); - sdl_was_initialised = false; + sdl_was_initialized = false; } } } -static boolean SDLIsInitialised(void) +static boolean SDLIsInitialized(void) { int freq, channels; Uint16 format; @@ -79,25 +79,35 @@ static boolean SDLIsInitialised(void) return Mix_QuerySpec(&freq, &format, &channels) != 0; } -// Initialise music subsystem +// 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 initialised, we have to initialise it + + // If SDL_mixer is not initialized, we have to initialize it // and have the responsibility to shut it down later on. - if (!SDLIsInitialised()) + if (!SDLIsInitialized()) { if (SDL_Init(SDL_INIT_AUDIO) < 0) { @@ -107,17 +117,17 @@ static boolean I_SDL_InitMusic(void) if (Mix_OpenAudio(snd_samplerate, AUDIO_S16SYS, 2, 1024) < 0) { - fprintf(stderr, "Error initialising SDL_mixer: %s\n", Mix_GetError()); + fprintf(stderr, "Error initializing SDL_mixer: %s\n", Mix_GetError()); SDL_QuitSubSystem(SDL_INIT_AUDIO); return false; } SDL_PauseAudio(0); - sdl_was_initialised = true; + sdl_was_initialized = true; } - music_initialised = true; + music_initialized = true; return true; } @@ -160,7 +170,7 @@ static void I_SDL_PlaySong(void *handle, boolean looping) Mix_Music *music = (Mix_Music *) handle; int loops; - if (!music_initialised) + if (!music_initialized) { return; } @@ -184,7 +194,7 @@ static void I_SDL_PlaySong(void *handle, boolean looping) static void I_SDL_PauseSong(void) { - if (!music_initialised) + if (!music_initialized) { return; } @@ -196,7 +206,7 @@ static void I_SDL_PauseSong(void) static void I_SDL_ResumeSong(void) { - if (!music_initialised) + if (!music_initialized) { return; } @@ -208,7 +218,7 @@ static void I_SDL_ResumeSong(void) static void I_SDL_StopSong(void) { - if (!music_initialised) + if (!music_initialized) { return; } @@ -220,7 +230,7 @@ static void I_SDL_UnRegisterSong(void *handle) { Mix_Music *music = (Mix_Music *) handle; - if (!music_initialised) + if (!music_initialized) { return; } @@ -271,7 +281,7 @@ static void *I_SDL_RegisterSong(void *data, int len) char *filename; Mix_Music *music; - if (!music_initialised) + if (!music_initialized) { return NULL; } @@ -315,7 +325,7 @@ static void *I_SDL_RegisterSong(void *data, int len) // Is the song playing? static boolean I_SDL_MusicIsPlaying(void) { - if (!music_initialised) + if (!music_initialized) { return false; } diff --git a/src/i_sdlsound.c b/src/i_sdlsound.c index ff0ef10e..3273907e 100644 --- a/src/i_sdlsound.c +++ b/src/i_sdlsound.c @@ -51,7 +51,7 @@ #define LOW_PASS_FILTER #define NUM_CHANNELS 16 -static boolean sound_initialised = false; +static boolean sound_initialized = false; static sfxinfo_t *channels_playing[NUM_CHANNELS]; @@ -311,7 +311,7 @@ static void ExpandSoundData_SDL(sfxinfo_t *sfxinfo, chunk = AllocateChunk(sfxinfo, expanded_length); - // If we can, use the standard / optimised SDL conversion routines. + // If we can, use the standard / optimized SDL conversion routines. if (samplerate <= mixer_freq && ConvertibleRatio(samplerate, mixer_freq) @@ -554,7 +554,7 @@ static void I_SDL_UpdateSoundParams(int handle, int vol, int sep) { int left, right; - if (!sound_initialised) + if (!sound_initialized) { return; } @@ -588,7 +588,7 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep) { Mix_Chunk *chunk; - if (!sound_initialised) + if (!sound_initialized) { return -1; } @@ -622,7 +622,7 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep) static void I_SDL_StopSound (int handle) { - if (!sound_initialised) + if (!sound_initialized) { return; } @@ -670,7 +670,7 @@ static void I_SDL_UpdateSound(void) static void I_SDL_ShutdownSound(void) { - if (!sound_initialised) + if (!sound_initialized) { return; } @@ -678,7 +678,7 @@ static void I_SDL_ShutdownSound(void) Mix_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); - sound_initialised = false; + sound_initialized = false; } @@ -735,7 +735,7 @@ static boolean I_SDL_InitSound(boolean _use_sfx_prefix) SDL_PauseAudio(0); - sound_initialised = true; + sound_initialized = true; return true; } diff --git a/src/i_sound.c b/src/i_sound.c index 34f4ea46..a9e953ce 100644 --- a/src/i_sound.c +++ b/src/i_sound.c @@ -26,6 +26,8 @@ #include <stdio.h> #include <stdlib.h> +#include "SDL_mixer.h" + #include "config.h" #include "doomfeatures.h" #include "doomtype.h" @@ -35,14 +37,6 @@ #include "m_argv.h" #include "m_config.h" -// 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 - // Sound sample rate to use for digital output (Hz) int snd_samplerate = 44100; @@ -52,7 +46,7 @@ int snd_samplerate = 44100; static sound_module_t *sound_module; static music_module_t *music_module; -int snd_musicdevice = DEFAULT_MUSIC_DEVICE; +int snd_musicdevice = SNDDEVICE_SB; int snd_sfxdevice = SNDDEVICE_SB; // Sound modules @@ -109,7 +103,7 @@ static boolean SndDeviceInList(snddevice_t device, snddevice_t *list, return false; } -// Find and initialise a sound_module_t appropriate for the setting +// Find and initialize a sound_module_t appropriate for the setting // in snd_sfxdevice. static void InitSfxModule(boolean use_sfx_prefix) @@ -127,7 +121,7 @@ static void InitSfxModule(boolean use_sfx_prefix) sound_modules[i]->sound_devices, sound_modules[i]->num_sound_devices)) { - // Initialise the module + // Initialize the module if (sound_modules[i]->Init(use_sfx_prefix)) { @@ -138,7 +132,7 @@ static void InitSfxModule(boolean use_sfx_prefix) } } -// Initialise music according to snd_musicdevice. +// Initialize music according to snd_musicdevice. static void InitMusicModule(void) { @@ -155,7 +149,7 @@ static void InitMusicModule(void) music_modules[i]->sound_devices, music_modules[i]->num_sound_devices)) { - // Initialise the module + // Initialize the module if (music_modules[i]->Init()) { @@ -200,7 +194,7 @@ void I_InitSound(boolean use_sfx_prefix) nomusic = M_CheckParm("-nomusic") > 0; - // Initialise the sound and music subsystems. + // Initialize the sound and music subsystems. if (!nosound && !screensaver_mode) { @@ -416,5 +410,21 @@ void I_BindSoundVariables(void) #ifdef FEATURE_SOUND M_BindVariable("use_libsamplerate", &use_libsamplerate); #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/i_timer.c b/src/i_timer.c index ef97b7b7..d2c455e9 100644 --- a/src/i_timer.c +++ b/src/i_timer.c @@ -81,7 +81,7 @@ void I_WaitVBL(int count) void I_InitTimer(void) { - // initialise timer + // initialize timer SDL_Init(SDL_INIT_TIMER); } diff --git a/src/i_timer.h b/src/i_timer.h index 17390884..56810468 100644 --- a/src/i_timer.h +++ b/src/i_timer.h @@ -40,7 +40,7 @@ int I_GetTimeMS (void); // Pause for a specified number of ms void I_Sleep(int ms); -// Initialise timer +// Initialize timer void I_InitTimer(void); // Wait for vertical retrace or pause a bit. diff --git a/src/i_video.c b/src/i_video.c index 6f82e60a..64a2e8eb 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -93,6 +93,9 @@ static const char shiftxform[] = }; +#define LOADING_DISK_W 16 +#define LOADING_DISK_H 16 + // Non aspect ratio-corrected modes (direct multiples of 320x200) static screen_mode_t *screen_modes[] = { @@ -145,7 +148,7 @@ static int windowwidth, windowheight; // display has been set up? -static boolean initialised = false; +static boolean initialized = false; // disable mouse? @@ -221,7 +224,6 @@ static grabmouse_callback_t grabmouse_callback = NULL; // restored by EndRead static byte *disk_image = NULL; -static int disk_image_w, disk_image_h; static byte *saved_background; static boolean window_focused; @@ -338,7 +340,7 @@ static void UpdateFocus(void) state = SDL_GetAppState(); // We should have input (keyboard) focus and be visible - // (not minimised) + // (not minimized) window_focused = (state & SDL_APPINPUTFOCUS) && (state & SDL_APPACTIVE); @@ -378,20 +380,18 @@ void I_EnableLoadingDisk(void) tmpbuf = Z_Malloc(SCREENWIDTH * (disk->height + 1), PU_STATIC, NULL); V_UseBuffer(tmpbuf); - disk_image_w = SHORT(disk->width); - disk_image_h = SHORT(disk->height); - V_DrawPatch(0, 0, disk); + // Draw the disk to the screen: - // Copy the disk into the disk_image buffer. + V_DrawPatch(0, 0, disk); - disk_image = Z_Malloc(disk_image_w * disk_image_h, PU_STATIC, NULL); - saved_background = Z_Malloc(disk_image_w * disk_image_h, PU_STATIC, NULL); + disk_image = Z_Malloc(LOADING_DISK_W * LOADING_DISK_H, PU_STATIC, NULL); + saved_background = Z_Malloc(LOADING_DISK_W * LOADING_DISK_H, PU_STATIC, NULL); - for (y=0; y<disk_image_h; ++y) + for (y=0; y<LOADING_DISK_H; ++y) { - memcpy(disk_image + disk_image_w * y, + memcpy(disk_image + LOADING_DISK_W * y, tmpbuf + SCREENWIDTH * y, - disk_image_w); + LOADING_DISK_W); } // All done - free the screen buffer and restore the normal @@ -435,7 +435,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; @@ -448,9 +450,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; @@ -497,14 +501,14 @@ static int TranslateKey(SDL_keysym *sym) void I_ShutdownGraphics(void) { - if (initialised) + if (initialized) { SDL_ShowCursor(1); SDL_WM_GrabInput(SDL_GRAB_OFF); SDL_QuitSubSystem(SDL_INIT_VIDEO); - initialised = false; + initialized = false; } } @@ -521,9 +525,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. @@ -739,7 +749,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 } // @@ -753,7 +767,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) { @@ -784,7 +802,7 @@ static void I_ReadMouse(void) // void I_StartTic (void) { - if (!initialised) + if (!initialized) { return; } @@ -898,50 +916,54 @@ static void UpdateRect(int x1, int y1, int x2, int y2) void I_BeginRead(void) { + byte *screenloc = I_VideoBuffer + + (SCREENHEIGHT - LOADING_DISK_H) * SCREENWIDTH + + (SCREENWIDTH - LOADING_DISK_W); int y; - if (!initialised || disk_image == NULL) + if (!initialized || disk_image == NULL) return; // save background and copy the disk image in - for (y=0; y<disk_image_h; ++y) + for (y=0; y<LOADING_DISK_H; ++y) { - byte *screenloc = - I_VideoBuffer - + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH - + (SCREENWIDTH - 1 - disk_image_w); - - memcpy(saved_background + y * disk_image_w, + memcpy(saved_background + y * LOADING_DISK_W, screenloc, - disk_image_w); - memcpy(screenloc, disk_image + y * disk_image_w, disk_image_w); + LOADING_DISK_W); + memcpy(screenloc, + disk_image + y * LOADING_DISK_W, + LOADING_DISK_W); + + screenloc += SCREENWIDTH; } - UpdateRect(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h, + UpdateRect(SCREENWIDTH - LOADING_DISK_W, SCREENHEIGHT - LOADING_DISK_H, SCREENWIDTH, SCREENHEIGHT); } void I_EndRead(void) { + byte *screenloc = I_VideoBuffer + + (SCREENHEIGHT - LOADING_DISK_H) * SCREENWIDTH + + (SCREENWIDTH - LOADING_DISK_W); int y; - if (!initialised || disk_image == NULL) + if (!initialized || disk_image == NULL) return; // save background and copy the disk image in - for (y=0; y<disk_image_h; ++y) + for (y=0; y<LOADING_DISK_H; ++y) { - byte *screenloc = - I_VideoBuffer - + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH - + (SCREENWIDTH - 1 - disk_image_w); + memcpy(screenloc, + saved_background + y * LOADING_DISK_W, + LOADING_DISK_W); - memcpy(screenloc, saved_background + y * disk_image_w, disk_image_w); + screenloc += SCREENWIDTH; } - UpdateRect(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h, + UpdateRect(SCREENWIDTH - LOADING_DISK_W, SCREENHEIGHT - LOADING_DISK_H, SCREENWIDTH, SCREENHEIGHT); } @@ -955,7 +977,7 @@ void I_FinishUpdate (void) int i; // UNUSED static unsigned char *bigscreen=0; - if (!initialised) + if (!initialized) return; if (noblit) @@ -1697,7 +1719,7 @@ void I_InitGraphics(void) if (SDL_Init(SDL_INIT_VIDEO) < 0) { - I_Error("Failed to initialise video: %s", SDL_GetError()); + I_Error("Failed to initialize video: %s", SDL_GetError()); } // Check for command-line video-related parameters. @@ -1750,7 +1772,9 @@ void I_InitGraphics(void) // has to be done before the call to SDL_SetVideoMode. I_InitWindowTitle(); +#if !SDL_VERSION_ATLEAST(1, 3, 0) I_InitWindowIcon(); +#endif // Set the video mode. @@ -1874,7 +1898,7 @@ void I_InitGraphics(void) CenterMouse(); } - initialised = true; + initialized = true; // Call I_ShutdownGraphics on quit diff --git a/src/m_config.c b/src/m_config.c index f70e112a..056861cc 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -1214,7 +1214,14 @@ static void LoadDefaultCollection(default_collection_t *collection) intparm = ParseIntParameter(strparm); def->untranslated = intparm; - intparm = scantokey[intparm]; + if (intparm >= 0 && intparm < 128) + { + intparm = scantokey[intparm]; + } + else + { + intparm = 0; + } def->original_translated = intparm; * (int *) def->location = intparm; diff --git a/src/m_misc.c b/src/m_misc.c index 4f3becfb..5847f1a2 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -199,6 +199,14 @@ 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; +} + void M_ExtractFileBase(char *path, char *dest) { char* src; diff --git a/src/m_misc.h b/src/m_misc.h index ec70a405..c92ddde8 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); void M_ExtractFileBase(char *path, char *dest); void M_ForceUppercase(char *text); diff --git a/src/net_client.c b/src/net_client.c index bcd5831d..131397e9 100644 --- a/src/net_client.c +++ b/src/net_client.c @@ -1155,7 +1155,7 @@ boolean NET_CL_Connect(net_addr_t *addr) client_context = NET_NewContext(); - // initialise module for client mode + // initialize module for client mode if (!addr->module->InitClient()) { @@ -1167,7 +1167,7 @@ boolean NET_CL_Connect(net_addr_t *addr) net_client_connected = true; net_client_received_wait_data = false; - // Initialise connection + // Initialize connection NET_Conn_InitClient(&client_connection, addr); diff --git a/src/net_common.c b/src/net_common.c index d1d4390a..57699fd9 100644 --- a/src/net_common.c +++ b/src/net_common.c @@ -61,7 +61,7 @@ static void NET_Conn_Init(net_connection_t *conn, net_addr_t *addr) conn->reliable_recv_seq = 0; } -// Initialise as a client connection +// Initialize as a client connection void NET_Conn_InitClient(net_connection_t *conn, net_addr_t *addr) { @@ -69,7 +69,7 @@ void NET_Conn_InitClient(net_connection_t *conn, net_addr_t *addr) conn->state = NET_CONN_STATE_CONNECTING; } -// Initialise as a server connection +// Initialize as a server connection void NET_Conn_InitServer(net_connection_t *conn, net_addr_t *addr) { diff --git a/src/net_defs.h b/src/net_defs.h index cb491124..a5fddc4d 100644 --- a/src/net_defs.h +++ b/src/net_defs.h @@ -60,11 +60,11 @@ struct _net_packet_s struct _net_module_s { - // Initialise this module for use as a client + // Initialize this module for use as a client boolean (*InitClient)(void); - // Initialise this module for use as a server + // Initialize this module for use as a server boolean (*InitServer)(void); diff --git a/src/net_gui.c b/src/net_gui.c index da7bde04..8c848d1c 100644 --- a/src/net_gui.c +++ b/src/net_gui.c @@ -263,7 +263,7 @@ void NET_WaitForStart(void) { if (!TXT_Init()) { - fprintf(stderr, "Failed to initialise GUI\n"); + fprintf(stderr, "Failed to initialize GUI\n"); exit(-1); } diff --git a/src/net_loop.c b/src/net_loop.c index 825609d9..9f371bcb 100644 --- a/src/net_loop.c +++ b/src/net_loop.c @@ -99,7 +99,7 @@ static boolean NET_CL_InitClient(void) static boolean NET_CL_InitServer(void) { - I_Error("NET_CL_InitServer: attempted to initialise client pipe end as a server!"); + I_Error("NET_CL_InitServer: attempted to initialize client pipe end as a server!"); return false; } @@ -161,7 +161,7 @@ net_module_t net_loop_client_module = static boolean NET_SV_InitClient(void) { - I_Error("NET_SV_InitClient: attempted to initialise server pipe end as a client!"); + I_Error("NET_SV_InitClient: attempted to initialize server pipe end as a client!"); return false; } diff --git a/src/net_sdl.c b/src/net_sdl.c index db129853..aa7fbd6e 100644 --- a/src/net_sdl.c +++ b/src/net_sdl.c @@ -57,7 +57,7 @@ typedef struct static addrpair_t **addr_table; static int addr_table_size = -1; -// Initialises the address table +// Initializes the address table static void NET_SDL_InitAddrTable(void) { diff --git a/src/net_server.c b/src/net_server.c index 5e256122..904d932e 100644 --- a/src/net_server.c +++ b/src/net_server.c @@ -120,7 +120,7 @@ typedef struct } net_client_recv_t; static net_server_state_t server_state; -static boolean server_initialised = false; +static boolean server_initialized = false; static net_client_t clients[MAXNETNODES]; static net_client_t *sv_players[MAXPLAYERS]; static net_context_t *server_context; @@ -613,7 +613,7 @@ static void NET_SV_ParseSYN(net_packet_t *packet, return; } - // Activate, initialise connection + // Activate, initialize connection NET_SV_InitNewClient(client, addr, player_name); @@ -1490,13 +1490,13 @@ void NET_SV_AddModule(net_module_t *module) NET_AddModule(server_context, module); } -// Initialise server and wait for connections +// Initialize server and wait for connections void NET_SV_Init(void) { int i; - // initialise send/receive context + // initialize send/receive context server_context = NET_NewContext(); @@ -1511,7 +1511,7 @@ void NET_SV_Init(void) server_state = SERVER_WAITING_START; sv_gamemode = indetermined; - server_initialised = true; + server_initialized = true; } // Run server code to check for new packets/send packets as the server @@ -1523,7 +1523,7 @@ void NET_SV_Run(void) net_packet_t *packet; int i; - if (!server_initialised) + if (!server_initialized) { return; } @@ -1565,7 +1565,7 @@ void NET_SV_Shutdown(void) boolean running; int start_time; - if (!server_initialised) + if (!server_initialized) { return; } diff --git a/src/net_server.h b/src/net_server.h index 3d0cf6e4..93b22fc3 100644 --- a/src/net_server.h +++ b/src/net_server.h @@ -24,7 +24,7 @@ #ifndef NET_SERVER_H #define NET_SERVER_H -// initialise server and wait for connections +// initialize server and wait for connections void NET_SV_Init(void); diff --git a/src/setup/Makefile.am b/src/setup/Makefile.am index 737dd278..58561b62 100644 --- a/src/setup/Makefile.am +++ b/src/setup/Makefile.am @@ -2,6 +2,7 @@ gamesdir = $(prefix)/games AM_CFLAGS = @SDL_CFLAGS@ \ + @SDLMIXER_CFLAGS@ \ -I$(top_builddir)/textscreen -I.. \ -DINSTALL_DIR="\"$(gamesdir)\"" diff --git a/src/setup/execute.c b/src/setup/execute.c index 18a07156..be7214f5 100644 --- a/src/setup/execute.c +++ b/src/setup/execute.c @@ -159,81 +159,69 @@ static unsigned int WaitForProcessExit(HANDLE subprocess) } } -static wchar_t *GetFullExePath(const char *program) +static void ConcatWCString(wchar_t *buf, const char *value) +{ + MultiByteToWideChar(CP_OEMCP, 0, + value, strlen(value) + 1, + buf + wcslen(buf), strlen(value) + 1); +} + +// Build the command line string, a wide character string of the form: +// +// "program" "arg" + +static wchar_t *BuildCommandLine(const char *program, const char *arg) { wchar_t *result; - unsigned int path_len; char *sep; - // Find the full path to the EXE to execute, by taking the path - // to this program and concatenating the EXE name: + result = calloc(strlen(myargv[0]) + strlen(program) + strlen(arg) + 6, + sizeof(wchar_t)); + + wcscpy(result, L"\""); sep = strrchr(myargv[0], DIR_SEPARATOR); - if (sep == NULL) - { - path_len = 0; - result = calloc(strlen(program) + 1, sizeof(wchar_t)); - } - else + if (sep != NULL) { - path_len = sep - myargv[0] + 1; - - result = calloc(path_len + strlen(program) + 1, - sizeof(wchar_t)); - MultiByteToWideChar(CP_OEMCP, 0, - myargv[0], path_len, - result, path_len); - } - - MultiByteToWideChar(CP_OEMCP, 0, - program, strlen(program) + 1, - result + path_len, strlen(program) + 1); - - return result; -} + ConcatWCString(result, myargv[0]); -// Convert command line argument to wchar_t string and add surrounding -// "" quotes: + // Cut off the string after the last directory separator, + // before appending the actual program. -static wchar_t *GetPaddedWideArg(const char *arg) -{ - wchar_t *result; - unsigned int len = strlen(arg); + result[sep - myargv[0] + 2] = '\0'; + + } - // Convert the command line arg to a wide char string: + ConcatWCString(result, program); - result = calloc(len + 3, sizeof(wchar_t)); - MultiByteToWideChar(CP_OEMCP, 0, - arg, len + 1, - result + 1, len + 1); + wcscat(result, L"\" \""); - // Surrounding quotes: + ConcatWCString(result, arg); - result[0] = '"'; - result[len + 1] = '"'; - result[len + 2] = 0; + wcscat(result, L"\""); return result; } static int ExecuteCommand(const char *program, const char *arg) { + STARTUPINFOW startup_info; PROCESS_INFORMATION proc_info; - wchar_t *exe_path; - wchar_t *warg; + wchar_t *command; int result = 0; - exe_path = GetFullExePath(program); - warg = GetPaddedWideArg(arg); + command = BuildCommandLine(program, arg); // Invoke the program: memset(&proc_info, 0, sizeof(proc_info)); + memset(&startup_info, 0, sizeof(startup_info)); + startup_info.cb = sizeof(startup_info); - if (!CreateProcessW(exe_path, warg, - NULL, NULL, FALSE, 0, NULL, NULL, NULL, - &proc_info)) + if (!CreateProcessW(NULL, command, + NULL, NULL, FALSE, 0, NULL, NULL, + &startup_info, &proc_info)) { result = -1; } @@ -247,19 +235,48 @@ static int ExecuteCommand(const char *program, const char *arg) CloseHandle(proc_info.hThread); } - free(exe_path); - free(warg); + free(command); return result; } #else +// Given the specified program name, get the full path to the program, +// assuming that it is in the same directory as this program is. + +static char *GetFullExePath(const char *program) +{ + char *result; + char *sep; + unsigned int path_len; + + sep = strrchr(myargv[0], DIR_SEPARATOR); + + if (sep == NULL) + { + result = strdup(program); + } + else + { + path_len = sep - myargv[0] + 1; + + result = malloc(strlen(program) + path_len + 1); + + strncpy(result, myargv[0], path_len); + result[path_len] = '\0'; + + strcat(result, program); + } + + return result; +} + static int ExecuteCommand(const char *program, const char *arg) { pid_t childpid; int result; - const char *argv[] = { program, arg, NULL }; + const char *argv[3]; childpid = fork(); @@ -267,7 +284,11 @@ static int ExecuteCommand(const char *program, const char *arg) { // This is the child. Execute the command. - execv(argv[0], (char **) argv); + argv[0] = GetFullExePath(program); + argv[1] = arg; + argv[2] = NULL; + + execvp(argv[0], (char **) argv); exit(-1); } diff --git a/src/setup/joystick.c b/src/setup/joystick.c index 3d2b713b..0094dd81 100644 --- a/src/setup/joystick.c +++ b/src/setup/joystick.c @@ -38,7 +38,7 @@ typedef enum CALIBRATE_UP, } calibration_stage_t; -// SDL joystick successfully initialised? +// SDL joystick successfully initialized? static int joystick_initted = 0; diff --git a/src/setup/mainmenu.c b/src/setup/mainmenu.c index 3b79bc94..46e4b4e6 100644 --- a/src/setup/mainmenu.c +++ b/src/setup/mainmenu.c @@ -19,6 +19,7 @@ // 02111-1307, USA. // +#include <stdio.h> #include <stdlib.h> #include <string.h> @@ -175,6 +176,10 @@ void MainMenu(void) TXT_SetWindowAction(window, TXT_HORIZ_LEFT, quit_action); } +// +// Initialize all configuration variables, load config file, etc +// + static void InitConfig(void) { InitBindings(); @@ -228,7 +233,7 @@ static void SetIcon(void) } // -// Initialise and run the textscreen GUI. +// Initialize and run the textscreen GUI. // static void RunGUI(void) @@ -237,7 +242,7 @@ static void RunGUI(void) if (!TXT_Init()) { - fprintf(stderr, "Failed to initialise GUI\n"); + fprintf(stderr, "Failed to initialize GUI\n"); exit(-1); } diff --git a/src/setup/multiplayer.c b/src/setup/multiplayer.c index 131ec068..f3b3221d 100644 --- a/src/setup/multiplayer.c +++ b/src/setup/multiplayer.c @@ -783,7 +783,7 @@ void SetChatMacroDefaults(void) HUSTR_CHATMACRO0, }; - // If the chat macros have not been set, initialise with defaults. + // If the chat macros have not been set, initialize with defaults. for (i=0; i<10; ++i) { diff --git a/src/setup/sound.c b/src/setup/sound.c index 0361ac62..97037ee9 100644 --- a/src/setup/sound.c +++ b/src/setup/sound.c @@ -23,6 +23,8 @@ #include <stdlib.h> +#include "SDL_mixer.h" + #include "textscreen.h" #include "m_config.h" @@ -60,19 +62,10 @@ static char *musicmode_strings[] = "CD audio" }; -// Disable MIDI music on OSX: there are problems with the native -// MIDI code in SDL_mixer. - -#ifdef __MACOSX__ -#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE -#else -#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB -#endif - // Config file variables: int snd_sfxdevice = SNDDEVICE_SB; -int snd_musicdevice = DEFAULT_MUSIC_DEVICE; +int snd_musicdevice = SNDDEVICE_SB; int snd_samplerate = 22050; static int numChannels = 8; @@ -237,5 +230,21 @@ void BindSoundVariables(void) M_BindVariable("snd_sbirq", &snd_sbirq); M_BindVariable("snd_sbdma", &snd_sbdma); M_BindVariable("snd_mport", &snd_mport); + + // 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/w_merge.c b/src/w_merge.c index 8f5690c9..150f075c 100644 --- a/src/w_merge.c +++ b/src/w_merge.c @@ -144,7 +144,7 @@ static void SetupLists(void) SetupList(&pwad_sprites, &pwad, "S_START", "S_END", "SS_START", "SS_END"); } -// Initialise the replace list +// Initialize the replace list static void InitSpriteList(void) { |