1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 12:33:17 +01:00

Play door sounds for land edge doors

This commit is contained in:
mix
2025-06-14 05:00:23 +01:00
parent 6c011c2a2a
commit 14aa6f7fdd
6 changed files with 41 additions and 14 deletions

View File

@@ -154,6 +154,14 @@ namespace OpenRCT2::Audio
extern VehicleSound gVehicleSoundList[kMaxVehicleSounds];
enum class DoorSoundType : uint8_t
{
none,
door,
portcullis,
};
constexpr uint8_t kDoorSoundTypeCount = 3;
/**
* Returns false when no audio device is available or when audio is turned off, otherwise true.
*/

View File

@@ -57,6 +57,11 @@ void TerrainEdgeObject::ReadJson(IReadObjectContext* context, json_t& root)
if (properties.is_object())
{
HasDoors = Json::GetBoolean(properties["hasDoors"]);
const uint32_t doorSoundNumber = Json::GetNumber<uint32_t>(properties["doorSound"]);
if (doorSoundNumber < OpenRCT2::Audio::kDoorSoundTypeCount)
{
doorSound = static_cast<OpenRCT2::Audio::DoorSoundType>(doorSoundNumber);
}
}
PopulateTablesFromJson(context, root);

View File

@@ -9,6 +9,7 @@
#pragma once
#include "../audio/Audio.h"
#include "Object.h"
class TerrainEdgeObject final : public Object
@@ -21,6 +22,7 @@ public:
uint32_t IconImageId{};
uint32_t BaseImageId{};
bool HasDoors{};
OpenRCT2::Audio::DoorSoundType doorSound{};
void ReadJson(IReadObjectContext* context, json_t& root) override;
void Load() override;

View File

@@ -9,7 +9,8 @@
#include "WallSceneryEntry.h"
DoorSoundType WallSceneryEntry::getDoorSoundType() const
OpenRCT2::Audio::DoorSoundType WallSceneryEntry::getDoorSoundType() const
{
return static_cast<DoorSoundType>((flags2 & WALL_SCENERY_2_DOOR_SOUND_MASK) >> WALL_SCENERY_2_DOOR_SOUND_SHIFT);
return static_cast<OpenRCT2::Audio::DoorSoundType>(
(flags2 & WALL_SCENERY_2_DOOR_SOUND_MASK) >> WALL_SCENERY_2_DOOR_SOUND_SHIFT);
}

View File

@@ -9,6 +9,7 @@
#pragma once
#include "../audio/Audio.h"
#include "../core/Money.hpp"
#include "../localisation/StringIdType.h"
#include "ObjectTypes.h"
@@ -36,13 +37,6 @@ enum WALL_SCENERY_2_FLAGS
WALL_SCENERY_2_ANIMATED = (1 << 4), // 0x10
};
enum class DoorSoundType : uint8_t
{
none,
door,
portcullis,
};
struct WallSceneryEntry
{
static constexpr auto kObjectType = ObjectType::walls;
@@ -57,5 +51,5 @@ struct WallSceneryEntry
ObjectEntryIndex scenery_tab_id;
uint8_t scrolling_mode;
DoorSoundType getDoorSoundType() const;
OpenRCT2::Audio::DoorSoundType getDoorSoundType() const;
};

View File

@@ -440,12 +440,14 @@ static constexpr OpenRCT2::Audio::SoundId kDoorOpenSoundIds[] = {
OpenRCT2::Audio::SoundId::DoorOpen, // DoorSoundType::door
OpenRCT2::Audio::SoundId::Portcullis, // DoorSoundType::portcullis
};
static_assert(std::size(kDoorOpenSoundIds) == OpenRCT2::Audio::kDoorSoundTypeCount);
static constexpr OpenRCT2::Audio::SoundId kDoorCloseSoundIds[] = {
OpenRCT2::Audio::SoundId::Null, // DoorSoundType::none
OpenRCT2::Audio::SoundId::DoorClose, // DoorSoundType::door
OpenRCT2::Audio::SoundId::Portcullis, // DoorSoundType::portcullis
};
static_assert(std::size(kDoorCloseSoundIds) == OpenRCT2::Audio::kDoorSoundTypeCount);
template<>
bool EntityBase::Is<Vehicle>() const
@@ -6347,7 +6349,9 @@ void Vehicle::UpdateSceneryDoor() const
}
template<bool isBackwards>
static void AnimateLandscapeDoor(const CoordsXYZ& doorLocation, TrackElement& trackElement, const bool isLastVehicle)
static void AnimateLandscapeDoor(
const CoordsXYZ& doorLocation, TrackElement& trackElement, const bool isLastVehicle,
const OpenRCT2::Audio::DoorSoundType doorSound, const CoordsXYZ& soundLocation)
{
const auto doorState = isBackwards ? trackElement.GetDoorAState() : trackElement.GetDoorBState();
if (!isLastVehicle && doorState == kLandEdgeDoorFrameClosed)
@@ -6358,6 +6362,7 @@ static void AnimateLandscapeDoor(const CoordsXYZ& doorLocation, TrackElement& tr
trackElement.SetDoorBState(kLandEdgeDoorFrameOpening);
MapAnimations::CreateTemporary(doorLocation, MapAnimations::TemporaryType::landEdgeDoor);
OpenRCT2::Audio::Play3D(kDoorOpenSoundIds[EnumValue(doorSound)], soundLocation);
}
if (isLastVehicle)
@@ -6368,6 +6373,7 @@ static void AnimateLandscapeDoor(const CoordsXYZ& doorLocation, TrackElement& tr
trackElement.SetDoorBState(kLandEdgeDoorFrameClosing);
MapAnimations::CreateTemporary(doorLocation, MapAnimations::TemporaryType::landEdgeDoor);
OpenRCT2::Audio::Play3D(kDoorCloseSoundIds[EnumValue(doorSound)], soundLocation);
}
}
@@ -6398,8 +6404,13 @@ void Vehicle::UpdateLandscapeDoors(const int32_t previousTrackHeight) const
const auto* const surfaceElement = GetSurfaceElementAfterElement(previousTrackElement);
if (surfaceElement != nullptr && surfaceElement->GetBaseZ() > previousTrackLocation.z)
{
AnimateLandscapeDoor<false>(
previousTrackLocation, *previousTrackElement->AsTrack(), next_vehicle_on_train.IsNull());
const auto* const edgeObject = surfaceElement->GetEdgeObject();
if (edgeObject != nullptr && edgeObject->HasDoors)
{
AnimateLandscapeDoor<false>(
previousTrackLocation, *previousTrackElement->AsTrack(), next_vehicle_on_train.IsNull(),
edgeObject->doorSound, TrackLocation);
}
}
}
else if (previousTrackElement == nullptr && currentTrackElement != nullptr)
@@ -6407,7 +6418,13 @@ void Vehicle::UpdateLandscapeDoors(const int32_t previousTrackHeight) const
const auto* const surfaceElement = GetSurfaceElementAfterElement(currentTrackElement);
if (surfaceElement != nullptr && surfaceElement->GetBaseZ() > TrackLocation.z)
{
AnimateLandscapeDoor<true>(TrackLocation, *currentTrackElement->AsTrack(), next_vehicle_on_train.IsNull());
const auto* const edgeObject = surfaceElement->GetEdgeObject();
if (edgeObject != nullptr && edgeObject->HasDoors)
{
AnimateLandscapeDoor<true>(
TrackLocation, *currentTrackElement->AsTrack(), next_vehicle_on_train.IsNull(), edgeObject->doorSound,
previousTrackLocation);
}
}
}
}