- Added support for Risen3D/PrBoom+'s MUSINFO lump.

SVN r2366 (trunk)
This commit is contained in:
Christoph Oelckers 2010-06-13 08:47:38 +00:00
parent 2aa7cdc5a8
commit 4d86ebddf9
6 changed files with 97 additions and 3 deletions

View file

@ -239,6 +239,7 @@ struct FOptionalMapinfoDataPtr
}; };
typedef TMap<FName, FOptionalMapinfoDataPtr> FOptData; typedef TMap<FName, FOptionalMapinfoDataPtr> FOptData;
typedef TMap<int, FName> FMusicMap;
struct level_info_t struct level_info_t
{ {
@ -298,6 +299,7 @@ struct level_info_t
float teamdamage; float teamdamage;
FOptData optdata; FOptData optdata;
FMusicMap MusicMap;
TArray<FSpecialAction> specialactions; TArray<FSpecialAction> specialactions;

View file

@ -4290,6 +4290,11 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
mthing->args[0] = mthing->type - 14000; mthing->args[0] = mthing->type - 14000;
mthing->type = 14065; mthing->type = 14065;
} }
else if (mthing->type >= 14101 && mthing->type <= 14164)
{
mthing->args[0] = mthing->type - 14100;
mthing->type = 14165;
}
// find which type to spawn // find which type to spawn
i = DoomEdMap.FindType (mthing->type); i = DoomEdMap.FindType (mthing->type);

View file

@ -2111,3 +2111,82 @@ void AAmbientSound::Deactivate (AActor *activator)
} }
} }
} }
//==========================================================================
//
// S_ParseMusInfo
// Parses MUSINFO lump.
//
//==========================================================================
void S_ParseMusInfo()
{
int lastlump = 0, lump;
while ((lump = Wads.FindLump ("MUSINFO", &lastlump)) != -1)
{
FScanner sc(lump);
while (sc.GetString())
{
level_info_t *map = FindLevelInfo(sc.String);
if (map == NULL)
{
// Don't abort for invalid maps
sc.ScriptMessage("Unknown map '%s'", sc.String);
}
while (sc.CheckNumber())
{
int index = sc.Number;
sc.MustGetString();
if (index > 0)
{
FName music = sc.String;
if (map != NULL)
{
map->MusicMap[index] = music;
}
}
}
}
}
}
//==========================================================================
//
// Music changer. Uses the sector action class to do its job
//
//==========================================================================
class AMusicChanger : public ASectorAction
{
DECLARE_CLASS (AMusicChanger, ASectorAction)
public:
virtual bool TriggerAction (AActor *triggerer, int activationType);
};
IMPLEMENT_CLASS(AMusicChanger)
bool AMusicChanger::TriggerAction (AActor *triggerer, int activationType)
{
if (activationType & SECSPAC_Enter)
{
if (args[0] != 0)
{
FName *music = level.info->MusicMap.CheckKey(args[0]);
if (music != NULL)
{
S_ChangeMusic(music->GetChars(), args[1]);
}
}
else
{
S_ChangeMusic("*");
}
}
return Super::TriggerAction (triggerer, activationType);
}

View file

@ -323,6 +323,7 @@ void S_InitData ()
LastLocalSndInfo = LastLocalSndSeq = ""; LastLocalSndInfo = LastLocalSndSeq = "";
S_ParseSndInfo (); S_ParseSndInfo ();
S_ParseSndSeq (-1); S_ParseSndSeq (-1);
S_ParseMusInfo();
} }
//========================================================================== //==========================================================================

View file

@ -353,6 +353,7 @@ void S_ShrinkPlayerSoundLists ();
void S_UnloadSound (sfxinfo_t *sfx); void S_UnloadSound (sfxinfo_t *sfx);
sfxinfo_t *S_LoadSound(sfxinfo_t *sfx); sfxinfo_t *S_LoadSound(sfxinfo_t *sfx);
unsigned int S_GetMSLength(FSoundID sound); unsigned int S_GetMSLength(FSoundID sound);
void S_ParseMusInfo();
// [RH] Prints sound debug info to the screen. // [RH] Prints sound debug info to the screen.
// Modelled after Hexen's noise cheat. // Modelled after Hexen's noise cheat.
@ -373,9 +374,9 @@ enum EMidiDevice
{ {
MDEV_DEFAULT = -1, MDEV_DEFAULT = -1,
MDEV_MMAPI = 0, MDEV_MMAPI = 0,
MDEV_TIMIDITY = 1, MDEV_OPL = 1,
MDEV_OPL = 2, MDEV_FMOD = 2,
MDEV_FMOD = 3, MDEV_TIMIDITY = 3,
}; };
typedef TMap<FName, int> MidiDeviceMap; typedef TMap<FName, int> MidiDeviceMap;

View file

@ -73,3 +73,9 @@ ACTOR SecActHitFakeFloor : SectorAction 9989 native
{ {
} }
// Music changer ----------------------------------
ACTOR MusicChanger : SectorAction 14165 native
{
}