It works by first generating a list of available music by iterating levelinfo nodes and then picking one at random.
Here's the code:
Code: Select all
class RandomMusicPlayer : eventhandler
{
string MusicSelection;
override void OnRegister()
{
ChangeMusicRandom();
}
void ChangeMusicRandom()
{
if (!MusicSelection) MusicSelection = GetRandomMusicLump();
if (MusicSelection)
{
console.printf("RandomMusicPlayer: Playing music: "..MusicSelection);
S_ChangeMusic(MusicSelection);
}
else
{
console.printf("RandomMusicPlayer: No valid music lumps found.");
}
}
string GetRandomMusicLump()
{
array<string> MusicList;
int LevelInfosCount=levelinfo.GetLevelInfoCount();
for (int i = 0; i < LevelInfosCount; i++)
{
levelinfo li = levelinfo.GetLevelInfo(i);
string musicLump=li.music;
// because of a quirk in how Doom/2 music is handled
if (musicLump.left(1) == "$") musicLump="D_"..stringtable.localize(musicLump);
if (MusicLump && wads.findlump(MusicLump) >= 0)
{
//console.printf("Music for level "..li.levelnum..": "..li.music.." = "..MusicLump);//debug
MusicList.push(musicLump);
}
}
if (MusicList.size() > 0)
{
return MusicList[random(0,MusicList.size() - 1)];
}
else
{
return "";
}
}
}