Massive sound cleanup, fixing a lot of vehicle sounds

This commit is contained in:
Lwmte 2022-05-29 21:06:40 +03:00
parent 39a3e1f8c1
commit 3990bc51e8
45 changed files with 673 additions and 526 deletions

View file

@ -577,7 +577,7 @@ void LaraControl(ItemInfo* item, CollisionInfo* coll)
lara->Control.WaterStatus = WaterStatus::TreadWater;
UpdateItemRoom(item, -(STEPUP_HEIGHT - 3));
SoundEffect(SFX_TR4_LARA_BREATH, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_BREATH, &item->Pose, SoundEnvironment::Always);
}
}
}
@ -591,7 +591,7 @@ void LaraControl(ItemInfo* item, CollisionInfo* coll)
lara->Control.WaterStatus = WaterStatus::TreadWater;
UpdateItemRoom(item, 0);
SoundEffect(SFX_TR4_LARA_BREATH, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_BREATH, &item->Pose, SoundEnvironment::Always);
}
break;

View file

@ -244,7 +244,7 @@ void DrawFlare(ItemInfo* laraItem)
{
if (armFrame == 72)
{
SoundEffect(SFX_TR4_OBJ_GEM_SMASH, &laraItem->Pose, TestEnvironment(ENV_FLAG_WATER, laraItem));
SoundEffect(SFX_TR4_OBJ_GEM_SMASH, &laraItem->Pose, (SoundEnvironment)TestEnvironment(ENV_FLAG_WATER, laraItem));
lara->Flare.Life = 1;
}

View file

@ -457,7 +457,12 @@ void UpdateLaraSubsuitAngles(ItemInfo* item)
lara->Control.Subsuit.Velocity[1] = SECTOR(1.5f);
if (lara->Control.Subsuit.Velocity[0] != 0 || lara->Control.Subsuit.Velocity[1] != 0)
SoundEffect(SFX_TR5_DIVE_SUIT_ENGINE, &item->Pose, (((lara->Control.Subsuit.Velocity[0] + lara->Control.Subsuit.Velocity[1]) * 4) & 0x1F00) + 10);
{
auto mul1 = (float)abs(lara->Control.Subsuit.Velocity[0]) / SECTOR(8);
auto mul2 = (float)abs(lara->Control.Subsuit.Velocity[1]) / SECTOR(8);
auto vol = ((mul1 + mul2) * 5.0f) + 0.5f;
SoundEffect(SFX_TR5_DIVE_SUIT_ENGINE, &item->Pose, SoundEnvironment::Water, 1.0f + (mul1 + mul2), vol);
}
}
void ModulateLaraSubsuitSwimTurn(ItemInfo* item)

View file

@ -161,7 +161,7 @@ void AnimateShotgun(ItemInfo* laraItem, LaraWeaponType weaponType)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, &laraItem->Pose);
}
}
@ -192,7 +192,7 @@ void AnimateShotgun(ItemInfo* laraItem, LaraWeaponType weaponType)
SoundEffect(SFX_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->pos, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->pos, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_HK_FIRE, &laraItem->pos);
}
}*/
@ -237,7 +237,7 @@ void AnimateShotgun(ItemInfo* laraItem, LaraWeaponType weaponType)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, &laraItem->Pose);
}
}
@ -263,7 +263,7 @@ void AnimateShotgun(ItemInfo* laraItem, LaraWeaponType weaponType)
SoundEffect(SFX_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->pos, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->pos, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_HK_FIRE, &laraItem->pos);
}
}*/
@ -352,7 +352,7 @@ void FireShotgun(ItemInfo* laraItem)
lara->RightArm.FlashGun = Weapons[(int)LaraWeaponType::Shotgun].FlashTime;
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, 20971524);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, (SoundEnvironment)TestEnvironment(ENV_FLAG_WATER, laraItem));
SoundEffect(Weapons[(int)LaraWeaponType::Shotgun].SampleNum, &laraItem->Pose);
Statistics.Game.AmmoUsed++;
@ -1116,7 +1116,7 @@ void GrenadeControl(short itemNumber)
AlertNearbyGuards(item);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, ENV_FLAG_NONE, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
// Setup the counter for spawned grenades in the case of flash and super grenades ammos
@ -1412,7 +1412,7 @@ void RocketControl(short itemNumber)
AlertNearbyGuards(item);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, ENV_FLAG_NONE, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
@ -1710,7 +1710,7 @@ void CrossbowBoltControl(short itemNumber)
AlertNearbyGuards(item);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, ENV_FLAG_NONE, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);

View file

@ -124,7 +124,7 @@ void AnimatePistols(ItemInfo* laraItem, LaraWeaponType weaponType)
lara->RightArm.FlashGun = weapon->FlashTime;
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, ENV_FLAG_NONE, 0.9f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, SoundEnvironment::Land, 0.9f, 0.5f);
SoundEffect(weapon->SampleNum, &laraItem->Pose);
soundPlayed = true;
@ -217,7 +217,7 @@ void AnimatePistols(ItemInfo* laraItem, LaraWeaponType weaponType)
if (!soundPlayed)
{
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, 0, 0.9f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &laraItem->Pose, SoundEnvironment::Land, 0.9f, 0.5f);
SoundEffect(weapon->SampleNum, &laraItem->Pose);
}

View file

@ -106,13 +106,17 @@ void AnimateLara(ItemInfo* item)
cmd += 2;
break;
}
flags = cmd[1] & 0xC000;
if (flags == (int)SOUND_PLAYCONDITION::LandAndWater ||
(flags == (int)SOUND_PLAYCONDITION::Land && (lara->WaterSurfaceDist >= 0 || lara->WaterSurfaceDist == NO_HEIGHT)) ||
(flags == (int)SOUND_PLAYCONDITION::Water && lara->WaterSurfaceDist < 0 && lara->WaterSurfaceDist != NO_HEIGHT && !TestEnvironment(ENV_FLAG_SWAMP, item)))
else
{
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SFX_ALWAYS);
flags = cmd[1] & 0xC000;
auto condition = flags ? (flags == (1 << 14) ? SoundEnvironment::Land : SoundEnvironment::Water) : SoundEnvironment::Always;
if (condition == SoundEnvironment::Always ||
(condition == SoundEnvironment::Land && (lara->WaterSurfaceDist >= 0 || lara->WaterSurfaceDist == NO_HEIGHT)) ||
(condition == SoundEnvironment::Water && lara->WaterSurfaceDist < -CLICK(0.5f) && lara->WaterSurfaceDist != NO_HEIGHT && !TestEnvironment(ENV_FLAG_SWAMP, item)))
{
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SoundEnvironment::Always);
}
}
cmd += 2;
@ -304,22 +308,19 @@ void AnimateItem(ItemInfo* item)
item->Pose.Position.y = LaraItem->Pose.Position.y - 762;
item->Pose.Position.z = LaraItem->Pose.Position.z;
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SFX_ALWAYS);
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SoundEnvironment::Always);
}
else if (TestEnvironment(ENV_FLAG_WATER, item))
{
if (!flags || flags == (int)SOUND_PLAYCONDITION::Water && (TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber) || Objects[item->ObjectNumber].intelligent))
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SFX_ALWAYS);
if (!flags || flags == (int)SoundEnvironment::Water && (TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber) || Objects[item->ObjectNumber].intelligent))
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SoundEnvironment::Always);
}
else if (!flags || flags == (int)SOUND_PLAYCONDITION::Land && !TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber))
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SFX_ALWAYS);
else if (!flags || flags == (int)SoundEnvironment::Land && !TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber))
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, SoundEnvironment::Always);
}
else
{
if (TestEnvironment(ENV_FLAG_WATER, item))
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, ENV_FLAG_WATER);
else
SoundEffect(cmd[1] & 0x3FFF, &item->Pose);
SoundEffect(cmd[1] & 0x3FFF, &item->Pose, (SoundEnvironment)TestEnvironment(ENV_FLAG_WATER, item));
}
break;

View file

@ -1196,7 +1196,7 @@ void BinocularCamera(ItemInfo* item)
if (BinocularRange < ANGLE(0.7f))
BinocularRange = ANGLE(0.7f);
else
SoundEffect(SFX_TR4_BINOCULARS_ZOOM, nullptr, 0, 0.9f);
SoundEffect(SFX_TR4_BINOCULARS_ZOOM, nullptr, SoundEnvironment::Land, 0.9f);
}
else if (InputBusy & IN_CROUCH)
{
@ -1204,7 +1204,7 @@ void BinocularCamera(ItemInfo* item)
if (BinocularRange > ANGLE(8.5f))
BinocularRange = ANGLE(8.5f);
else
SoundEffect(SFX_TR4_BINOCULARS_ZOOM, nullptr, 0, 1.0f);
SoundEffect(SFX_TR4_BINOCULARS_ZOOM, nullptr, SoundEnvironment::Land, 1.0f);
}
auto src = Vector3Int(Camera.pos.x, Camera.pos.y, Camera.pos.z);
@ -1253,7 +1253,7 @@ void BinocularCamera(ItemInfo* item)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, SoundEnvironment::Land, 1.0f, 0.4f);
//SoundEffect(SFX_TR4_LARA_HK_FIRE, nullptr);
}
}
@ -1274,7 +1274,7 @@ void BinocularCamera(ItemInfo* item)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, nullptr);
}
}
@ -1286,7 +1286,7 @@ void BinocularCamera(ItemInfo* item)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, nullptr);
}
}
@ -1299,7 +1299,7 @@ void BinocularCamera(ItemInfo* item)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, nullptr);
}
}
@ -1312,7 +1312,7 @@ void BinocularCamera(ItemInfo* item)
SoundEffect(SFX_TR4_LARA_HK_SILENCED, nullptr);
else
{
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, ENV_FLAG_NONE, 1.0f, 0.4f);
SoundEffect(SFX_TR4_EXPLOSION1, nullptr, SoundEnvironment::Land, 1.0f, 0.4f);
SoundEffect(SFX_TR4_LARA_HK_FIRE, nullptr);
}
}
@ -1394,7 +1394,7 @@ void CalculateCamera()
// Camera is in a water room, play water sound effect.
if (TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber))
{
SoundEffect(SFX_TR4_UNDERWATER, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_UNDERWATER, nullptr, SoundEnvironment::Always);
if (Camera.underwater == false)
Camera.underwater = true;
}
@ -1931,7 +1931,7 @@ void ItemsCollideCamera()
void RumbleScreen()
{
if (!(GlobalCounter & 0x1FF))
SoundEffect(SFX_TR5_KLAXON, nullptr, 4104);
SoundEffect(SFX_TR5_KLAXON, nullptr, SoundEnvironment::Land, 0.25f);
if (RumbleTimer >= 0)
RumbleTimer++;

View file

@ -614,7 +614,7 @@ GameStatus DoLevel(int index, std::string const& ambient, bool loadFromSavegame)
}
// Play default background music
PlaySoundTrack(ambient, SOUNDTRACK_PLAYTYPE::BGM);
PlaySoundTrack(ambient, SoundTrackType::BGM);
// Restore the game?
if (loadFromSavegame)

View file

@ -1040,7 +1040,7 @@ void LaraBubbles(ItemInfo* item)
Vector3Int pos;
int num, i;
SoundEffect(SFX_TR4_LARA_BUBBLES, &item->Pose, ENV_FLAG_WATER);
SoundEffect(SFX_TR4_LARA_BUBBLES, &item->Pose, SoundEnvironment::Water);
pos.x = 0;

View file

