diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 956238c7d8..b92becd0f9 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -250,15 +250,19 @@ export interface Tile { getElement(index: number): TileElement; } -export interface RideObject { - readonly id: number; +export interface Object { + readonly identifier: string; readonly name: string; +} + +export interface RideObject extends Object { readonly description: string; readonly capacity: string; } export interface Ride { readonly object: RideObject; + readonly id: number; type: string; name: string; excitement: number; diff --git a/src/openrct2/scripting/ScMap.hpp b/src/openrct2/scripting/ScMap.hpp index 61f12c2c94..2d8c9d097d 100644 --- a/src/openrct2/scripting/ScMap.hpp +++ b/src/openrct2/scripting/ScMap.hpp @@ -13,6 +13,7 @@ #include "../ride/Ride.h" #include "../world/Map.h" #include "Duktape.hpp" +#include "ScRide.hpp" #include "ScThing.hpp" #include "ScTile.hpp" @@ -42,7 +43,7 @@ namespace OpenRCT2::Scripting int32_t rides_get() { - return MAX_RIDES; + return static_cast(GetRideManager().size()); } int32_t things_get() @@ -50,6 +51,20 @@ namespace OpenRCT2::Scripting return MAX_SPRITES; } + std::shared_ptr getRide(int32_t id) + { + auto rideManager = GetRideManager(); + if (id >= 0 && id < rideManager.size()) + { + auto ride = rideManager[static_cast(id)]; + if (ride != nullptr) + { + return std::make_shared(ride); + } + } + return nullptr; + } + std::shared_ptr getTile(int32_t x, int32_t y) { auto coords = TileCoordsXY(x, y).ToCoordsXY(); @@ -75,6 +90,7 @@ namespace OpenRCT2::Scripting dukglue_register_property(ctx, &ScMap::size_get, nullptr, "size"); dukglue_register_property(ctx, &ScMap::rides_get, nullptr, "rides"); dukglue_register_property(ctx, &ScMap::things_get, nullptr, "things"); + dukglue_register_method(ctx, &ScMap::getRide, "getRide"); dukglue_register_method(ctx, &ScMap::getTile, "getTile"); dukglue_register_method(ctx, &ScMap::getThing, "getThing"); } diff --git a/src/openrct2/scripting/ScRide.hpp b/src/openrct2/scripting/ScRide.hpp new file mode 100644 index 0000000000..7bb3ae0fb6 --- /dev/null +++ b/src/openrct2/scripting/ScRide.hpp @@ -0,0 +1,168 @@ +/***************************************************************************** + * Copyright (c) 2020 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../common.h" +#include "../object/RideObject.h" +#include "../ride/Ride.h" +#include "Duktape.hpp" + +namespace OpenRCT2::Scripting +{ + class ScRideObject + { + private: + rct_ride_entry* _entry; + + public: + ScRideObject(rct_ride_entry* entry) + { + _entry = entry; + } + + static void Register(duk_context* ctx) + { + dukglue_register_property(ctx, &id_get, nullptr, "identifier"); + dukglue_register_property(ctx, &name_get, nullptr, "name"); + dukglue_register_property(ctx, &description_get, nullptr, "description"); + dukglue_register_property(ctx, &capacity_get, nullptr, "capacity"); + } + + private: + std::string id_get() + { + auto obj = static_cast(_entry->obj); + if (obj != nullptr) + { + return obj->GetIdentifier(); + } + return {}; + } + + std::string name_get() + { + auto obj = static_cast(_entry->obj); + if (obj != nullptr) + { + return obj->GetName(); + } + return {}; + } + + std::string description_get() + { + auto obj = static_cast(_entry->obj); + if (obj != nullptr) + { + return obj->GetDescription(); + } + return {}; + } + + std::string capacity_get() + { + auto obj = static_cast(_entry->obj); + if (obj != nullptr) + { + return obj->GetCapacity(); + } + return {}; + } + }; + + class ScRide + { + private: + Ride* _ride; + + public: + ScRide(Ride* ride) + : _ride(ride) + { + } + + int32_t id_get() + { + return _ride->id; + } + + std::shared_ptr object_get() + { + auto rideEntry = _ride->GetRideEntry(); + if (rideEntry != nullptr) + { + return std::make_shared(rideEntry); + } + return nullptr; + } + + int32_t type_get() + { + return _ride->type; + } + + std::string name_get() + { + return _ride->GetName(); + } + void name_set(std::string value) + { + _ride->custom_name = value; + } + + int32_t excitement_get() + { + return _ride->excitement; + } + void excitement_set(int32_t value) + { + _ride->excitement = value; + } + + int32_t intensity_get() + { + return _ride->intensity; + } + void intensity_set(int32_t value) + { + _ride->intensity = value; + } + + int32_t nausea_get() + { + return _ride->nausea; + } + void nausea_set(int32_t value) + { + _ride->nausea = value; + } + + int32_t totalCustomers_get() + { + return _ride->total_customers; + } + void totalCustomers_set(int32_t value) + { + _ride->total_customers = value; + } + + static void Register(duk_context* ctx) + { + dukglue_register_property(ctx, &ScRide::id_get, nullptr, "id"); + dukglue_register_property(ctx, &ScRide::object_get, nullptr, "object"); + dukglue_register_property(ctx, &ScRide::type_get, nullptr, "type"); + dukglue_register_property(ctx, &ScRide::name_get, &ScRide::name_set, "name"); + dukglue_register_property(ctx, &ScRide::excitement_get, &ScRide::excitement_set, "excitement"); + dukglue_register_property(ctx, &ScRide::intensity_get, &ScRide::intensity_set, "intensity"); + dukglue_register_property(ctx, &ScRide::nausea_get, &ScRide::nausea_set, "nausea"); + dukglue_register_property(ctx, &ScRide::totalCustomers_get, &ScRide::totalCustomers_set, "totalCustomers"); + } + }; +} // namespace OpenRCT2::Scripting diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index aa3c4fdebf..08f59ef7a0 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -22,6 +22,7 @@ #include "ScMap.hpp" #include "ScNetwork.hpp" #include "ScPark.hpp" +#include "ScRide.hpp" #include "ScThing.hpp" #include "ScTile.hpp" @@ -67,6 +68,8 @@ void ScriptEngine::Initialise() ScPark::Register(ctx); ScPlayer::Register(ctx); ScPlayerGroup::Register(ctx); + ScRide::Register(ctx); + ScRideObject::Register(ctx); ScTile::Register(ctx); ScTileElement::Register(ctx); ScThing::Register(ctx);