1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-02-03 18:07:53 +01:00

Add plugin call for breakdowns (#24207)

This commit is contained in:
Max
2025-04-30 16:41:47 +02:00
committed by GitHub
parent ef8d978dc9
commit 08cb8cb8c3
5 changed files with 80 additions and 1 deletions

View File

@@ -46,7 +46,7 @@ namespace OpenRCT2
namespace OpenRCT2::Scripting
{
static constexpr int32_t kPluginApiVersion = 106;
static constexpr int32_t kPluginApiVersion = 107;
// Versions marking breaking changes.
static constexpr int32_t kApiVersionPeepDeprecation = 33;

View File

@@ -21,6 +21,16 @@
namespace OpenRCT2::Scripting
{
static const DukEnumMap<uint8_t> BreakdownMap // The types of breakdowns.
({ { "safety_cut_out", BREAKDOWN_SAFETY_CUT_OUT },
{ "restraints_stuck_closed", BREAKDOWN_RESTRAINTS_STUCK_CLOSED },
{ "restraints_stuck_open", BREAKDOWN_RESTRAINTS_STUCK_OPEN },
{ "doors_stuck_closed", BREAKDOWN_DOORS_STUCK_CLOSED },
{ "doors_stuck_open", BREAKDOWN_DOORS_STUCK_OPEN },
{ "vehicle_malfunction", BREAKDOWN_VEHICLE_MALFUNCTION },
{ "brakes_failure", BREAKDOWN_BRAKES_FAILURE },
{ "control_failure", BREAKDOWN_CONTROL_FAILURE } });
ScRide::ScRide(RideId rideId)
: _rideId(rideId)
{
@@ -489,6 +499,46 @@ namespace OpenRCT2::Scripting
return ::GetRide(_rideId);
}
void ScRide::SetBreakdown(const std::string& breakDown)
{
ThrowIfGameStateNotMutable();
auto ride = GetRide();
if (ride != nullptr && ride->canBreakDown() && ride->status == RideStatus::open)
{
auto it = BreakdownMap.find(breakDown);
if (it == BreakdownMap.end())
return;
RidePrepareBreakdown(*ride, it->second);
}
}
void ScRide::FixBreakdown()
{
ThrowIfGameStateNotMutable();
auto ride = GetRide();
if (ride != nullptr && ride->canBreakDown())
{
RideFixBreakdown(*ride, 0);
}
}
std::string ScRide::getBreakdown() const
{
auto ride = GetRide();
if (ride != nullptr)
{
if (!(ride->lifecycleFlags & RIDE_LIFECYCLE_BROKEN_DOWN))
{
return "none";
}
auto it = BreakdownMap.find(ride->breakdownReason);
if (it != BreakdownMap.end())
return std::string(it->first);
}
return "";
}
uint8_t ScRide::downtime_get() const
{
auto ride = GetRide();
@@ -642,6 +692,9 @@ namespace OpenRCT2::Scripting
dukglue_register_property(ctx, &ScRide::numDrops_get, nullptr, "numDrops");
dukglue_register_property(ctx, &ScRide::numLiftHills_get, nullptr, "numLiftHills");
dukglue_register_property(ctx, &ScRide::highestDropHeight_get, nullptr, "highestDropHeight");
dukglue_register_property(ctx, &ScRide::getBreakdown, nullptr, "breakdown");
dukglue_register_method(ctx, &ScRide::SetBreakdown, "setBreakdown");
dukglue_register_method(ctx, &ScRide::FixBreakdown, "fixBreakdown");
}
} // namespace OpenRCT2::Scripting

View File

@@ -192,6 +192,12 @@ namespace OpenRCT2::Scripting
Ride* GetRide() const;
void SetBreakdown(const std::string& breakDown);
void FixBreakdown();
std::string getBreakdown() const;
public:
static void Register(duk_context* ctx);
};