@ -636,7 +636,7 @@ InventoryResult GuiController::TitleOptions()
else
selected_option--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDown)
@ -646,14 +646,14 @@ InventoryResult GuiController::TitleOptions()
else
selected_option -= option_count;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDeselect && menu_to_display != Menu::Title)
{
menu_to_display = Menu::Title;
selected_option = selected_option_bak;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
}
@ -661,7 +661,7 @@ InventoryResult GuiController::TitleOptions()
{
if (menu_to_display == Menu::Title)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
switch (selected_option)
{
@ -696,7 +696,7 @@ InventoryResult GuiController::TitleOptions()
}
else if (menu_to_display == Menu::SelectLevel)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
// Level 0 is the title level, so increment the option by 1 to offset it.
g_GameFlow->SelectedLevelForNewGame = selected_option + 1;
menu_to_display = Menu::Title;
@ -709,7 +709,7 @@ InventoryResult GuiController::TitleOptions()
SayNo();
else
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
g_GameFlow->SelectedSaveGame = selected_option;
selected_option = 0;
ret = InventoryResult::LoadGame;
@ -847,7 +847,7 @@ void GuiController::HandleDisplaySettingsInput(bool pause)
else
selected_option--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDown)
@ -857,7 +857,7 @@ void GuiController::HandleDisplaySettingsInput(bool pause)
else
selected_option -= option_count;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goSelect)
@ -970,7 +970,7 @@ void GuiController::HandleControlSettingsInput(bool pause)
else
selected_option--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDown)
@ -980,7 +980,7 @@ void GuiController::HandleControlSettingsInput(bool pause)
else
selected_option -= option_count;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goSelect)
@ -1131,7 +1131,7 @@ void GuiController::HandleSoundSettingsInput(bool pause)
else
selected_option--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDown)
@ -1141,7 +1141,7 @@ void GuiController::HandleSoundSettingsInput(bool pause)
else
selected_option -= option_count;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goSelect)
@ -1217,7 +1217,7 @@ InventoryResult GuiController::DoPauseMenu()
else
selected_option--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDown)
@ -1227,7 +1227,7 @@ InventoryResult GuiController::DoPauseMenu()
else
selected_option -= option_count;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
}
@ -1236,7 +1236,7 @@ InventoryResult GuiController::DoPauseMenu()
if (menu_to_display == Menu::Pause)
{
invMode = InventoryMode::None;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
return InventoryResult::None;
}
@ -1244,7 +1244,7 @@ InventoryResult GuiController::DoPauseMenu()
{
selected_option = menu_to_display == Menu::Statistics ? 0 : 1;
menu_to_display = Menu::Pause;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
}
@ -2103,7 +2103,7 @@ void GuiController::UseCurrentItem()
if (LaraItem->HitPoints > LARA_HEALTH_MAX)
LaraItem->HitPoints = LARA_HEALTH_MAX;
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SoundEnvironment::Always);
Statistics.Game.HealthUsed++;
}
else
@ -2127,7 +2127,7 @@ void GuiController::UseCurrentItem()
Lara.PoisonPotency = 0;
LaraItem->HitPoints = LARA_HEALTH_MAX;
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SoundEnvironment::Always);
Statistics.Game.HealthUsed++;
}
else
@ -2279,7 +2279,7 @@ void GuiController::HandleInventoryMenu()
combine_type_flag = 1;
combine_obj1 = invItem;
combine_obj2 = ammoItem;
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SoundEnvironment::Always);
}
else if (ammoItem >= INV_OBJECT_SMOL_WATERSKIN && ammoItem <= INV_OBJECT_SMOL_WATERSKIN3L && invItem >= INV_OBJECT_BIG_WATERSKIN && invItem <= INV_OBJECT_BIG_WATERSKIN5L)
{
@ -2287,7 +2287,7 @@ void GuiController::HandleInventoryMenu()
{
combine_type_flag = 2;
combine_ring_fade_dir = 2;
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SoundEnvironment::Always);
return;
}
@ -2300,7 +2300,7 @@ void GuiController::HandleInventoryMenu()
{
combine_type_flag = 2;
combine_ring_fade_dir = 2;
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_COMBINE, nullptr, SoundEnvironment::Always);
return;
}
@ -2316,7 +2316,7 @@ void GuiController::HandleInventoryMenu()
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
combine_ring_fade_dir = 2;
goDeselect = 0;
}
@ -2468,12 +2468,12 @@ void GuiController::HandleInventoryMenu()
if (goUp && current_selected_option > 0)
{
current_selected_option--;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
else if (goDown && current_selected_option < n - 1)
{
current_selected_option++;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
if (ammo_active)
@ -2481,13 +2481,13 @@ void GuiController::HandleInventoryMenu()
if (goLeft && current_selected_option > 0)
{
current_selected_option--;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
if (goRight && current_selected_option < n - 1)
{
current_selected_option++;
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
}
*current_ammo_type = current_selected_option;
@ -2496,7 +2496,7 @@ void GuiController::HandleInventoryMenu()
if (goSelect)
{
if (current_options[current_selected_option].type != MenuType::Equip && current_options[current_selected_option].type != MenuType::Use)
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
switch (current_options[current_selected_option].type)
{
@ -2570,7 +2570,7 @@ void GuiController::HandleInventoryMenu()
if (goDeselect && ammo_active)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
ammo_active = 0;
rings[(int)RingTypes::Inventory]->ringactive = 1;
@ -3106,7 +3106,7 @@ void GuiController::DrawCurrentObjectList(int ringnum)
{
if (!rings[ringnum]->objlistmovement)
{
SoundEffect(SFX_TR4_MENU_ROTATE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_ROTATE, nullptr, SoundEnvironment::Always);
rings[ringnum]->objlistmovement += 8192;
if (ammo_selector_flag)
@ -3118,7 +3118,7 @@ void GuiController::DrawCurrentObjectList(int ringnum)
{
if (!rings[ringnum]->objlistmovement)
{
SoundEffect(SFX_TR4_MENU_ROTATE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_ROTATE, nullptr, SoundEnvironment::Always);
rings[ringnum]->objlistmovement -= 8192;
if (ammo_selector_flag)
@ -3194,7 +3194,7 @@ int GuiController::CallInventory(bool reset_mode)
if (DbInput & IN_OPTION)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
val = 1;
}
@ -3257,7 +3257,7 @@ void GuiController::DoStatisticsMode()
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
invMode = InventoryMode::None;
}
@ -3269,7 +3269,7 @@ void GuiController::DoExamineMode()
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
invMode = InventoryMode::None;
}
@ -3291,18 +3291,18 @@ void GuiController::DoDiary()
if (goRight && Lara.Inventory.Diary.currentPage < Lara.Inventory.Diary.numPages)
{
Lara.Inventory.Diary.currentPage++;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goLeft && Lara.Inventory.Diary.currentPage > 1)
{
Lara.Inventory.Diary.currentPage--;
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
}
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
invMode = InventoryMode::None;
}
@ -3319,7 +3319,7 @@ int GuiController::DoLoad()
if (goDown)
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
if (selected_slot == SAVEGAME_MAX - 1)
selected_slot -= SAVEGAME_MAX - 1; //go back up
@ -3329,7 +3329,7 @@ int GuiController::DoLoad()
if (goUp)
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
if (selected_slot== 0)
selected_slot += SAVEGAME_MAX - 1; //go back down
@ -3343,7 +3343,7 @@ int GuiController::DoLoad()
SayNo();
else
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
g_GameFlow->SelectedSaveGame = selected_slot;
ExitInvLoop = 1;
return 1;
@ -3352,7 +3352,7 @@ int GuiController::DoLoad()
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
invMode = InventoryMode::InGame;
}
@ -3366,7 +3366,7 @@ void GuiController::DoSave()
if (goDown)
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
if (selected_slot == SAVEGAME_MAX - 1)
selected_slot -= SAVEGAME_MAX - 1; //go back up
@ -3376,7 +3376,7 @@ void GuiController::DoSave()
if (goUp)
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
if (selected_slot == 0)
selected_slot += SAVEGAME_MAX - 1; //go back down
@ -3386,14 +3386,14 @@ void GuiController::DoSave()
if (goSelect)
{
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_CHOOSE, nullptr, SoundEnvironment::Always);
SaveGame::Save(selected_slot);
ExitInvLoop = 1; //exit inv if the user has saved
}
if (goDeselect)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
goDeselect = 0;
invMode = InventoryMode::InGame;
}

View file

@ -67,7 +67,7 @@ void ControlMissile(short fxNumber)
// fx->frameNumber = -GetRandomControl()/11000;
// fx->counter = 6;
// fx->objectNumber = RICOCHET1;
SoundEffect((fx->objectNumber == ID_SCUBA_HARPOON) ? 10 : 258, &fx->pos);
SoundEffect((fx->objectNumber == ID_SCUBA_HARPOON) ? SFX_TR4_LARA_RICOCHET : SFX_TR2_CIRCLE_BLADE_HIT, &fx->pos);
}
/*else if (fx->objectNumber == DRAGON_FIRE)
{

View file

@ -71,7 +71,6 @@ struct LIGHTINFO
enum RoomEnvFlags
{
ENV_FLAG_NONE = 0x0000,
ENV_FLAG_WATER = 0x0001,
ENV_FLAG_SWAMP = 0x0004,
ENV_FLAG_OUTSIDE = 0x0008,

View file

@ -555,8 +555,8 @@ bool SaveGame::Save(int slot)
auto serializedItemsOffset = fbb.CreateVector(serializedItems);
// Soundtrack playheads
auto bgmTrackData = GetSoundTrackNameAndPosition(SOUNDTRACK_PLAYTYPE::BGM);
auto oneshotTrackData = GetSoundTrackNameAndPosition(SOUNDTRACK_PLAYTYPE::OneShot);
auto bgmTrackData = GetSoundTrackNameAndPosition(SoundTrackType::BGM);
auto oneshotTrackData = GetSoundTrackNameAndPosition(SoundTrackType::OneShot);
auto bgmTrackOffset = fbb.CreateString(bgmTrackData.first);
auto oneshotTrackOffset = fbb.CreateString(oneshotTrackData.first);
@ -969,8 +969,8 @@ bool SaveGame::Load(int slot)
//FlipTimer = s->flip_timer();
// Restore soundtracks
PlaySoundTrack(s->ambient_track()->str(), SOUNDTRACK_PLAYTYPE::BGM, s->ambient_position());
PlaySoundTrack(s->oneshot_track()->str(), SOUNDTRACK_PLAYTYPE::OneShot, s->oneshot_position());
PlaySoundTrack(s->ambient_track()->str(), SoundTrackType::BGM, s->ambient_position());
PlaySoundTrack(s->oneshot_track()->str(), SoundTrackType::OneShot, s->oneshot_position());
// Legacy soundtrack map
for (int i = 0; i < s->cd_flags()->size(); i++)

View file

@ -185,7 +185,7 @@ namespace TEN::Entities::Switches
laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 58 &&
laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 115)
{
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SoundEnvironment::Always);
}
}
else
@ -211,7 +211,7 @@ namespace TEN::Entities::Switches
laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 58 &&
laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 115)
{
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Pose, SoundEnvironment::Always);
}
}

View file

@ -264,7 +264,7 @@ void WreckingBallControl(short itemNumber)
item->Pose.Position.y = item2->Pose.Position.y + 1644;
if (item->Animation.VerticalVelocity < -32)
{
SoundEffect(SFX_TR5_BASE_CLAW_TOP_IMPACT, &item->Pose, 4104);
SoundEffect(SFX_TR5_BASE_CLAW_TOP_IMPACT, &item->Pose, SoundEnvironment::Land, 1.0f, 0.5f);
item->Animation.VerticalVelocity = -item->Animation.VerticalVelocity >> 3;
BounceCamera(item, 16, 8192);
}

View file

@ -222,7 +222,7 @@ void SkidooManControl(short riderItemNumber)
{
creatureInfo->JointRotation[0] = (creatureInfo->JointRotation[0] == 1) ? 2 : 1;
DoSnowEffect(item);
SoundEffect(SFX_TR2_SNOWMOBILE_IDLE, &item->Pose, 4 + ((0x10000 - (100 - item->Animation.Velocity) * 100) << 8));
SoundEffect(SFX_TR2_SNOWMOBILE_IDLE, &item->Pose, SoundEnvironment::Land, 0.5f + item->Animation.Velocity / 100.0f); // SKIDOO_MAX_VELOCITY. TODO: Check actual sound!
}
CreatureAnimation(itemNumber, angle, 0);

View file

@ -1043,7 +1043,7 @@ void SpeedBoatControl(short itemNumber)
sBoat->Pitch += (pitch - sBoat->Pitch) / 4;
int fx = (sBoatItem->Animation.Velocity > 8) ? SFX_TR2_SPEEDBOAT_MOVING : (drive ? SFX_TR2_SPEEDBOAT_IDLE : SFX_TR2_SPEEDBOAT_ACCELERATE);
SoundEffect(fx, &sBoatItem->Pose, ENV_FLAG_NONE, sBoat->Pitch / (float)BOAT_MAX_VELOCITY);
SoundEffect(fx, &sBoatItem->Pose, SoundEnvironment::Land, sBoat->Pitch / (float)BOAT_MAX_VELOCITY);
if (sBoatItem->Animation.Velocity && (water - 5) == sBoatItem->Pose.Position.y)
DoBoatWakeEffect(sBoatItem);

View file

@ -523,7 +523,7 @@ bool SkidooControl(ItemInfo* laraItem, CollisionInfo* coll)
skidoo->TrackMesh = ((skidoo->TrackMesh & 3) == 1) ? 2 : 1;
skidoo->Pitch += (pitch - skidoo->Pitch) / 4;
SoundEffect(skidoo->Pitch ? SFX_TR2_SNOWMOBILE_MOVING : SFX_TR2_SNOWMOBILE_ACCELERATE, &skidooItem->Pose, 0, 0.5f + skidoo->Pitch / (float)SKIDOO_MAX_VELOCITY);
SoundEffect(skidoo->Pitch ? SFX_TR2_SNOWMOBILE_MOVING : SFX_TR2_SNOWMOBILE_ACCELERATE, &skidooItem->Pose, SoundEnvironment::Land, 0.5f + skidoo->Pitch / (float)SKIDOO_MAX_VELOCITY);
}
else
{

View file

@ -101,10 +101,9 @@ void MPGunControl(short itemNumber)
head = AI.angle;
torsoY = AI.angle;
ShotLara(item, &AI, &MPGunBite, torsoY, 32);
SoundEffect(SFX_TR3_OIL_SMG_FIRE, &item->Pose, 24576);
SoundEffect(SFX_TR3_OIL_SMG_FIRE, &item->Pose, SoundEnvironment::Land, 1.0f, 0.7f);
}
}
}
}
else

View file

@ -90,7 +90,7 @@ void TrainControl(short itemNumber)
}
}
else
SoundEffect(SFX_TR3_TUBE_LOOP, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_TUBE_LOOP, &item->Pose, SoundEnvironment::Always);
}
void TrainCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll)
@ -103,8 +103,8 @@ void TrainCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* coll)
if (!TestCollision(trainItem, laraItem))
return;
SoundEffect(SFX_TR4_LARA_GENERAL_DEATH, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_HIGH_FALL_DEATH, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_GENERAL_DEATH, &laraItem->Pose, SoundEnvironment::Always);
SoundEffect(SFX_TR4_LARA_HIGH_FALL_DEATH, &laraItem->Pose, SoundEnvironment::Always);
StopSoundEffect(SFX_TR3_TUBE_LOOP);
laraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + LARA_TRAIN_DEATH_ANIM;

View file

@ -264,7 +264,7 @@ static void CartToEntityCollision(ItemInfo* laraItem, ItemInfo* minecartItem)
int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase;
if (frame >= 12 && frame <= 22)
{
SoundEffect(SFX_TR3_SPANNER, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_SPANNER, &item->Pose, SoundEnvironment::Always);
TestTriggers(item, true);
item->Animation.FrameNumber++;
}
@ -397,7 +397,7 @@ static void MoveCart(ItemInfo* laraItem, ItemInfo* minecartItem)
if (minecart->VerticalVelocity)
StopSoundEffect(SFX_TR3_MINE_CART_PULLY_LOOP);
else
SoundEffect(SFX_TR3_MINE_CART_PULLY_LOOP, &minecartItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_MINE_CART_PULLY_LOOP, &minecartItem->Pose, SoundEnvironment::Always);
}
else
{
@ -406,7 +406,7 @@ static void MoveCart(ItemInfo* laraItem, ItemInfo* minecartItem)
if (minecart->VerticalVelocity)
StopSoundEffect(SFX_TR3_MINE_CART_TRACK_LOOP);
else
SoundEffect(SFX_TR3_MINE_CART_TRACK_LOOP, &minecartItem->Pose, (2 | 4) + 0x1000000 + (minecartItem->Animation.Velocity * 32768));
SoundEffect(SFX_TR3_MINE_CART_TRACK_LOOP, &minecartItem->Pose, SoundEnvironment::Land, 1.0f + ((float)minecartItem->Animation.Velocity / SECTOR(8))); // TODO: check actual sound!
}
if (minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT))
@ -487,7 +487,7 @@ static void MoveCart(ItemInfo* laraItem, ItemInfo* minecartItem)
if (minecartItem->Pose.Position.y > minecart->FloorHeightMiddle)
{
if (minecart->VerticalVelocity > 0)
SoundEffect(SFX_TR3_QUADBIKE_FRONT_IMPACT, &minecartItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_QUADBIKE_FRONT_IMPACT, &minecartItem->Pose, SoundEnvironment::Always);
minecartItem->Pose.Position.y = minecart->FloorHeightMiddle;
minecart->VerticalVelocity = 0;
@ -597,7 +597,7 @@ static void DoUserInput(ItemInfo* minecartItem, ItemInfo* laraItem, MinecartInfo
case CART_STATE_IDLE:
if (!(minecart->Flags & CART_FLAG_CONTROL))
{
SoundEffect(SFX_TR3_MINE_CART_START, &minecartItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_MINE_CART_START, &minecartItem->Pose, SoundEnvironment::Always);
minecart->Flags |= CART_FLAG_CONTROL;
minecart->StopDelay = 64;
}
@ -651,7 +651,7 @@ static void DoUserInput(ItemInfo* minecartItem, ItemInfo* laraItem, MinecartInfo
else
{
minecart->Velocity += CART_DEC;
SoundEffect(SFX_TR3_MINE_CART_BRAKE, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_MINE_CART_BRAKE, &laraItem->Pose, SoundEnvironment::Always);
}
break;
@ -724,7 +724,7 @@ static void DoUserInput(ItemInfo* minecartItem, ItemInfo* laraItem, MinecartInfo
case CART_STATE_MOUNT:
if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 5 &&
laraItem->Animation.FrameNumber == GetFrameNumber(minecartItem, 20) &&
!minecart->Flags & CART_FLAG_MESH)
{
auto temp = g_Level.Meshes[lara->MeshPtrs[LM_RHAND]];
@ -752,7 +752,7 @@ static void DoUserInput(ItemInfo* minecartItem, ItemInfo* laraItem, MinecartInfo
floorHeight < CLICK(1))
{
if (Wibble & 7 == 0)
SoundEffect(SFX_TR3_QUADBIKE_FRONT_IMPACT, &minecartItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR3_QUADBIKE_FRONT_IMPACT, &minecartItem->Pose, SoundEnvironment::Always);
minecartItem->Pose.Position.x += TURN_DEATH_VEL * phd_sin(minecartItem->Pose.Orientation.y);
minecartItem->Pose.Position.z += TURN_DEATH_VEL * phd_cos(minecartItem->Pose.Orientation.y);

View file

@ -1344,7 +1344,7 @@ bool QuadBikeControl(ItemInfo* laraItem, CollisionInfo* coll)
else if (quad->Pitch > 0xA000)
quad->Pitch = 0xA000;
SoundEffect(SFX_TR3_QUADBIKE_MOVE, &quadItem->Pose, 0, 0.5f + (float)abs(quad->Pitch) / (float)MAX_VELOCITY);
SoundEffect(SFX_TR3_QUADBIKE_MOVE, &quadItem->Pose, SoundEnvironment::Land, 0.5f + (float)abs(quad->Pitch) / (float)MAX_VELOCITY);
}
else
{

View file

@ -1032,9 +1032,9 @@ void RubberBoatControl(short itemNumber)
rBoat->Pitch += ((pitch - rBoat->Pitch) / 4);
if (rBoatItem->Animation.Velocity > 8)
SoundEffect(SFX_TR3_RUBBERBOAT_MOVING, &rBoatItem->Pose, ENV_FLAG_NONE, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY);
SoundEffect(SFX_TR3_RUBBERBOAT_MOVING, &rBoatItem->Pose, SoundEnvironment::Land, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY);
else if (drive)
SoundEffect(SFX_TR3_RUBBERBOAT_IDLE, &rBoatItem->Pose, ENV_FLAG_NONE, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY);
SoundEffect(SFX_TR3_RUBBERBOAT_IDLE, &rBoatItem->Pose, SoundEnvironment::Land, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY);
if (lara->Vehicle != itemNumber)
return;

View file

@ -172,7 +172,7 @@ static void FireUPVHarpoon(ItemInfo* laraItem, ItemInfo* UPVItem)
AddActiveItem(itemNumber);
SoundEffect(SFX_TR4_LARA_HARPOON_FIRE_WATER, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_HARPOON_FIRE_WATER, &laraItem->Pose, SoundEnvironment::Always);
Statistics.Game.AmmoUsed++;
UPV->HarpoonLeft = !UPV->HarpoonLeft;
@ -631,7 +631,7 @@ static void UPVControl(ItemInfo* laraItem, ItemInfo* UPVItem)
//sub->Flags &= ~UPV_CONTROL; having this here causes the UPV glitch, moving it directly to the states' code is better
StopSoundEffect(SFX_TR3_UPV_LOOP);
SoundEffect(SFX_TR3_UPV_STOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SFX_ALWAYS);
SoundEffect(SFX_TR3_UPV_STOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SoundEnvironment::Always);
}
}
@ -656,7 +656,7 @@ static void UPVControl(ItemInfo* laraItem, ItemInfo* UPVItem)
UPVItem->Pose.Orientation.x += ANGLE(1.0f);
if (frame == MOUNT_SURFACE_SOUND_FRAME)
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SFX_ALWAYS);
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SoundEnvironment::Always);
if (frame == MOUNT_SURFACE_CONTROL_FRAME)
UPV->Flags |= UPV_CONTROL;
@ -665,7 +665,7 @@ static void UPVControl(ItemInfo* laraItem, ItemInfo* UPVItem)
else if (anim == UPV_ANIM_MOUNT_UNDERWATER)
{
if (frame == MOUNT_UNDERWATER_SOUND_FRAME)
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SFX_ALWAYS);
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SoundEnvironment::Always);
if (frame == MOUNT_UNDERWATER_CONTROL_FRAME)
UPV->Flags |= UPV_CONTROL;
@ -956,7 +956,7 @@ bool UPVControl(ItemInfo* laraItem, CollisionInfo* coll)
if (!(UPV->Flags & UPV_SURFACE))
{
SoundEffect(SFX_TR4_LARA_BREATH, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_BREATH, &laraItem->Pose, SoundEnvironment::Always);
UPV->Flags &= ~UPV_DIVE;
}
@ -969,7 +969,7 @@ bool UPVControl(ItemInfo* laraItem, CollisionInfo* coll)
if (!(UPV->Flags & UPV_SURFACE))
{
SoundEffect(SFX_TR4_LARA_BREATH, &laraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_BREATH, &laraItem->Pose, SoundEnvironment::Always);
UPV->Flags &= ~UPV_DIVE;
}
@ -1035,7 +1035,7 @@ bool UPVControl(ItemInfo* laraItem, CollisionInfo* coll)
BackgroundCollision(laraItem, UPVItem);
if (UPV->Flags & UPV_CONTROL)
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, 2 | 4 | 0x1000000 | (UPVItem->Animation.Velocity * (USHRT_MAX + 1)));
SoundEffect(SFX_TR3_UPV_LOOP, (PHD_3DPOS*)&UPVItem->Pose.Position.x, SoundEnvironment::Always, 1.0f + (float)UPVItem->Animation.Velocity / 96.0f);
UPVItem->Animation.AnimNumber = Objects[ID_UPV].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_UPV_LARA_ANIMS].animIndex);
UPVItem->Animation.FrameNumber = g_Level.Anims[UPVItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase);

View file

@ -377,7 +377,7 @@ namespace TEN::Entities::TR4
item->Animation.VerticalVelocity = 0;
}
SoundEffect(SFX_TR4_JEEP_MOVE, &item->Pose, (item->ItemFlags[0] * 1024) + 16777220);
SoundEffect(SFX_TR4_JEEP_MOVE, &item->Pose, SoundEnvironment::Land, 1.0f + (float)item->ItemFlags[0] / SECTOR(8)); // TODO: Check actual sound!
}
}
}

View file

@ -203,7 +203,7 @@ namespace TEN::Entities::TR4
for (int i = 0; i < 2; i++)
TriggerExplosionSparks(item->Pose.Position.x, item->Pose.Position.y - CLICK(3), item->Pose.Position.z, 3, -1, 0, item->RoomNumber);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, 25165828);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 1.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
}
}

View file

@ -31,7 +31,7 @@ namespace TEN::Entities::TR4
{
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, ENV_FLAG_NONE, 0.7f, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 0.7f, 0.5f);
if (num > 0)
{

View file

@ -1627,7 +1627,7 @@ int JeepControl(void)
else
jeep->pitch = -32768;
SoundEffect(SFX_TR4_JEEP_MOVE, &item->Pose, (jeep->pitch * 256) + 16777220);
SoundEffect(SFX_TR4_JEEP_MOVE, &item->Pose, SoundEnvironment::Land, 0.5f + jeep->pitch / 65535.0f);
}
else
{

View file

@ -1433,14 +1433,14 @@ int MotorbikeControl(void)
if (motorbike->pitch > MOTORBIKE_PITCH_MAX)
motorbike->pitch = MOTORBIKE_PITCH_MAX;
SoundEffect(SFX_TR4_BIKE_MOVING, &item->Pose, (motorbike->pitch * 256) + 0x1000004);
SoundEffect(SFX_TR4_BIKE_MOVING, &item->Pose, SoundEnvironment::Land, 0.7f + motorbike->pitch / 24756.0f);
}
else
{
if (drive != -1)
{
SoundEffect(SFX_TR4_BIKE_IDLE, &item->Pose);
SoundEffect(SFX_TR4_BIKE_MOVING, &item->Pose, (motorbike->pitch * 256) + 0x1000004);
SoundEffect(SFX_TR4_BIKE_MOVING, &item->Pose, SoundEnvironment::Land, 0.7f + motorbike->pitch / 24756.0f, 0.5f);
}
motorbike->pitch = 0;
}

View file

@ -95,7 +95,7 @@ void AutoGunsControl(short itemNumber)
if (abs(angle1) < 1024 && abs(angle2) < 1024 && los)
{
SoundEffect(SFX_TR4_LARA_HK_FIRE, &item->Pose, 0xC00004);
SoundEffect(SFX_TR4_LARA_HK_FIRE, &item->Pose, SoundEnvironment::Land, 0.8f);
if (GlobalCounter & 1)
{

View file

@ -74,7 +74,7 @@ void ControlGunShip(short itemNumber)
item->MeshBits &= 0xFEFF;
if (GunShipCounter < 15)
SoundEffect(SFX_TR4_LARA_HK_FIRE, &item->Pose, 0xC00004);
SoundEffect(SFX_TR4_LARA_HK_FIRE, &item->Pose, SoundEnvironment::Land, 0.8f);
if (!(GlobalCounter & 1))
return AnimateItem(item);

View file

@ -263,10 +263,10 @@ void LaserHeadControl(short itemNumber)
g_Level.Items[creature->PuzzleItem].Pose.Position.y = item->Pose.Position.y;
TestTriggers(item, true);
SoundEffect(SFX_TR5_GOD_HEAD_BLAST, &item->Pose, 0x800004);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose, 20971524);
SoundEffect(SFX_TR5_GOD_HEAD_BLAST, &item->Pose, SoundEnvironment::Land, 0.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose, SoundEnvironment::Land, 1.25f);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, 4194308);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 0.25f);
KillItem(itemNumber);
}

View file

@ -120,7 +120,7 @@ static void SubmarineAttack(ItemInfo* item)
{
auto* torpedoItem = &g_Level.Items[itemNumber];
SoundEffect(SFX_TR5_UNDERWATER_TORPEDO, &torpedoItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_UNDERWATER_TORPEDO, &torpedoItem->Pose, SoundEnvironment::Always);
torpedoItem->ObjectNumber = ID_TORPEDO;
torpedoItem->Shade = -15856;
@ -255,7 +255,7 @@ void SubmarineControl(short itemNumber)
if (laraInfo.distance >= pow(SECTOR(3), 2))
{
item->Animation.TargetState = 1;
SoundEffect(SFX_TR5_DIVE_SUIT_LOOP, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_DIVE_SUIT_LOOP, &item->Pose, SoundEnvironment::Always);
}
else
item->Animation.TargetState = 0;
@ -423,7 +423,7 @@ void TorpedoControl(short itemNumber)
{
auto* item = &g_Level.Items[itemNumber];
SoundEffect(SFX_TR5_DIVE_SUIT_HIT, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_DIVE_SUIT_HIT, &item->Pose, SoundEnvironment::Always);
Vector3Int pos;
@ -541,8 +541,8 @@ void TorpedoControl(short itemNumber)
LaraItem->HitStatus = true;
KillItem(itemNumber);
TriggerUnderwaterExplosion(item, 1);
SoundEffect(SFX_TR5_UNDERWATER_EXPLOSION, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_DIVE_SUIT_HIT, &LaraItem->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_UNDERWATER_EXPLOSION, &item->Pose, SoundEnvironment::Always);
SoundEffect(SFX_TR5_DIVE_SUIT_HIT, &LaraItem->Pose, SoundEnvironment::Always);
LaraItem->HitPoints -= 200;
// if (Lara.anxiety >= 0x7F)
// Lara.anxiety--;
@ -575,7 +575,7 @@ void TorpedoControl(short itemNumber)
item->Pose.Position.y = y;
item->Pose.Position.z = z;
TriggerUnderwaterExplosion(item, 1);
SoundEffect(SFX_TR5_UNDERWATER_EXPLOSION, &item->Pose, SFX_ALWAYS);
SoundEffect(SFX_TR5_UNDERWATER_EXPLOSION, &item->Pose, SoundEnvironment::Always);
KillItem(itemNumber);
}
}

View file

@ -161,7 +161,7 @@ void ElectricalLightControl(short itemNumber)
intensity = item->ItemFlags[1] - (GetRandomControl() & 0x7F);
if (intensity > 64)
SoundEffect(SFX_TR5_ELECTRIC_LIGHT_CRACKLES, &item->Pose, 32 * (intensity & 0xFFFFFFF8) | 8);
SoundEffect(SFX_TR5_ELECTRIC_LIGHT_CRACKLES, &item->Pose, SoundEnvironment::Land, 1.0f, (float)intensity / 192.0f);
}
else
return;

View file

@ -107,7 +107,7 @@ void ControlHighObject1(short itemNumber)
else
flags = item->ItemFlags[1] / 8;
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, (flags * 256) | 8);
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, SoundEnvironment::Land, 1.0f, (flags * 256) / 32767.0f); // TODO: check actual sound!
item->Pose.Position.y += 8;
@ -196,7 +196,7 @@ void ControlHighObject1(short itemNumber)
else
flags = item->ItemFlags[1];
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, (flags * 256) | 8);
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, SoundEnvironment::Land, 1.0f, (flags * 256) / 32767.0f); // TODO: check actual sound!
item->ItemFlags[1] += 16;
item->Pose.Position.y -= 16;

View file

@ -137,11 +137,11 @@ void PushableBlockControl(short itemNumber)
// do sound effects, it works for now
if (DoPushPull > 0)
SoundEffect(info->loopSound, &item->Pose, SFX_ALWAYS);
SoundEffect(info->loopSound, &item->Pose, SoundEnvironment::Always);
else if (DoPushPull < 0)
{
DoPushPull = 0;
SoundEffect(info->stopSound, &item->Pose, SFX_ALWAYS);
SoundEffect(info->stopSound, &item->Pose, SoundEnvironment::Always);
}
// control block falling
@ -169,7 +169,7 @@ void PushableBlockControl(short itemNumber)
FloorShake(item);
item->Animation.VerticalVelocity = 0;
SoundEffect(info->fallSound, &item->Pose, SFX_ALWAYS);
SoundEffect(info->fallSound, &item->Pose, SoundEnvironment::Always);
MoveStackY(itemNumber, relY);
AddBridgeStack(itemNumber);
@ -253,7 +253,7 @@ void PushableBlockControl(short itemNumber)
item->Pose.Position.x = item->Pose.Position.x & 0xFFFFFE00 | 0x200;
item->Pose.Position.z = item->Pose.Position.z & 0xFFFFFE00 | 0x200;
MoveStackXZ(itemNumber);
//SoundEffect(pushable->stopSound, &item->pos, SFX_ALWAYS);
//SoundEffect(pushable->stopSound, &item->pos, SoundEnvironment::Always);
DoPushPull = 0;
LaraItem->Animation.TargetState = LS_IDLE;

View file

@ -56,7 +56,7 @@ void ControlTeleporter(short itemNumber)
}
ItemInfo* targetItem = &g_Level.Items[item->itemFlags[1]];
SoundEffect(SFX_RICH_TELEPORT, &targetItem->pos, (flags << 8) | 8);
SoundEffect(SFX_RICH_TELEPORT, &targetItem->pos, SoundEnvironment::Land);
if (GlobalCounter & 1)
{
@ -169,7 +169,7 @@ void ControlTeleporter(short itemNumber)
FlashFadeB = 64;
FlashFader = 32;
item->itemFlags[2] = 1;
SoundEffect(SFX_TR5_TELEPORT_FLASH, 0, (int)& unk_800004);
SoundEffect(SFX_TR5_TELEPORT_FLASH, nullptr, SoundEnvironment::Land);
}
}*/

View file

@ -107,7 +107,7 @@ void RaisingCogControl(short itemNumber)
else
flags = item->ItemFlags[2];
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, (flags * 256) | 8);
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->Pose, SoundEnvironment::Land, 1.0f, (flags * 256) / 32767.0f); // TODO: check actual sound!
item->ItemFlags[2] += 2;
item->Pose.Position.y -= 2;

