Update of /cvsroot/netrek/client/netrekxp/src In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv30543/src Modified Files: cowmain.c data.c death.c defaults.c newwin.c parsemeta.c sound.c Log Message: Fixed bug with metaserver - if server entry in metacache indicated one status, and we receive a new server packet with a different status, that packet is no long rejected based on packet age, new packets are considered priority in case of such a difference. Added 9 new star trek theme songs. Added 3 new netrekrc options (newSoundEffects, newSoundMusic, and newSoundMusicBkgd) that allow for sound effect and music playback to be toggled separately. Random intro sounds (instead of just the typical Kirk intro) - now all 5 trek series are represented. Random genocide sounds (4 end themes from the trek series). Music now fades out over 5 seconds upon entering game, rather than ending abruptly. Index: sound.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/sound.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- sound.c 13 Dec 2006 03:14:55 -0000 1.19 +++ sound.c 31 Jan 2007 07:06:37 -0000 1.20 @@ -29,6 +29,7 @@ #include "proto.h" Mix_Chunk *newsounds[NUM_WAVES]; +Mix_Music *newmusic[NUM_MUSIC]; /* Each sound has a priority which controls what can override what Currently these are set as follows: @@ -144,6 +145,32 @@ return(1); } +/* + * Load the .ogg files into the music arrays + */ +int loadMusic(void) { + int i; + + newmusic[INTRO1_MUSIC] = Mix_LoadMUS(DATAFILE("intro_theme_TOS.ogg")); + newmusic[INTRO2_MUSIC] = Mix_LoadMUS(DATAFILE("intro_theme_TNG.ogg")); + newmusic[INTRO3_MUSIC] = Mix_LoadMUS(DATAFILE("intro_theme_VOY.ogg")); + newmusic[INTRO4_MUSIC] = Mix_LoadMUS(DATAFILE("intro_theme_DS9.ogg")); + newmusic[INTRO5_MUSIC] = Mix_LoadMUS(DATAFILE("intro_theme_ENT.ogg")); + newmusic[END1_MUSIC] = Mix_LoadMUS(DATAFILE("end_theme_TOS.ogg")); + newmusic[END2_MUSIC] = Mix_LoadMUS(DATAFILE("end_theme_TNG.ogg")); + newmusic[END3_MUSIC] = Mix_LoadMUS(DATAFILE("end_theme_VOY.ogg")); + newmusic[END4_MUSIC] = Mix_LoadMUS(DATAFILE("end_theme_DS9.ogg")); + + for (i=0; i < NUM_MUSIC; i++) { + if (!newmusic[i]) { + LineToConsole("Mix_LoadMUS newmusic[%d] could not be loaded. Check soundDir in your .netrekrc: %s\n", i, Mix_GetError()); + return(-1); + } + } + + return(1); +} + extern void Exit_Sound (void) { if (sound_init) @@ -174,6 +201,8 @@ if (newSound) { + int i; + #ifdef DEBUG LineToConsole ("Init_Sound using SDL\n"); #endif @@ -188,15 +217,15 @@ if (Mix_OpenAudio(22050, AUDIO_S16SYS, 2, 1024) < 0) LineToConsole("Mix_OpenAudio: %s\n", Mix_GetError()); - /* If we successfully loaded the wav files, so shut-off sound_init and play - * the introduction - */ - if (loadSounds()) - { - if (Mix_PlayChannel(-1, newsounds[INTRO_WAV], 0) < 0) - LineToConsole("Mix_PlayChannel: %s\n", Mix_GetError()); - } + /* Toggle on sound, and load sound files */ sound_toggle = 1; + loadSounds(); + + /* Toggle on music, load music files, and play random intro music */ + music_toggle = 1; + loadMusic(); + i = RANDOM() % MUSIC_OFFSET; + Play_Music(i); /* See if volume is adjustable */ CheckVolumeSettings (); /* Default of 8 channels not enough */ @@ -236,7 +265,7 @@ { int channel; - if (!sound_init || !sound_toggle) + if (!sound_init || !newSoundEffects || !sound_toggle) return; if ((type >= NUM_WAVES) || (type < 0)) @@ -278,11 +307,12 @@ current_sound = NO_SOUND; } } + extern void Play_Sound_Loc (int type, int angle, int distance) { int channel; - if (!sound_init || !sound_toggle) + if (!sound_init || !newSoundEffects || !sound_toggle) return; if ((type >= NUM_WAVES) || (type < 0)) @@ -324,6 +354,48 @@ return; } +/* Only works with SDL, i.e. newSound */ +extern void Play_Music (int type) +{ + if (!sound_init || !newSound || !newSoundMusic || !music_toggle) + return; + + if ((type >= NUM_MUSIC) || (type < 0)) + { + LineToConsole("Invalid music type %d\n", type); + return; + } + + if (Mix_PlayMusic(newmusic[type], 1) < 0) + { + LineToConsole("Mix_PlayMusic: %s\n", Mix_GetError()); + return; + } +} + +/* Only works with SDL, i.e. newSound */ +extern void Play_Music_Bkgd (void) +{ + int i; + + if (!sound_init || !newSound || !newSoundMusic || !newSoundMusicBkgd|| !music_toggle) + return; + + if (Mix_PlayingMusic()) + return; + + i = RANDOM() % NUM_MUSIC; + + if (Mix_PlayMusic(newmusic[i], 1) < 0) + { + LineToConsole("Mix_PlayMusic: %s\n", Mix_GetError()); + return; + } + /* So we play another one when done */ + Mix_HookMusicFinished(Play_Music_Bkgd); + +} + void Group_Sound (int type, int channel) { // Add channel to group by type, useful for aborting specific sounds @@ -375,8 +447,11 @@ #define SOUND_INIT MESSAGE_SOUND + 2 #define SOUND_DONE MESSAGE_SOUND + 3 -#define SDL_SOUND_ANGLE 1 -#define SDL_SOUND_DONE 2 +#define SDL_EFFECTS_TOGGLE 1 +#define SDL_MUSIC_TOGGLE 2 +#define SDL_MUSIC_BKGD 3 +#define SDL_SOUND_ANGLE 4 +#define SDL_SOUND_DONE 5 static void soundrefresh (int i); static void sdlsoundrefresh (int i); @@ -408,6 +483,21 @@ sprintf (buf, "Sound is turned %s", (sound_toggle == 1) ? "ON" : "OFF"); } + else if (i == SDL_EFFECTS_TOGGLE) + { + sprintf (buf, "Sound effects are turned %s", + (newSoundEffects == 1) ? "ON" : "OFF"); + } + else if (i == SDL_MUSIC_TOGGLE) + { + sprintf (buf, "Music is turned %s", + (newSoundMusic == 1) ? "ON" : "OFF"); + } + else if (i == SDL_MUSIC_BKGD) + { + sprintf (buf, "Background music is turned %s", + (newSoundMusicBkgd == 1) ? "ON" : "OFF"); + } else if (i == SDL_SOUND_ANGLE) { sprintf (buf, "Angular sound is turned %s", @@ -544,8 +634,40 @@ { if (sound_init) sound_toggle = (sound_toggle == 1) ? 0 : 1; + // Halt all sounds if toggled off + if (!sound_toggle) + { + Mix_HaltChannel(-1); + Mix_HaltMusic(); + } sdlsoundrefresh (SOUND_TOGGLE); } + else if (i == SDL_EFFECTS_TOGGLE) + { + if (sound_init) + newSoundEffects = (newSoundEffects) ? 0 : 1; + if (!newSoundEffects) + Mix_HaltChannel(-1); + sdlsoundrefresh (SDL_EFFECTS_TOGGLE); + } + else if (i == SDL_MUSIC_TOGGLE) + { + if (sound_init) + newSoundMusic = (newSoundMusic) ? 0 : 1; + if (!newSoundMusic) + Mix_HaltMusic(); + sdlsoundrefresh (SDL_MUSIC_TOGGLE); + } + else if (i == SDL_MUSIC_BKGD) + { + if (sound_init) + newSoundMusicBkgd = (newSoundMusicBkgd) ? 0 : 1; + if (!newSoundMusicBkgd) + Mix_HaltMusic(); + else + Play_Music_Bkgd(); + sdlsoundrefresh (SDL_MUSIC_BKGD); + } else if (i == SDL_SOUND_ANGLE) { newSoundAngles = (newSoundAngles) ? 0 : 1; Index: newwin.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/newwin.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- newwin.c 30 Nov 2006 11:28:57 -0000 1.45 +++ newwin.c 31 Jan 2007 07:06:37 -0000 1.46 @@ -1012,8 +1012,8 @@ { if (newSound) { - soundWin = W_MakeMenu("sound", WINSIDE + 20, -BORDER + 10, 30, - 3, NULL, 2); + soundWin = W_MakeMenu("sound", WINSIDE + 20, -BORDER + 10, 33, + 6, NULL, 2); W_SetWindowKeyDownHandler(soundWin, sdlsoundaction); W_SetWindowButtonHandler(soundWin, sdlsoundaction); W_DefineArrowCursor(soundWin); Index: cowmain.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/cowmain.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- cowmain.c 10 Dec 2006 02:49:14 -0000 1.19 +++ cowmain.c 31 Jan 2007 07:06:37 -0000 1.20 @@ -1083,7 +1083,11 @@ #ifdef SOUND if (newSound) { - Mix_HaltChannel(-1); /* Kill all currently playing sounds when entering game */ + /* Kill all currently playing sounds when entering game */ + Mix_HaltChannel(-1); + /* Fade out any music playing over 5 seconds */ + if (Mix_PlayingMusic()) + Mix_FadeOutMusic(5000); Play_Sound(ENTER_SHIP_WAV); } else Index: death.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/death.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- death.c 11 Jun 2006 20:53:52 -0000 1.11 +++ death.c 31 Jan 2007 07:06:37 -0000 1.12 @@ -152,6 +152,13 @@ W_TileWindow (mapw, genopic2); break; } +#ifdef SOUND + if (newSound) + { + i = MUSIC_OFFSET + (RANDOM() % MUSIC_OFFSET); // Play random end theme + Play_Music(i); + } +#endif break; case KGHOST: strcpy (deathmessage, "You were killed by a confused daemon."); @@ -176,6 +183,13 @@ W_TileWindow (mapw, genopic2); break; } +#ifdef SOUND + if (newSound) + { + i = MUSIC_OFFSET + (RANDOM() % MUSIC_OFFSET); // Play random end theme + Play_Music(i); + } +#endif break; case KPROVIDENCE: strcpy (deathmessage, "You were nuked by GOD."); Index: defaults.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/defaults.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- defaults.c 13 Dec 2006 03:14:53 -0000 1.37 +++ defaults.c 31 Jan 2007 07:06:37 -0000 1.38 @@ -339,6 +339,24 @@ NULL } }, + {"newSoundEffects", &newSoundEffects, RC_BOOL, + { + "Play sound effects (newSound only)", + NULL + } + }, + {"newSoundMusic", &newSoundMusic, RC_BOOL, + { + "Play music (newSound only)", + NULL + } + }, + {"newSoundMusicBkgd", &newSoundMusicBkgd, RC_BOOL, + { + "Play theme music in background (requires newSound and newSoundMusic)", + NULL + } + }, {"newSoundAngles", &newSoundAngles, RC_BOOL, { "Use 3D sound effects (only works if newSound is on)", @@ -1498,6 +1516,9 @@ allowWheelActions = booleanDefault ("allowWheelActions", allowWheelActions); newQuit = booleanDefault ("newQuit", newQuit); newSound = booleanDefault ("newSound", newSound); + newSoundEffects= booleanDefault ("newMusic", newSoundEffects); + newSoundMusic = booleanDefault ("newMusicPlayRandom", newSoundMusic); + newSoundMusicBkgd = booleanDefault ("newSoundMusicBkgd", newSoundMusicBkgd); newSoundAngles = booleanDefault ("newSoundAngles", newSoundAngles); useFullShipInfo = booleanDefault ("useFullShipInfo", useFullShipInfo); tpDotDist = intDefault ("tpDotDist", tpDotDist); Index: data.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/data.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- data.c 13 Dec 2006 00:00:00 -0000 1.47 +++ data.c 31 Jan 2007 07:06:37 -0000 1.48 @@ -632,6 +632,7 @@ #ifdef SOUND int sound_init = 1; int sound_toggle = 0; +int music_toggle = 0; char *sounddir = NULL; W_Window soundWin = NULL; @@ -786,9 +787,12 @@ WNDPROC lpfnDefRichEditWndProc; /* default window proc */ -int richText = 0; /* temporary variable to select rich text message windows */ -int newQuit = 0; /* new quit clock */ -int newSound = 1; /* use new SDL sound */ -int newSoundAngles = 1; /* use new SDL sound with angular 3d component */ +int richText = 0; /* temporary variable to select rich text message windows */ +int newQuit = 0; /* new quit clock */ +int newSound = 1; /* Use new SDL sound interface */ +int newSoundEffects = 1; /* Use SDL sound effects playback */ +int newSoundMusic = 1; /* Use SDL music playback */ +int newSoundMusicBkgd = 0; /* Play random background music continuously */ +int newSoundAngles = 1; /* Use SDL with angular 3D sound */ int useFullShipInfo = 1; /* Prefer SP_PLAYER packets over SP_S_PLAYER packets */ \ No newline at end of file Index: parsemeta.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/parsemeta.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- parsemeta.c 29 Jan 2007 10:34:23 -0000 1.28 +++ parsemeta.c 31 Jan 2007 07:06:37 -0000 1.29 @@ -589,9 +589,11 @@ sp->pkt_rtt[j] = (unsigned long) -1; #endif } - /* if it was found, check age */ + /* if it was found, check age. Don't update if old entry is newer or + of the same age. However, make sure status hasn't changed. If status + differs, we want to use the new information packet regardless of age. */ else { - if ((now-age) < (sp->when-sp->age)) { + if ((now-age) < (sp->when-sp->age) && (sp->status == tempstatus)) { sp->age = (int)now - (int)(sp->when-sp->age); sp->when = now; sp->refresh = 1;