- added a $musicalias command to SNDINFO that allows remapping of music tracks. Mapping to 'none' means that starting the remapped song will have no effect at all. There's one limitation though: If you load a WAD with the same music name after the one with the SNDINFO lump the mapping will be ignored. This is so that music resources can use this command without interfering with WADs that replace the music with their own.

SVN r3002 (trunk)
This commit is contained in:
Christoph Oelckers 2010-11-08 17:24:27 +00:00
parent aa2e14b27f
commit 2fcf1af21b
3 changed files with 41 additions and 1 deletions

View file

@ -149,6 +149,7 @@ enum SICommands
SI_IfStrife,
SI_Rolloff,
SI_Volume,
SI_MusicAlias,
};
// Blood was a cool game. If Monolith ever releases the source for it,
@ -183,6 +184,7 @@ struct FSavedPlayerSoundInfo
};
// This specifies whether Timidity or Windows playback is preferred for a certain song (only useful for Windows.)
MusicAliasMap MusicAliases;
MidiDeviceMap MidiDevices;
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
@ -241,6 +243,7 @@ static const char *SICommandStrings[] =
"$ifstrife",
"$rolloff",
"$volume",
"$musicalias",
NULL
};
@ -254,6 +257,7 @@ static bool PlayerClassesIsSorted;
static TArray<FPlayerClassLookup> PlayerClassLookups;
static TArray<FPlayerSoundHashTable> PlayerSounds;
static FString DefPlayerClassName;
static int DefPlayerClass;
@ -1285,6 +1289,32 @@ static void S_AddSNDINFO (int lump)
}
break;
case SI_MusicAlias: {
sc.MustGetString();
int lump = Wads.CheckNumForName(sc.String, ns_music);
if (lump >= 0)
{
// do not set the alias if a later WAD defines its own music of this name
int file = Wads.GetLumpFile(lump);
int sndifile = Wads.GetLumpFile(sc.LumpNum);
if (file > sndifile)
{
sc.MustGetString();
continue;
}
}
FName alias = sc.String;
sc.MustGetString();
FName mapped = sc.String;
// only set the alias if the lump it maps to exists.
if (mapped == NAME_None || Wads.CheckNumForName(sc.String, ns_music) >= 0)
{
MusicAliases[alias] = mapped;
}
}
break;
case SI_MidiDevice: {
sc.MustGetString();
FName nm = sc.String;

View file

@ -2386,8 +2386,16 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
int offset = 0, length = 0;
int device = MDEV_DEFAULT;
MusInfo *handle = NULL;
FName musicasname = musicname;
int *devp = MidiDevices.CheckKey(FName(musicname));
FName *aliasp = MusicAliases.CheckKey(musicasname);
if (aliasp != NULL)
{
musicname = (musicasname = *aliasp).GetChars();
if (musicasname == NAME_None) return true;
}
int *devp = MidiDevices.CheckKey(musicasname);
if (devp != NULL) device = *devp;
// Strip off any leading file:// component.

View file

@ -382,8 +382,10 @@ enum EMidiDevice
MDEV_GUS = 5,
};
typedef TMap<FName, FName> MusicAliasMap;
typedef TMap<FName, int> MidiDeviceMap;
extern MusicAliasMap MusicAliases;
extern MidiDeviceMap MidiDevices;
#endif