View file

@ -70,7 +70,7 @@ void ExplosionControl(short itemNumber)
else
flag = item->ItemFlags[1] == 1 ? 2 : 0;
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, 25165828);
SoundEffect(SFX_TR4_EXPLOSION1, &item->Pose, SoundEnvironment::Land, 1.5f);
SoundEffect(SFX_TR4_EXPLOSION2, &item->Pose);
TriggerExplosionSparks(item->Pose.Position.x, item->Pose.Position.y, item->Pose.Position.z, 3, -2, flag, item->RoomNumber);

View file

@ -80,7 +80,7 @@ namespace Misc {
static void PlayAudioTrack(std::string const& trackName, sol::optional<bool> looped)
{
auto mode = looped.value_or(false) ? SOUNDTRACK_PLAYTYPE::OneShot : SOUNDTRACK_PLAYTYPE::BGM;
auto mode = looped.value_or(false) ? SoundTrackType::OneShot : SoundTrackType::BGM;
PlaySoundTrack(trackName, mode);
}
@ -95,17 +95,17 @@ namespace Misc {
pos.Orientation.y = 0;
pos.Orientation.z = 0;
SoundEffect(id, &pos, flags);
SoundEffect(id, &pos, (SoundEnvironment)flags);
}
static void PlaySoundEffect(int id, int flags)
{
SoundEffect(id, NULL, flags);
SoundEffect(id, NULL, (SoundEnvironment)flags);
}
static void SetAmbientTrack(std::string const& trackName)
{
PlaySoundTrack(trackName, SOUNDTRACK_PLAYTYPE::BGM);
PlaySoundTrack(trackName, SoundTrackType::BGM);
}
static int CalculateDistance(Vec3 const& pos1, Vec3 const& pos2)

View file

@ -13,12 +13,12 @@
#include "Specific/winmain.h"
HSTREAM BASS_3D_Mixdown;
HFX BASS_FXHandler[(int)SOUND_FILTER::Count];
SoundTrackSlot BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::Count];
HFX BASS_FXHandler[(int)SoundFilter::Count];
SoundTrackSlot BASS_Soundtrack[(int)SoundTrackType::Count];
HSAMPLE SamplePointer[SOUND_MAX_SAMPLES];
SoundEffectSlot SoundSlot[SOUND_MAX_CHANNELS];
const BASS_BFX_FREEVERB BASS_ReverbTypes[(int)REVERB_TYPE::Count] = // Reverb presets
const BASS_BFX_FREEVERB BASS_ReverbTypes[(int)ReverbType::Count] = // Reverb presets
{ // Dry Mix | Wet Mix | Size | Damp | Width | Mode | Channel
{ 1.0f, 0.20f, 0.05f, 0.90f, 0.7f, 0, -1 }, // 0 = Outside
@ -44,13 +44,13 @@ void SetVolumeMusic(int vol)
GlobalMusicVolume = vol;
float fVol = static_cast<float>(vol) / 100.0f;
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel))
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel))
{
BASS_ChannelSetAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel, BASS_ATTRIB_VOL, fVol);
BASS_ChannelSetAttribute(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel, BASS_ATTRIB_VOL, fVol);
}
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::OneShot].Channel))
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SoundTrackType::OneShot].Channel))
{
BASS_ChannelSetAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::OneShot].Channel, BASS_ATTRIB_VOL, fVol);
BASS_ChannelSetAttribute(BASS_Soundtrack[(int)SoundTrackType::OneShot].Channel, BASS_ATTRIB_VOL, fVol);
}
}
@ -138,7 +138,7 @@ bool LoadSample(char *pointer, int compSize, int uncompSize, int index)
return true;
}
long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMultiplier, float gainMultiplier)
long SoundEffect(int effectID, PHD_3DPOS* position, SoundEnvironment condition, float pitchMultiplier, float gainMultiplier)
{
if (effectID >= g_Level.SoundMap.size())
return 0;
@ -146,10 +146,10 @@ long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMul
if (BASS_GetDevice() == -1)
return 0;
if (!(envFlags & SFX_ALWAYS))
if (condition != SoundEnvironment::Always)
{
// Don't play effect if effect's environment isn't the same as camera position's environment
if (TestEnvironmentFlags(ENV_FLAG_WATER, envFlags) != TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber))
if (condition != (SoundEnvironment)TestEnvironment(ENV_FLAG_WATER, Camera.pos.roomNumber))
return 0;
}
@ -187,16 +187,16 @@ long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMul
sampleFlags |= BASS_SAMPLE_3D;
// Set & randomize volume (if needed)
float gain = (static_cast<float>(sampleInfo->Volume) / UCHAR_MAX) * gainMultiplier;
float gain = (static_cast<float>(sampleInfo->Volume) / UCHAR_MAX) * std::clamp(gainMultiplier, SOUND_MIN_PARAM_MULTIPLIER, SOUND_MAX_PARAM_MULTIPLIER);;
if ((sampleInfo->Flags & SOUND_FLAG_RND_GAIN))
gain -= (static_cast<float>(GetRandomControl()) / static_cast<float>(RAND_MAX))* SOUND_MAX_GAIN_CHANGE;
// Set and randomize pitch and additionally multiply by provided value (for vehicles etc)
float pitch = (1.0f + static_cast<float>(sampleInfo->Pitch) / 127.0f) * pitchMultiplier;
float pitch = (1.0f + static_cast<float>(sampleInfo->Pitch) / 127.0f) * std::clamp(pitchMultiplier, SOUND_MIN_PARAM_MULTIPLIER, SOUND_MAX_PARAM_MULTIPLIER);
// Randomize pitch (if needed)
if ((sampleInfo->Flags & SOUND_FLAG_RND_PITCH))
pitch += ((static_cast<float>(GetRandomControl()) / static_cast<float>(RAND_MAX)) - 0.5f)* SOUND_MAX_PITCH_CHANGE * 2.0f;
pitch += ((static_cast<float>(GetRandomControl()) / static_cast<float>(RAND_MAX)) - 0.5f) * SOUND_MAX_PITCH_CHANGE * 2.0f;
// Calculate sound radius and distance to sound
float radius = (float)(sampleInfo->Radius) * SECTOR(1);
@ -213,23 +213,23 @@ long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMul
int existingChannel = Sound_EffectIsPlaying(effectID, position);
// Select behaviour based on effect playback type (bytes 0-1 of flags field)
auto playType = (SOUND_PLAYTYPE)(sampleInfo->Flags & 3);
auto playType = (SoundPlayMode)(sampleInfo->Flags & 3);
switch (playType)
{
case SOUND_PLAYTYPE::Normal:
case SoundPlayMode::Normal:
break;
case SOUND_PLAYTYPE::Wait:
case SoundPlayMode::Wait:
if (existingChannel != -1) // Don't play until stopped
return 0;
break;
case SOUND_PLAYTYPE::Restart:
case SoundPlayMode::Restart:
if (existingChannel != -1) // Stop existing and continue
Sound_FreeSlot(existingChannel, SOUND_XFADETIME_CUTSOUND);
break;
case SOUND_PLAYTYPE::Looped:
case SoundPlayMode::Looped:
if (existingChannel != -1) // Just update parameters and return, if already playing
{
Sound_UpdateEffectPosition(existingChannel, position);
@ -263,7 +263,7 @@ long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMul
return 0;
// Finally ready to play sound, assign it to sound slot.
SoundSlot[freeSlot].State = SOUND_STATE::Idle;
SoundSlot[freeSlot].State = SoundState::Idle;
SoundSlot[freeSlot].EffectID = effectID;
SoundSlot[freeSlot].Channel = channel;
SoundSlot[freeSlot].Gain = gain;
@ -273,7 +273,7 @@ long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags, float pitchMul
return 0;
// Set looped flag, if necessary
if (playType == SOUND_PLAYTYPE::Looped)
if (playType == SoundPlayMode::Looped)
BASS_ChannelFlags(channel, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);
// Play channel
@ -348,7 +348,7 @@ void EnumerateLegacyTracks()
// TRLE default looping tracks
if (index >= LegacyLoopingTrackMin && index <= LegacyLoopingTrackMax)
{
s.Mode = SOUNDTRACK_PLAYTYPE::BGM;
s.Mode = SoundTrackType::BGM;
}
s.Name = result[1];
SoundTracks.insert(std::make_pair(index, s));
@ -368,7 +368,7 @@ void EnumerateLegacyTracks()
}
void PlaySoundTrack(std::string track, SOUNDTRACK_PLAYTYPE mode, QWORD position)
void PlaySoundTrack(std::string track, SoundTrackType mode, QWORD position)
{
if (track.empty())
return;
@ -383,11 +383,11 @@ void PlaySoundTrack(std::string track, SOUNDTRACK_PLAYTYPE mode, QWORD position)
switch (mode)
{
case SOUNDTRACK_PLAYTYPE::OneShot:
case SoundTrackType::OneShot:
crossfadeTime = SOUND_XFADETIME_ONESHOT;
break;
case SOUNDTRACK_PLAYTYPE::BGM:
case SoundTrackType::BGM:
crossfade = true;
crossfadeTime = channelActive ? SOUND_XFADETIME_BGM : SOUND_XFADETIME_BGM_START;
flags |= BASS_SAMPLE_LOOP;
@ -421,10 +421,10 @@ void PlaySoundTrack(std::string track, SOUNDTRACK_PLAYTYPE mode, QWORD position)
// Damp BGM track in case one-shot track is about to play.
if (mode == SOUNDTRACK_PLAYTYPE::OneShot)
if (mode == SoundTrackType::OneShot)
{
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel))
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel, BASS_ATTRIB_VOL, masterVolume * SOUND_BGM_DAMP_COEFFICIENT, SOUND_XFADETIME_BGM_START);
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel))
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel, BASS_ATTRIB_VOL, masterVolume * SOUND_BGM_DAMP_COEFFICIENT, SOUND_XFADETIME_BGM_START);
BASS_ChannelSetSync(stream, BASS_SYNC_FREE | BASS_SYNC_ONETIME | BASS_SYNC_MIXTIME, 0, Sound_FinishOneshotTrack, NULL);
}
@ -469,7 +469,7 @@ void PlaySoundTrack(std::string track, short mask)
if (SoundTrackMap.count(track))
PlaySoundTrack(SoundTrackMap[track], mask);
else
PlaySoundTrack(track, SOUNDTRACK_PLAYTYPE::OneShot);
PlaySoundTrack(track, SoundTrackType::OneShot);
}
void PlaySoundTrack(int index, short mask)
@ -488,7 +488,7 @@ void PlaySoundTrack(int index, short mask)
// Check and modify soundtrack map mask, if needed.
// If existing mask is unmodified (same activation mask setup), track won't play.
if (mask && !(SoundTracks[index].Mode == SOUNDTRACK_PLAYTYPE::BGM))
if (mask && !(SoundTracks[index].Mode == SoundTrackType::BGM))
{
int filteredMask = (mask >> 8) & 0x3F;
if ((SoundTracks[index].Mask & filteredMask) == filteredMask)
@ -503,13 +503,13 @@ void PlaySoundTrack(int index, short mask)
void StopSoundTracks()
{
// Do quick fadeouts.
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::OneShot].Channel, BASS_ATTRIB_VOL | BASS_SLIDE_LOG, -1.0f, SOUND_XFADETIME_ONESHOT);
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel, BASS_ATTRIB_VOL | BASS_SLIDE_LOG, -1.0f, SOUND_XFADETIME_ONESHOT);
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SoundTrackType::OneShot].Channel, BASS_ATTRIB_VOL | BASS_SLIDE_LOG, -1.0f, SOUND_XFADETIME_ONESHOT);
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel, BASS_ATTRIB_VOL | BASS_SLIDE_LOG, -1.0f, SOUND_XFADETIME_ONESHOT);
BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::OneShot].Track = {};
BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::OneShot].Channel = NULL;
BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Track = {};
BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel = NULL;
BASS_Soundtrack[(int)SoundTrackType::OneShot].Track = {};
BASS_Soundtrack[(int)SoundTrackType::OneShot].Channel = NULL;
BASS_Soundtrack[(int)SoundTrackType::BGM].Track = {};
BASS_Soundtrack[(int)SoundTrackType::BGM].Channel = NULL;
}
void ClearSoundTrackMasks()
@ -520,7 +520,7 @@ void ClearSoundTrackMasks()
// Returns specified soundtrack type's stem name and playhead position.
// To be used with savegames. To restore soundtrack, use PlaySoundtrack function with playhead position passed as 3rd argument.
std::pair<std::string, QWORD> GetSoundTrackNameAndPosition(SOUNDTRACK_PLAYTYPE type)
std::pair<std::string, QWORD> GetSoundTrackNameAndPosition(SoundTrackType type)
{
auto track = BASS_Soundtrack[(int)type];
@ -533,8 +533,8 @@ std::pair<std::string, QWORD> GetSoundTrackNameAndPosition(SOUNDTRACK_PLAYTYPE t
static void CALLBACK Sound_FinishOneshotTrack(HSYNC handle, DWORD channel, DWORD data, void* userData)
{
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel))
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SOUNDTRACK_PLAYTYPE::BGM].Channel, BASS_ATTRIB_VOL, (float)GlobalMusicVolume / 100.0f, SOUND_XFADETIME_BGM_START);
if (BASS_ChannelIsActive(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel))
BASS_ChannelSlideAttribute(BASS_Soundtrack[(int)SoundTrackType::BGM].Channel, BASS_ATTRIB_VOL, (float)GlobalMusicVolume / 100.0f, SOUND_XFADETIME_BGM_START);
}
void Sound_FreeSample(int index)
@ -649,7 +649,7 @@ void Sound_FreeSlot(int index, unsigned int fadeout)
}
SoundSlot[index].Channel = NULL;
SoundSlot[index].State = SOUND_STATE::Idle;
SoundSlot[index].State = SoundState::Idle;
SoundSlot[index].EffectID = -1;
}
@ -679,7 +679,7 @@ bool Sound_UpdateEffectPosition(int index, PHD_3DPOS *position, bool force)
// Reset activity flag, important for looped samples
if (BASS_ChannelIsActive(SoundSlot[index].Channel))
SoundSlot[index].State = SOUND_STATE::Idle;
SoundSlot[index].State = SoundState::Idle;
return true;
}
@ -704,12 +704,13 @@ void Sound_UpdateScene()
// Apply environmental effects
static int currentReverb = -1;
auto roomReverb = g_Level.Rooms[Camera.pos.roomNumber].reverbType;
if (currentReverb == -1 || g_Level.Rooms[Camera.pos.roomNumber].reverbType != currentReverb)
if (currentReverb == -1 || roomReverb != currentReverb)
{
currentReverb = g_Level.Rooms[Camera.pos.roomNumber].reverbType;
if (currentReverb < (int)REVERB_TYPE::Count)
BASS_FXSetParameters(BASS_FXHandler[(int)SOUND_FILTER::Reverb], &BASS_ReverbTypes[currentReverb]);
currentReverb = roomReverb;
if (currentReverb < (int)ReverbType::Count)
BASS_FXSetParameters(BASS_FXHandler[(int)SoundFilter::Reverb], &BASS_ReverbTypes[(int)currentReverb]);
}
for (int i = 0; i < SOUND_MAX_CHANNELS; i++)
@ -721,14 +722,14 @@ void Sound_UpdateScene()
// Stop and clean up sounds which were in ending state in previous frame.
// In case sound is looping, make it ending unless they are re-fired in next frame.
if (SoundSlot[i].State == SOUND_STATE::Ending)
if (SoundSlot[i].State == SoundState::Ending)
{
SoundSlot[i].State = SOUND_STATE::Ended;
SoundSlot[i].State = SoundState::Ended;
Sound_FreeSlot(i, SOUND_XFADETIME_CUTSOUND);
continue;
}
else if ((SOUND_PLAYTYPE)(sampleInfo->Flags & 3) == SOUND_PLAYTYPE::Looped)
SoundSlot[i].State = SOUND_STATE::Ending;
else if ((SoundPlayMode)(sampleInfo->Flags & 3) == SoundPlayMode::Looped)
SoundSlot[i].State = SoundState::Ending;
// Calculate attenuation and clean up sounds which are out of listener range (only for 3D sounds).
@ -807,20 +808,20 @@ void Sound_Init()
return;
// Initialize channels and tracks array
ZeroMemory(BASS_Soundtrack, (sizeof(HSTREAM) * (int)SOUNDTRACK_PLAYTYPE::Count));
ZeroMemory(BASS_Soundtrack, (sizeof(HSTREAM) * (int)SoundTrackType::Count));
ZeroMemory(SoundSlot, (sizeof(SoundEffectSlot) * SOUND_MAX_CHANNELS));
// Attach reverb effect to 3D channel
BASS_FXHandler[(int)SOUND_FILTER::Reverb] = BASS_ChannelSetFX(BASS_3D_Mixdown, BASS_FX_BFX_FREEVERB, 0);
BASS_FXSetParameters(BASS_FXHandler[(int)SOUND_FILTER::Reverb], &BASS_ReverbTypes[(int)REVERB_TYPE::Outside]);
BASS_FXHandler[(int)SoundFilter::Reverb] = BASS_ChannelSetFX(BASS_3D_Mixdown, BASS_FX_BFX_FREEVERB, 0);
BASS_FXSetParameters(BASS_FXHandler[(int)SoundFilter::Reverb], &BASS_ReverbTypes[(int)ReverbType::Outside]);
if (Sound_CheckBASSError("Attaching environmental FX", true))
return;
// Apply slight compression to 3D channel
BASS_FXHandler[(int)SOUND_FILTER::Compressor] = BASS_ChannelSetFX(BASS_3D_Mixdown, BASS_FX_BFX_COMPRESSOR2, 1);
BASS_FXHandler[(int)SoundFilter::Compressor] = BASS_ChannelSetFX(BASS_3D_Mixdown, BASS_FX_BFX_COMPRESSOR2, 1);
auto comp = BASS_BFX_COMPRESSOR2{ 4.0f, -18.0f, 1.5f, 10.0f, 100.0f, -1 };
BASS_FXSetParameters(BASS_FXHandler[(int)SOUND_FILTER::Compressor], &comp);
BASS_FXSetParameters(BASS_FXHandler[(int)SoundFilter::Compressor], &comp);
if (Sound_CheckBASSError("Attaching compressor", true))
return;
@ -855,13 +856,13 @@ bool Sound_CheckBASSError(const char* message, bool verbose, ...)
void SayNo()
{
SoundEffect(SFX_TR4_LARA_NO, NULL, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_NO, NULL, SoundEnvironment::Always);
}
void PlaySecretTrack()
{
// Secret soundtrack should be always last one on a list.
PlaySoundTrack(SoundTracks.at(SecretSoundIndex).Name, SOUNDTRACK_PLAYTYPE::OneShot);
PlaySoundTrack(SoundTracks.at(SecretSoundIndex).Name, SoundTrackType::OneShot);
}
int GetShatterSound(int shatterID)

View file

@ -4,7 +4,6 @@
#include "Game/control/control.h"
#include "Sound/sound_effects.h"
constexpr auto SFX_ALWAYS = 2;
constexpr auto SOUND_BASS_UNITS = 1.0f / 1024.0f; // TR->BASS distance unit coefficient
constexpr auto SOUND_MAXVOL_RADIUS = 1024.0f; // Max. volume hearing distance
constexpr auto SOUND_OMNIPRESENT_ORIGIN = Vector3(1.17549e-038f, 1.17549e-038f, 1.17549e-038f);
@ -26,22 +25,24 @@ constexpr auto SOUND_XFADETIME_ONESHOT = 200;
constexpr auto SOUND_XFADETIME_CUTSOUND = 100;
constexpr auto SOUND_XFADETIME_HIJACKSOUND = 50;
constexpr auto SOUND_BGM_DAMP_COEFFICIENT = 0.5f;
constexpr auto SOUND_MIN_PARAM_MULTIPLIER = 0.05f;
constexpr auto SOUND_MAX_PARAM_MULTIPLIER = 5.0f;
enum class SOUNDTRACK_PLAYTYPE
enum class SoundTrackType
{
OneShot,
BGM,
Count
};
enum class SOUND_PLAYCONDITION
enum class SoundEnvironment
{
LandAndWater = 0,
Land = (1 << 14),
Water = (2 << 14)
Land,
Water,
Always
};
enum class SOUND_PLAYTYPE
enum class SoundPlayMode
{
Normal,
Wait,
@ -49,7 +50,7 @@ enum class SOUND_PLAYTYPE
Looped
};
enum class REVERB_TYPE
enum class ReverbType
{
Outside, // 0x00 no reverberation
Small, // 0x01 little reverberation
@ -59,14 +60,14 @@ enum class REVERB_TYPE
Count
};
enum class SOUND_STATE
enum class SoundState
{
Idle,
Ending,
Ended
};
enum class SOUND_FILTER
enum class SoundFilter
{
Reverb,
Compressor,
@ -76,7 +77,7 @@ enum class SOUND_FILTER
struct SoundEffectSlot
{
SOUND_STATE State;
SoundState State;
short EffectID;
float Gain;
HCHANNEL Channel;
@ -102,7 +103,7 @@ struct SampleInfo
struct SoundTrackInfo
{
std::string Name{};
SOUNDTRACK_PLAYTYPE Mode{ SOUNDTRACK_PLAYTYPE::OneShot };
SoundTrackType Mode{ SoundTrackType::OneShot };
int Mask{ 0 };
};
@ -110,7 +111,7 @@ extern std::map<std::string, int> SoundTrackMap;
extern std::unordered_map<int, SoundTrackInfo> SoundTracks;
extern int SecretSoundIndex;
long SoundEffect(int effectID, PHD_3DPOS* position, int envFlags = ENV_FLAG_NONE, float pitchMultiplier = 1.0f, float gainMultiplier = 1.0f);
long SoundEffect(int effectID, PHD_3DPOS* position, SoundEnvironment condition = SoundEnvironment::Land, float pitchMultiplier = 1.0f, float gainMultiplier = 1.0f);
void StopSoundEffect(short effectID);
bool LoadSample(char *buffer, int compSize, int uncompSize, int currentIndex);
void FreeSamples();
@ -118,7 +119,7 @@ void StopAllSounds();
void PauseAllSounds();
void ResumeAllSounds();
void PlaySoundTrack(std::string trackName, SOUNDTRACK_PLAYTYPE mode, QWORD position = 0);
void PlaySoundTrack(std::string trackName, SoundTrackType mode, QWORD position = 0);
void PlaySoundTrack(std::string trackName, short mask = 0);
void PlaySoundTrack(int index, short mask = 0);
void StopSoundTracks();
@ -129,7 +130,7 @@ void PlaySoundSources();
int GetShatterSound(int shatterID);
void EnumerateLegacyTracks();
std::pair<std::string, QWORD> GetSoundTrackNameAndPosition(SOUNDTRACK_PLAYTYPE type);
std::pair<std::string, QWORD> GetSoundTrackNameAndPosition(SoundTrackType type);
static void CALLBACK Sound_FinishOneshotTrack(HSYNC handle, DWORD channel, DWORD data, void* userData);

View file

@ -477,7 +477,7 @@ enum SOUND_EFFECTS
SFX_TR1_PIERRE_DEATH = 471,
SFX_TR1_PIERRE_SPEECH = 472,
SFX_TR1_PIERRE_MAGNUM_FIRE = 473,
//Tomb Raider 2 Sounds
//Tomb Raider 2 Sounds
SFX_TR2_LARA_M16_FIRE = 474,
SFX_TR2_LARA_M16_STOP = 475,
SFX_TR2_HENCHMAN_BELT_JINGLE = 476,
@ -540,10 +540,10 @@ enum SOUND_EFFECTS
SFX_TR2_EAGLE_SQUAWK = 533,
SFX_TR2_EAGLE_WING_FLAP = 534,
SFX_TR2_EAGLE_DEATH = 535,
SFX_TR3_CROW_CAW = 536,
SFX_TR3_CROW_WING_FLAP = 537,
SFX_TR3_CROW_DEATH = 538,
SFX_TR3_CROW_ATTACK = 539,
SFX_TR2_CROW_CAW = 536,
SFX_TR2_CROW_WING_FLAP = 537,
SFX_TR2_CROW_DEATH = 538,
SFX_TR2_CROW_ATTACK = 539,
SFX_TR2_YETI_CHEST_BEAT = 540,
SFX_TR2_YETI_FEET = 541,
SFX_TR2_YETI_GROWL = 542,
@ -594,25 +594,25 @@ enum SOUND_EFFECTS
SFX_TR2_WARRIOR_SWORD_SLICE = 587,
SFX_TR2_WARRIOR_WAKE = 588,
SFX_TR2_WARRIOR_BURP = 589,
SFX_TR3_SCUBA_DIVER_ARM = 590,
SFX_TR3_SCUBA_DIVER_BREATH_LAND = 591,
SFX_TR3_SCUBA_DIVER_BREATH_WATER = 592,
SFX_TR3_SCUBA_DIVER_DEATH = 593,
SFX_TR3_SCUBA_DIVER_DIVING = 594,
SFX_TR3_SCUBA_DIVER_FLIPPER = 595,
SFX_TR2_SCUBA_DIVER_ARM = 590,
SFX_TR2_SCUBA_DIVER_BREATH_LAND = 591,
SFX_TR2_SCUBA_DIVER_BREATH_WATER = 592,
SFX_TR2_SCUBA_DIVER_DEATH = 593,
SFX_TR2_SCUBA_DIVER_DIVING = 594,
SFX_TR2_SCUBA_DIVER_FLIPPER = 595,
SFX_TR2_SHARK_BITE = 596,
SFX_TR3_WINSTON_BRUSH_OFF = 597,
SFX_TR3_WINSTON_BULLET_TRAY = 598,
SFX_TR3_WINSTON_CUPS = 599,
SFX_TR3_WINSTON_FLATULENCE = 600,
SFX_TR3_WINSTON_FOOTSTEPS = 601,
SFX_TR3_WINSTON_GET_UP = 602,
SFX_TR3_WINSTON_SURPRISED = 603,
SFX_TR3_WINSTON_TAKE_HIT = 604,
SFX_TR3_WINSTON_GRUNT1 = 605,
SFX_TR3_WINSTON_GRUNT2 = 606,
SFX_TR3_WINSTON_GRUNT3 = 607,
SFX_TR3_WINSTON_SHUFFLE = 608,
SFX_TR2_WINSTON_BRUSH_OFF = 597,
SFX_TR2_WINSTON_BULLET_TRAY = 598,
SFX_TR2_WINSTON_CUPS = 599,
SFX_TR2_WINSTON_FLATULENCE = 600,
SFX_TR2_WINSTON_FOOTSTEPS = 601,
SFX_TR2_WINSTON_GET_UP = 602,
SFX_TR2_WINSTON_SURPRISED = 603,
SFX_TR2_WINSTON_TAKE_HIT = 604,
SFX_TR2_WINSTON_GRUNT1 = 605,
SFX_TR2_WINSTON_GRUNT2 = 606,
SFX_TR2_WINSTON_GRUNT3 = 607,
SFX_TR2_WINSTON_SHUFFLE = 608,
SFX_TR2_SPEEDBOAT_ACCELERATE = 609,
SFX_TR2_SPEEDBOAT_ENGINE = 610,
SFX_TR2_SPEEDBOAT_HIT = 611,
@ -688,7 +688,7 @@ enum SOUND_EFFECTS
SFX_TR2_SLAM_DOOR_CLOSE = 681,
SFX_TR2_SWINGING = 682,
SFX_TR2_SWINGING_TRAP = 683,
//Tomb Raider 3 Sounds
//Tomb Raider 3 Sounds
SFX_TR3_TONY_ATTACK = 684,
SFX_TR3_TONY_LAUGH = 685,
SFX_TR3_TONY_NORMAL_DEATH = 686,
@ -910,232 +910,232 @@ enum SOUND_EFFECTS
SFX_TR5_AGENT_HITMAN_FEET = 901,
SFX_TR5_AGENT_HITMAN_JUMP = 902,
SFX_TR5_AGENT_HITMAN_LAND = 903,
SFX_TR5_SCIENTIST_DONT_SHOOT = 904 ,
SFX_TR5_VCI_BLUEMAN_GUNS = 905 ,
SFX_TR5_VCI_BLUEMAN_CHAIRHIT = 906 ,
SFX_TR5_VCI_BLUEMAN_GETUP = 907 ,
SFX_TR5_VCI_BLUEMAN_HITDIE = 908 ,
SFX_TR5_VCI_BLUEMAN_JUMP = 909 ,
SFX_TR5_VCI_BLUEMAN_CHAIR = 910 ,
SFX_TR5_VCI_BLUEMAN_CONSOLE = 911 ,
SFX_TR5_CHEF_ATTACK = 912 ,
SFX_TR5_HYDRA_ATTACK = 913 ,
SFX_TR5_SCIENTIST_DONT_SHOOT = 904,
SFX_TR5_VCI_BLUEMAN_GUNS = 905,
SFX_TR5_VCI_BLUEMAN_CHAIRHIT = 906,
SFX_TR5_VCI_BLUEMAN_GETUP = 907,
SFX_TR5_VCI_BLUEMAN_HITDIE = 908,
SFX_TR5_VCI_BLUEMAN_JUMP = 909,
SFX_TR5_VCI_BLUEMAN_CHAIR = 910,
SFX_TR5_VCI_BLUEMAN_CONSOLE = 911,
SFX_TR5_CHEF_ATTACK = 912,
SFX_TR5_HYDRA_ATTACK = 913,
SFX_TR5_HYDRA_BREATHE = 914,
SFX_TR5_HYDRA_BREATHEOUT = 915 ,
SFX_TR5_HYDRA_FIRE = 916 ,
SFX_TR5_xTOR_ATTACK = 917 ,
SFX_TR5_GLADIATOR_DEATH = 918 ,
SFX_TR5_GLADIATOR_FEET = 919 ,
SFX_TR5_GLADIATOR_SHIELD1 = 920 ,
SFX_TR5_GLADIATOR_SHIELD2 = 921 ,
SFX_TR5_GLADIATOR_SWORD = 922 ,
SFX_TR5_GOD_HEAD_BLAST = 923 ,
SFX_TR5_GOD_HEAD_CHARGE = 924 ,
SFX_TR5_GOD_HEAD_LASERLOOPS = 925 ,
SFX_TR5_GOD_HEAD_TENTACLES = 926 ,
SFX_TR5_HAMMER_GOD_HAMMER_HIT = 927 ,
SFX_TR5_HAMMER_GOD_HAMMER_MED = 928 ,
SFX_TR5_HAMMER_GOD_HAMMER= 929 ,
SFX_TR5_HAMMER_GOD_PULSE = 930 ,
SFX_TR5_HANGMAN_LAUGH_OFFCAM = 931 ,
SFX_TR5_HITMAN_CHOKE = 932 ,
SFX_TR5_HITMAN_ELECSHORT = 933 ,
SFX_TR5_HITMAN_GUNSEND = 934 ,
SFX_TR5_HITMAN_GUNSFIRE = 935 ,
SFX_TR5_IMP_ATTACK = 936 ,
SFX_TR5_IMP_BARRELDROP = 937 ,
SFX_TR5_IMP_BARRELROLL = 938 ,
SFX_TR5_IMP_DEATH = 939 ,
SFX_TR5_IMP_FALL = 940 ,
SFX_TR5_IMP_FEET = 941 ,
SFX_TR5_IMP_LAUGH = 942 ,
SFX_TR5_IMP_RUNAWAY = 943 ,
SFX_TR5_IMP_STONEHIT = 944 ,
SFX_TR5_DIVE_SUIT_ENGINE = 945 ,
SFX_TR5_DIVE_SUIT_HIT = 946 ,
SFX_TR5_DIVE_SUIT_BREATHE = 947 ,
SFX_TR5_DIVE_SUIT_LOOP = 948 ,
SFX_TR5_MAFIA_DEATH = 949 ,
SFX_TR5_MAFIA_GETDOWN = 950 ,
SFX_TR5_MAFIA_HIT = 951 ,
SFX_TR5_MAFIA_JUMP = 952 ,
SFX_TR5_SWORD_GOD_SWORDDEATH1 = 953 ,
SFX_TR5_SWORD_GOD_FALL = 954 ,
SFX_TR5_SWORD_GOD_FEET = 955 ,
SFX_TR5_SWORD_GOD_FEETQUIET = 956 ,
SFX_TR5_SWORD_GOD_FEETVERYQUIET = 957 ,
SFX_TR5_SWORD_GOD_HITMETAL = 958 ,
SFX_TR5_SWORD_GOD_LASER = 959 ,
SFX_TR5_SWORD_GOD_SCREAM = 960 ,
SFX_TR5_SWORD_GOD_SWORD = 961 ,
SFX_TR5_SHOCKWAVE_RUMBLE = 962 ,
SFX_TR5_SKELETON_GHOST_APPEAR = 963 ,
SFX_TR5_SKELETONGHOST_ATTACK = 964 ,
SFX_TR5_SNIPER_RIFLE = 965 ,
SFX_TR5_WEREWOLF_ATTACK1 = 966 ,
SFX_TR5_WEREWOLF_ATTACK2 = 967 ,
SFX_TR5_WEREWOLF_DEATH = 968 ,
SFX_TR5_WEREWOLF_DROP = 969 ,
SFX_TR5_WEREWOLF_HIND_FEET = 970 ,
SFX_TR5_WEREWOLF_FORE_FEET = 971 ,
SFX_TR5_WEREWOLF_JUMP = 972 ,
SFX_TR5_WILLOW_WISP_LOOP = 973 ,
SFX_TR5_SWAMPY_ATTACK = 974 ,
SFX_TR5_LION_ATTACK = 975 ,
SFX_TR5_LION_DEATH = 976 ,
SFX_TR5_LION_FEET = 977 ,
SFX_TR5_LION_GROWL = 978 ,
SFX_TR5_LION_HIT_FLOOR = 979 ,
SFX_TR5_GUARD_SNORE_INHALE = 980 ,
SFX_TR5_GUARD_SNORE_EXHALE = 981 ,
SFX_TR5_INSECTS = 982 ,
SFX_TR5_KEYPAD_HASH = 983 ,
SFX_TR5_KEYPAD_ASTERISK = 984 ,
SFX_TR5_KEYPAD_0 = 985 ,
SFX_TR5_KEYPAD_1 = 986 ,
SFX_TR5_KEYPAD_2 = 987 ,
SFX_TR5_KEYPAD_3 = 988 ,
SFX_TR5_KEYPAD_4 = 989 ,
SFX_TR5_KEYPAD_5 = 990 ,
SFX_TR5_KEYPAD_6= 991 ,
SFX_TR5_KEYPAD_7 = 992 ,
SFX_TR5_KEYPAD_8 = 993 ,
SFX_TR5_KEYPAD_9 = 994 ,
SFX_TR5_KEYPAD_ENTRY_NO = 995 ,
SFX_TR5_KEYPAD_ENTRY_YES = 996 ,
SFX_TR5_GRILL_1 = 997 ,
SFX_TR5_GRILL_2 = 998 ,
SFX_TR5_GRILL_3 = 999 ,
SFX_TR5_COMPUTER_BEEPIES = 1000 ,
SFX_TR5_ELECTRIC_LIGHT_CRACKLES = 1001 ,
SFX_TR5_ELECTRIC_WIRES = 1002 ,
SFX_TR5_WATER_WHEEL = 1003 ,
SFX_TR5_AUTO_GUN_DOOR = 1004 ,
SFX_TR5_AUTO_GUN_UNFOLD = 1005 ,
SFX_TR5_BARN_DOOR_NORMAL = 1006 ,
SFX_TR5_BARN_DOOR_SLAM = 1007 ,
SFX_TR5_BATTERING_RAM_CREAK = 1008 ,
SFX_TR5_BELL = 1009 ,
SFX_TR5_BIO_BREATHE_OUT = 1010 ,
SFX_TR5_BOATMILL_1 = 1011 ,
SFX_TR5_BOATMILL_2 = 1012 ,
SFX_TR5_CABINETCLOSEWOOD = 1013 ,
SFX_TR5_CABINETOPENWOOD = 1014 ,
SFX_TR5_CABINETSHUT = 1015 ,
SFX_TR5_COG = 1016 ,
SFX_TR5_COGS_ROME = 1017 ,
SFX_TR5_CRANE = 1018 ,
SFX_TR5_SCIENTIST_SUIT_DOOR_END = 1019 ,
SFX_TR5_CAGE_OPEN = 1020 ,
SFX_TR5_METAL_KICK_OPEN = 1021 ,
SFX_TR5_METAL_CROWBAR_DOOR = 1022 ,
SFX_TR5_METAL_CROWBAR_DOOR_OPEN = 1023 ,
SFX_TR5_METAL_OPEN = 1024 ,
SFX_TR5_SWIPECARD_SFX = 1025 ,
SFX_TR5_DRAWERS_METALCLOSE = 1026 ,
SFX_TR5_DRAWERS_METALOPEN = 1027 ,
SFX_TR5_DRAWERS_WOOD_CLOSE = 1028 ,
SFX_TR5_DRAWERS_WOOD_OPEN = 1029 ,
SFX_TR5_FIRE_EXTINGUISHER_RICOCHET = 1030 ,
SFX_TR5_FIREDOOR = 1031 ,
SFX_TR5_FISH_TANK_WATER = 1032 ,
SFX_TR5_FLOOR_DOOR_A = 1033 ,
SFX_TR5_FLOOR_DOOR_B = 1034 ,
SFX_TR5_GEN_STONE_DOOR_LOW=1035,
SFX_TR5_GENSWORD_SWOOSH_LOW=1036,
SFX_TR5_GENERATOR_HUML_LOOP=1037,
SFX_TR5_GENERIC_BOOTSTEPS=1038,
SFX_TR5_GENERIC_KNEES_FALL=1039,
SFX_TR5_GENERIC_SQK_SLOW=1040,
SFX_TR5_GENERIC_SQKS_NONRND=1041,
SFX_TR5_BASE_CLAW_DROP=1042,
SFX_TR5_BASE_CLAW_CRASH=1043,
SFX_TR5_BASE_CLAW_MOTOR_A =1044,
SFX_TR5_BASE_CLAW_MOTOR_B_LOOP =1045,
SFX_TR5_BASE_CLAW_MOTOR_C =1046,
SFX_TR5_BASE_CLAW_TOP_IMPACT=1047,
SFX_TR5_BASE_CLAW_WINCH_LOOP=1048,
SFX_TR5_BASE_CLAW_HANGAR_DOOR_OPEN=1049,
SFX_TR5_HISS_LOOP_SMALL=1050,
SFX_TR5_HOLOGRAM=1051,
SFX_TR5_INDUSTRY_AMBIENCE_LOOP=1052,
SFX_TR5_IRIS_ELEC=1053,
SFX_TR5_CRANE_END=1054,
SFX_TR5_KITCHEN_HOB_LOOP=1055,
SFX_TR5_KLAXON=1056,
SFX_TR5_LASER_LOOP=1057,
SFX_TR5_LIFT_BRAKES_SQUEAL=1058,
SFX_TR5_LIFT_DOORS=1059,
SFX_TR5_LIFT_HIT_FLOOR1=1060,
SFX_TR5_LIFT_HIT_FLOOR2=1061,
SFX_TR5_LIFT_MOVE=1062,
SFX_TR5_LIFT_MOVE_BROKEN=1063,
SFX_TR5_LOCKER_CLOSE=1064,
SFX_TR5_LOCKER_OPEN=1065,
SFX_TR5_LOW_RUMBLE_LOWER=1066,
SFX_TR5_METAL_CABINET_CLOSE_1=1067,
SFX_TR5_METAL_CABINET_CLOSE_2=1068,
SFX_TR5_METAL_DOOR_OPEN_1=1069,
SFX_TR5_METAL_DOOR_OPEN_2=1070,
SFX_TR5_MODEM_LOOP=1071,
SFX_TR5_OFFICE_DOOR_CLOSE=1072,
SFX_TR5_OFFICE_DOOR_OPEN=1073,
SFX_TR5_OFFICE_DOOR_SQUEAK=1074,
SFX_TR5_PORTAL_LOOP=1075,
SFX_TR5_POUR_DUST=1076,
SFX_TR5_HITECH_ROOM_LOOP=1077,
SFX_TR5_XRAY_ROOM_LOOP=1078,
SFX_TR5_RATS=1079,
SFX_TR5_RATS_SPLASH=1080,
SFX_TR5_RAVEN_SWITCH_EXPLODE=1081,
SFX_TR5_DOOR_BEAM=1082,
SFX_TR5_LOWER_BEAM=1083,
SFX_TR5_ENERGY_BEAM=1084,
SFX_TR5_TARGET_RISE=1085,
SFX_TR5_SEARCHER=1086,
SFX_TR5_SERVO_01=1087,
SFX_TR5_SERVO_02=1088,
SFX_TR5_SHOWER_LOOP=1089,
SFX_TR5_SLIDE_DOOR=1090,
SFX_TR5_SMALL_METAL_VENT_HINGE=1091,
SFX_TR5_SMASH_GLASS=1092,
SFX_TR5_SMASH_METAL=1093,
SFX_TR5_SMASH_ROCK=1094,
SFX_TR5_SMASH_WOOD=1095,
SFX_TR5_PHILOSPHERS_STONE=1096,
SFX_TR5_STAIR_BANISTER_BEND=1097,
SFX_TR5_STAIR_SNAP=1098,
SFX_TR5_SUBCONTROL_ROOM_LOOP=1099,
SFX_TR5_SWITCH_ELEC_SWAP=1100,
SFX_TR5_TELEPORT=1101,
SFX_TR5_TELEPORT_CRACKLES=1102,
SFX_TR5_TELEPORT_FLASH=1103,
SFX_TR5_THUNDER_RUMBLE=1104,
SFX_TR5_WHITE_NOISE_LOOP=1105,
SFX_TR5_UNDERWATER_CHAFF=1106,
SFX_TR5_UNDERWATER_DOOR=1107,
SFX_TR5_UNDERWATER_EXPLOSION=1108,
SFX_TR5_UNDERWATER_FAN=1109,
SFX_TR5_UNDERWATER_TORPEDO=1110,
SFX_TR5_VCI_DOOR_CLOSE=1111,
SFX_TR5_VCI_DOOR_OPEN=1112,
SFX_TR5_VENT_IMPACT=1113,
SFX_TR5_VENT_STRESS=1114,
SFX_TR5_WALL_SUIT_OUT=1115,
SFX_TR5_WATER_LAPS_LOOP=1116,
SFX_TR5_WELD_THRU_DOOR_LOOP=1117,
SFX_TR5_XRAY_SCAN=1118,
SFX_TR5_MANHOLE_METAL=1119,
SFX_TR5_2GUNTEX_DEATH=1120,
SFX_TR5_2GUNTEX_FALL_BIG=1121,
SFX_TR5_2GUNTEX_FALL_END=1122,
SFX_TR5_2GUNTEX_FEET_LOUD=1123,
SFX_TR5_2GUNTEX_FEET_QUIET=1124,
SFX_TR5_2GUNTEX_HIT_GUNS=1125,
SFX_TR5_2GUNTEX_LASER_FIRE=1126,
SFX_TR5_2GUNTEX_DOUBLE_LASER_FIRE=1127,
SFX_TR5_2GUNTEX_LASER_MISFIRE=1128,
//Custom Footstep Sounds
SFX_TR5_HYDRA_BREATHEOUT = 915,
SFX_TR5_HYDRA_FIRE = 916,
SFX_TR5_TOR_ATTACK = 917,
SFX_TR5_GLADIATOR_DEATH = 918,
SFX_TR5_GLADIATOR_FEET = 919,
SFX_TR5_GLADIATOR_SHIELD1 = 920,
SFX_TR5_GLADIATOR_SHIELD2 = 921,
SFX_TR5_GLADIATOR_SWORD = 922,
SFX_TR5_GOD_HEAD_BLAST = 923,
SFX_TR5_GOD_HEAD_CHARGE = 924,
SFX_TR5_GOD_HEAD_LASERLOOPS = 925,
SFX_TR5_GOD_HEAD_TENTACLES = 926,
SFX_TR5_HAMMER_GOD_HAMMER_HIT = 927,
SFX_TR5_HAMMER_GOD_HAMMER_MED = 928,
SFX_TR5_HAMMER_GOD_HAMMER= 929,
SFX_TR5_HAMMER_GOD_PULSE = 930,
SFX_TR5_HANGMAN_LAUGH_OFFCAM = 931,
SFX_TR5_HITMAN_CHOKE = 932,
SFX_TR5_HITMAN_ELECSHORT = 933,
SFX_TR5_HITMAN_GUNSEND = 934,
SFX_TR5_HITMAN_GUNSFIRE = 935,
SFX_TR5_IMP_ATTACK = 936,
SFX_TR5_IMP_BARRELDROP = 937,
SFX_TR5_IMP_BARRELROLL = 938,
SFX_TR5_IMP_DEATH = 939,
SFX_TR5_IMP_FALL = 940,
SFX_TR5_IMP_FEET = 941,
SFX_TR5_IMP_LAUGH = 942,
SFX_TR5_IMP_RUNAWAY = 943,
SFX_TR5_IMP_STONEHIT = 944,
SFX_TR5_DIVE_SUIT_ENGINE = 945,
SFX_TR5_DIVE_SUIT_HIT = 946,
SFX_TR5_DIVE_SUIT_BREATHE = 947,
SFX_TR5_DIVE_SUIT_LOOP = 948,
SFX_TR5_MAFIA_DEATH = 949,
SFX_TR5_MAFIA_GETDOWN = 950,
SFX_TR5_MAFIA_HIT = 951,
SFX_TR5_MAFIA_JUMP = 952,
SFX_TR5_SWORD_GOD_SWORDDEATH1 = 953,
SFX_TR5_SWORD_GOD_FALL = 954,
SFX_TR5_SWORD_GOD_FEET = 955,
SFX_TR5_SWORD_GOD_FEETQUIET = 956,
SFX_TR5_SWORD_GOD_FEETVERYQUIET = 957,
SFX_TR5_SWORD_GOD_HITMETAL = 958,
SFX_TR5_SWORD_GOD_LASER = 959,
SFX_TR5_SWORD_GOD_SCREAM = 960,
SFX_TR5_SWORD_GOD_SWORD = 961,
SFX_TR5_SHOCKWAVE_RUMBLE = 962,
SFX_TR5_SKELETON_GHOST_APPEAR = 963,
SFX_TR5_SKELETONGHOST_ATTACK = 964,
SFX_TR5_SNIPER_RIFLE = 965,
SFX_TR5_WEREWOLF_ATTACK1 = 966,
SFX_TR5_WEREWOLF_ATTACK2 = 967,
SFX_TR5_WEREWOLF_DEATH = 968,
SFX_TR5_WEREWOLF_DROP = 969,
SFX_TR5_WEREWOLF_HIND_FEET = 970,
SFX_TR5_WEREWOLF_FORE_FEET = 971,
SFX_TR5_WEREWOLF_JUMP = 972,
SFX_TR5_WILLOW_WISP_LOOP = 973,
SFX_TR5_SWAMPY_ATTACK = 974,
SFX_TR5_LION_ATTACK = 975,
SFX_TR5_LION_DEATH = 976,
SFX_TR5_LION_FEET = 977,
SFX_TR5_LION_GROWL = 978,
SFX_TR5_LION_HIT_FLOOR = 979,
SFX_TR5_GUARD_SNORE_INHALE = 980,
SFX_TR5_GUARD_SNORE_EXHALE = 981,
SFX_TR5_INSECTS = 982,
SFX_TR5_KEYPAD_HASH = 983,
SFX_TR5_KEYPAD_ASTERISK = 984,
SFX_TR5_KEYPAD_0 = 985,
SFX_TR5_KEYPAD_1 = 986,
SFX_TR5_KEYPAD_2 = 987,
SFX_TR5_KEYPAD_3 = 988,
SFX_TR5_KEYPAD_4 = 989,
SFX_TR5_KEYPAD_5 = 990,
SFX_TR5_KEYPAD_6= 991,
SFX_TR5_KEYPAD_7 = 992,
SFX_TR5_KEYPAD_8 = 993,
SFX_TR5_KEYPAD_9 = 994,
SFX_TR5_KEYPAD_ENTRY_NO = 995,
SFX_TR5_KEYPAD_ENTRY_YES = 996,
SFX_TR5_GRILL_1 = 997,
SFX_TR5_GRILL_2 = 998,
SFX_TR5_GRILL_3 = 999,
SFX_TR5_COMPUTER_BEEPIES = 1000,
SFX_TR5_ELECTRIC_LIGHT_CRACKLES = 1001,
SFX_TR5_ELECTRIC_WIRES = 1002,
SFX_TR5_WATER_WHEEL = 1003,
SFX_TR5_AUTO_GUN_DOOR = 1004,
SFX_TR5_AUTO_GUN_UNFOLD = 1005,
SFX_TR5_BARN_DOOR_NORMAL = 1006,
SFX_TR5_BARN_DOOR_SLAM = 1007,
SFX_TR5_BATTERING_RAM_CREAK = 1008,
SFX_TR5_BELL = 1009,
SFX_TR5_BIO_BREATHE_OUT = 1010,
SFX_TR5_BOATMILL_1 = 1011,
SFX_TR5_BOATMILL_2 = 1012,
SFX_TR5_CABINETCLOSEWOOD = 1013,
SFX_TR5_CABINETOPENWOOD = 1014,
SFX_TR5_CABINETSHUT = 1015,
SFX_TR5_COG = 1016,
SFX_TR5_COGS_ROME = 1017,
SFX_TR5_CRANE = 1018,
SFX_TR5_SCIENTIST_SUIT_DOOR_END = 1019,
SFX_TR5_CAGE_OPEN = 1020,
SFX_TR5_METAL_KICK_OPEN = 1021,
SFX_TR5_METAL_CROWBAR_DOOR = 1022,
SFX_TR5_METAL_CROWBAR_DOOR_OPEN = 1023,
SFX_TR5_METAL_OPEN = 1024,
SFX_TR5_SWIPECARD_SFX = 1025,
SFX_TR5_DRAWERS_METALCLOSE = 1026,
SFX_TR5_DRAWERS_METALOPEN = 1027,
SFX_TR5_DRAWERS_WOOD_CLOSE = 1028,
SFX_TR5_DRAWERS_WOOD_OPEN = 1029,
SFX_TR5_FIRE_EXTINGUISHER_RICOCHET = 1030,
SFX_TR5_FIREDOOR = 1031,
SFX_TR5_FISH_TANK_WATER = 1032,
SFX_TR5_FLOOR_DOOR_A = 1033,
SFX_TR5_FLOOR_DOOR_B = 1034,
SFX_TR5_GEN_STONE_DOOR_LOW = 1035,
SFX_TR5_GENSWORD_SWOOSH_LOW = 1036,
SFX_TR5_GENERATOR_HUML_LOOP = 1037,
SFX_TR5_GENERIC_BOOTSTEPS = 1038,
SFX_TR5_GENERIC_KNEES_FALL = 1039,
SFX_TR5_GENERIC_SQK_SLOW = 1040,
SFX_TR5_GENERIC_SQKS_NONRND = 1041,
SFX_TR5_BASE_CLAW_DROP = 1042,
SFX_TR5_BASE_CLAW_CRASH = 1043,
SFX_TR5_BASE_CLAW_MOTOR_A = 1044,
SFX_TR5_BASE_CLAW_MOTOR_B_LOOP = 1045,
SFX_TR5_BASE_CLAW_MOTOR_C = 1046,
SFX_TR5_BASE_CLAW_TOP_IMPACT = 1047,
SFX_TR5_BASE_CLAW_WINCH_LOOP = 1048,
SFX_TR5_BASE_CLAW_HANGAR_DOOR_OPEN = 1049,
SFX_TR5_HISS_LOOP_SMALL = 1050,
SFX_TR5_HOLOGRAM = 1051,
SFX_TR5_INDUSTRY_AMBIENCE_LOOP = 1052,
SFX_TR5_IRIS_ELEC = 1053,
SFX_TR5_CRANE_END = 1054,
SFX_TR5_KITCHEN_HOB_LOOP = 1055,
SFX_TR5_KLAXON = 1056,
SFX_TR5_LASER_LOOP = 1057,
SFX_TR5_LIFT_BRAKES_SQUEAL = 1058,
SFX_TR5_LIFT_DOORS = 1059,
SFX_TR5_LIFT_HIT_FLOOR1 = 1060,
SFX_TR5_LIFT_HIT_FLOOR2 = 1061,
SFX_TR5_LIFT_MOVE = 1062,
SFX_TR5_LIFT_MOVE_BROKEN = 1063,
SFX_TR5_LOCKER_CLOSE = 1064,
SFX_TR5_LOCKER_OPEN = 1065,
SFX_TR5_LOW_RUMBLE_LOWER = 1066,
SFX_TR5_METAL_CABINET_CLOSE_1 = 1067,
SFX_TR5_METAL_CABINET_CLOSE_2 = 1068,
SFX_TR5_METAL_DOOR_OPEN_1 = 1069,
SFX_TR5_METAL_DOOR_OPEN_2 = 1070,
SFX_TR5_MODEM_LOOP = 1071,
SFX_TR5_OFFICE_DOOR_CLOSE = 1072,
SFX_TR5_OFFICE_DOOR_OPEN = 1073,
SFX_TR5_OFFICE_DOOR_SQUEAK = 1074,
SFX_TR5_PORTAL_LOOP = 1075,
SFX_TR5_POUR_DUST = 1076,
SFX_TR5_HITECH_ROOM_LOOP = 1077,
SFX_TR5_XRAY_ROOM_LOOP = 1078,
SFX_TR5_RATS = 1079,
SFX_TR5_RATS_SPLASH = 1080,
SFX_TR5_RAVEN_SWITCH_EXPLODE = 1081,
SFX_TR5_DOOR_BEAM = 1082,
SFX_TR5_LOWER_BEAM = 1083,
SFX_TR5_ENERGY_BEAM = 1084,
SFX_TR5_TARGET_RISE = 1085,
SFX_TR5_SEARCHER = 1086,
SFX_TR5_SERVO_01 = 1087,
SFX_TR5_SERVO_02 = 1088,
SFX_TR5_SHOWER_LOOP = 1089,
SFX_TR5_SLIDE_DOOR = 1090,
SFX_TR5_SMALL_METAL_VENT_HINGE = 1091,
SFX_TR5_SMASH_GLASS = 1092,
SFX_TR5_SMASH_METAL = 1093,
SFX_TR5_SMASH_ROCK = 1094,
SFX_TR5_SMASH_WOOD = 1095,
SFX_TR5_PHILOSPHERS_STONE = 1096,
SFX_TR5_STAIR_BANISTER_BEND = 1097,
SFX_TR5_STAIR_SNAP = 1098,
SFX_TR5_SUBCONTROL_ROOM_LOOP = 1099,
SFX_TR5_SWITCH_ELEC_SWAP = 1100,
SFX_TR5_TELEPORT = 1101,
SFX_TR5_TELEPORT_CRACKLES = 1102,
SFX_TR5_TELEPORT_FLASH = 1103,
SFX_TR5_THUNDER_RUMBLE = 1104,
SFX_TR5_WHITE_NOISE_LOOP = 1105,
SFX_TR5_UNDERWATER_CHAFF = 1106,
SFX_TR5_UNDERWATER_DOOR = 1107,
SFX_TR5_UNDERWATER_EXPLOSION = 1108,
SFX_TR5_UNDERWATER_FAN = 1109,
SFX_TR5_UNDERWATER_TORPEDO = 1110,
SFX_TR5_VCI_DOOR_CLOSE = 1111,
SFX_TR5_VCI_DOOR_OPEN = 1112,
SFX_TR5_VENT_IMPACT = 1113,
SFX_TR5_VENT_STRESS = 1114,
SFX_TR5_WALL_SUIT_OUT = 1115,
SFX_TR5_WATER_LAPS_LOOP = 1116,
SFX_TR5_WELD_THRU_DOOR_LOOP = 1117,
SFX_TR5_XRAY_SCAN = 1118,
SFX_TR5_MANHOLE_METAL = 1119,
SFX_TR5_2GUNTEX_DEATH = 1120,
SFX_TR5_2GUNTEX_FALL_BIG = 1121,
SFX_TR5_2GUNTEX_FALL_END = 1122,
SFX_TR5_2GUNTEX_FEET_LOUD = 1123,
SFX_TR5_2GUNTEX_FEET_QUIET = 1124,
SFX_TR5_2GUNTEX_HIT_GUNS = 1125,
SFX_TR5_2GUNTEX_LASER_FIRE = 1126,
SFX_TR5_2GUNTEX_DOUBLE_LASER_FIRE = 1127,
SFX_TR5_2GUNTEX_LASER_MISFIRE = 1128,
//Custom Footstep Sounds
SFX_CUSTOM_FOOTSTEP_SOUNDS_1 = 1129,
SFX_CUSTOM_FOOTSTEP_SOUNDS_2 = 1130,
SFX_CUSTOM_FOOTSTEP_SOUNDS_3 = 1131,
@ -1144,56 +1144,56 @@ enum SOUND_EFFECTS
SFX_CUSTOM_FOOTSTEP_SOUNDS_6 = 1134,
SFX_CUSTOM_FOOTSTEP_SOUNDS_7 = 1135,
SFX_CUSTOM_FOOTSTEP_SOUNDS_8 = 1136,
//Custom Level Builder slots
SFX_CUSTOM_1=1137,
SFX_CUSTOM_2=1138,
SFX_CUSTOM_3=1139,
SFX_CUSTOM_4=1140,
SFX_CUSTOM_5=1141,
SFX_CUSTOM_6=1142,
SFX_CUSTOM_7=1143,
SFX_CUSTOM_8=1144,
SFX_CUSTOM_9=1145,
SFX_CUSTOM_10=1146,
SFX_CUSTOM_11=1147,
SFX_CUSTOM_12=1148,
SFX_CUSTOM_13=1149,
SFX_CUSTOM_14=1150,
SFX_CUSTOM_15=1151,
SFX_CUSTOM_16=1152,
SFX_CUSTOM_17=1153,
SFX_CUSTOM_18=1154,
SFX_CUSTOM_19=1155,
SFX_CUSTOM_20=1156,
SFX_CUSTOM_21=1157,
SFX_CUSTOM_22=1158,
SFX_CUSTOM_23=1159,
SFX_CUSTOM_24=1160,
SFX_CUSTOM_25=1161,
SFX_CUSTOM_26=1162,
SFX_CUSTOM_27=1163,
SFX_CUSTOM_28=1164,
SFX_CUSTOM_29=1165,
SFX_CUSTOM_30=1166,
SFX_CUSTOM_31=1167,
SFX_CUSTOM_32=1168,
SFX_CUSTOM_33=1169,
SFX_CUSTOM_34=1170,
SFX_CUSTOM_35=1171,
SFX_CUSTOM_36=1172,
SFX_CUSTOM_37=1173,
SFX_CUSTOM_38=1174,
SFX_CUSTOM_39=1175,
SFX_CUSTOM_40=1176,
SFX_CUSTOM_41=1177,
SFX_CUSTOM_42=1178,
SFX_CUSTOM_43=1179,
SFX_CUSTOM_44=1180,
SFX_CUSTOM_45=1181,
SFX_CUSTOM_46=1182,
SFX_CUSTOM_47=1183,
SFX_CUSTOM_48=1184,
SFX_CUSTOM_49=1185,
SFX_CUSTOM_50=1186,
NUM_SFX,
//Custom Level Builder slots
SFX_CUSTOM_1 = 1137,
SFX_CUSTOM_2 = 1138,
SFX_CUSTOM_3 = 1139,
SFX_CUSTOM_4 = 1140,
SFX_CUSTOM_5 = 1141,
SFX_CUSTOM_6 = 1142,
SFX_CUSTOM_7 = 1143,
SFX_CUSTOM_8 = 1144,
SFX_CUSTOM_9 = 1145,
SFX_CUSTOM_10 = 1146,
SFX_CUSTOM_11 = 1147,
SFX_CUSTOM_12 = 1148,
SFX_CUSTOM_13 = 1149,
SFX_CUSTOM_14 = 1150,
SFX_CUSTOM_15 = 1151,
SFX_CUSTOM_16 = 1152,
SFX_CUSTOM_17 = 1153,
SFX_CUSTOM_18 = 1154,
SFX_CUSTOM_19 = 1155,
SFX_CUSTOM_20 = 1156,
SFX_CUSTOM_21 = 1157,
SFX_CUSTOM_22 = 1158,
SFX_CUSTOM_23 = 1159,
SFX_CUSTOM_24 = 1160,
SFX_CUSTOM_25 = 1161,
SFX_CUSTOM_26 = 1162,
SFX_CUSTOM_27 = 1163,
SFX_CUSTOM_28 = 1164,
SFX_CUSTOM_29 = 1165,
SFX_CUSTOM_30 = 1166,
SFX_CUSTOM_31 = 1167,
SFX_CUSTOM_32 = 1168,
SFX_CUSTOM_33 = 1169,
SFX_CUSTOM_34 = 1170,
SFX_CUSTOM_35 = 1171,
SFX_CUSTOM_36 = 1172,
SFX_CUSTOM_37 = 1173,
SFX_CUSTOM_38 = 1174,
SFX_CUSTOM_39 = 1175,
SFX_CUSTOM_40 = 1176,
SFX_CUSTOM_41 = 1177,
SFX_CUSTOM_42 = 1178,
SFX_CUSTOM_43 = 1179,
SFX_CUSTOM_44 = 1180,
SFX_CUSTOM_45 = 1181,
SFX_CUSTOM_46 = 1182,
SFX_CUSTOM_47 = 1183,
SFX_CUSTOM_48 = 1184,
SFX_CUSTOM_49 = 1185,
SFX_CUSTOM_50 = 1186,
NUM_SFX
};

View file

@ -255,7 +255,7 @@ int S_UpdateInput()
LaraItem->Animation.ActiveState == LS_CRAWL_BACK ||
LaraItem->Animation.ActiveState == LS_CRAWL_TO_HANG)
{
SoundEffect(SFX_TR4_LARA_NO, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_LARA_NO, nullptr, SoundEnvironment::Always);
flareNo = true;
}
else
@ -386,12 +386,12 @@ int S_UpdateInput()
Lara.PoisonPotency = 0;
LaraItem->HitPoints += LARA_HEALTH_MAX / 2;
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SFX_ALWAYS); // TODO: Fix heal sound not triggering if small medi doesn't top off Lara's health. original tr4/5 issue
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SoundEnvironment::Always); // TODO: Fix heal sound not triggering if small medi doesn't top off Lara's health. original tr4/5 issue
if (LaraItem->HitPoints > LARA_HEALTH_MAX)
{
LaraItem->HitPoints = LARA_HEALTH_MAX;
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SoundEnvironment::Always);
Statistics.Game.HealthUsed++;
}
}
@ -417,7 +417,7 @@ int S_UpdateInput()
if (LaraItem->HitPoints > LARA_HEALTH_MAX)
{
LaraItem->HitPoints = LARA_HEALTH_MAX;
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SFX_ALWAYS);
SoundEffect(SFX_TR4_MENU_MEDI, nullptr, SoundEnvironment::Always);
Statistics.Game.HealthUsed++;
}
}

View file

@ -0,0 +1,141 @@
#pragma once
#include "framework.h"
#include "Game/collision/floordata.h"
#include "Specific/newtypes.h"
#include "Specific/phd_global.h"
struct TriggerVolume;
constexpr auto MAX_FLIPMAP = 256;
struct ROOM_VERTEX
{
Vector3 position;
Vector3 normal;
Vector2 textureCoordinates;
Vector3 color;
int effects;
int index;
};
struct ROOM_DOOR
{
short room;
Vector3 normal;
Vector3 vertices[4];
};
struct ROOM_LIGHT
{
int x, y, z; // Position of light, in world coordinates
float r, g, b; // Colour of the light
float intensity;
float in; // Cosine of the IN value for light / size of IN value
float out; // Cosine of the OUT value for light / size of OUT value
float length; // Range of light
float cutoff; // Range of light
float dx, dy, dz; // Direction - used only by sun and spot lights
byte type;
bool castShadows;
};
struct MESH_INFO
{
PHD_3DPOS pos;
short staticNumber;
short flags;
Vector4 color;
short HitPoints;
std::string luaName;
};
struct LIGHTINFO
{
int x; // size=0, offset=0
int y; // size=0, offset=4
int z; // size=0, offset=8
unsigned char Type; // size=0, offset=12
unsigned char r; // size=0, offset=13
unsigned char g; // size=0, offset=14
unsigned char b; // size=0, offset=15
short nx; // size=0, offset=16
short ny; // size=0, offset=18
short nz; // size=0, offset=20
short Intensity; // size=0, offset=22
unsigned char Inner; // size=0, offset=24
unsigned char Outer; // size=0, offset=25
short FalloffScale; // size=0, offset=26
short Length; // size=0, offset=28
short Cutoff; // size=0, offset=30
};
enum RoomEnvFlags
{
ENV_FLAG_WATER = 0x0001,
ENV_FLAG_SWAMP = 0x0004,
ENV_FLAG_OUTSIDE = 0x0008,
ENV_FLAG_DYNAMIC_LIT = 0x0010,
ENV_FLAG_WIND = 0x0020,
ENV_FLAG_NOT_NEAR_OUTSIDE = 0x0040,
ENV_FLAG_NO_LENSFLARE = 0x0080, // Was quicksand in TR3.
ENV_FLAG_MIST = 0x0100,
ENV_FLAG_CAUSTICS = 0x0200,
ENV_FLAG_UNKNOWN3 = 0x0400,
ENV_FLAG_COLD = 0x1000
};
enum StaticMeshFlags : short
{
SM_VISIBLE = 1,
SM_SOLID = 2
};
struct ROOM_INFO
{
int x;
int y;
int z;
int minfloor;
int maxceiling;
std::vector<Vector3> positions;
std::vector<Vector3> normals;
std::vector<Vector3> colors;
std::vector<Vector3> effects;
std::vector<BUCKET> buckets;
std::vector<ROOM_DOOR> doors;
int xSize;
int zSize;
std::vector<FloorInfo> floor;
Vector3 ambient;
std::vector<ROOM_LIGHT> lights;
std::vector<MESH_INFO> mesh;
int flippedRoom;
int flags;
int meshEffect;
int reverbType;
int flipNumber;
short itemNumber;
short fxNumber;
bool boundActive;
std::vector<TriggerVolume> triggerVolumes;
};
constexpr auto NUM_ROOMS = 1024;
constexpr auto NO_ROOM = -1;
constexpr auto OUTSIDE_Z = 64;
constexpr auto OUTSIDE_SIZE = 1024;
extern byte FlipStatus;
extern int FlipStats[MAX_FLIPMAP];
extern int FlipMap[MAX_FLIPMAP];
void DoFlipMap(short group);
void AddRoomFlipItems(ROOM_INFO* room);
void RemoveRoomFlipItems(ROOM_INFO* room);
bool IsObjectInRoom(short roomNumber, short objectNumber);
bool IsPointInRoom(PHD_3DPOS const& pos, int roomNumber);
PHD_3DPOS GetRoomCenter(int roomNumber);
int IsRoomOutside(int x, int y, int z);
std::set<int> GetRoomList(int roomNumber);
FloorInfo* GetSector(ROOM_INFO* room, int x, int z);