mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-23 15:52:55 +01:00
Add APIs for getting info about loaded objects
This commit is contained in:
37
distribution/openrct2.d.ts
vendored
37
distribution/openrct2.d.ts
vendored
@@ -112,6 +112,17 @@ declare global {
|
|||||||
*/
|
*/
|
||||||
sharedStorage: Configuration;
|
sharedStorage: Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the loaded object at the given index.
|
||||||
|
* @param type The object type.
|
||||||
|
* @param index The index.
|
||||||
|
*/
|
||||||
|
getObject(type: ObjectType, index: number): Object;
|
||||||
|
getObject(type: "ride", index: number): RideObject;
|
||||||
|
|
||||||
|
getAllObjects(type: ObjectType): Object[];
|
||||||
|
getAllObjects(type: "ride"): RideObject[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a random integer within the specified range using the game's pseudo-
|
* Gets a random integer within the specified range using the game's pseudo-
|
||||||
* random number generator. This is part of the game state and shared across
|
* random number generator. This is part of the game state and shared across
|
||||||
@@ -175,6 +186,22 @@ declare global {
|
|||||||
has(key: string): boolean;
|
has(key: string): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ObjectType =
|
||||||
|
"ride" |
|
||||||
|
"small_scenery" |
|
||||||
|
"large_scenery" |
|
||||||
|
"wall" |
|
||||||
|
"banner" |
|
||||||
|
"footpath" |
|
||||||
|
"footpath_addition" |
|
||||||
|
"scenery_group" |
|
||||||
|
"park_entrance" |
|
||||||
|
"water" |
|
||||||
|
"terrain_surface" |
|
||||||
|
"terrain_edge" |
|
||||||
|
"station" |
|
||||||
|
"music";
|
||||||
|
|
||||||
type HookType =
|
type HookType =
|
||||||
"interval.tick" | "interval.day" |
|
"interval.tick" | "interval.day" |
|
||||||
"network.chat" | "network.action" | "network.join" | "network.leave";
|
"network.chat" | "network.action" | "network.join" | "network.leave";
|
||||||
@@ -407,6 +434,16 @@ declare global {
|
|||||||
* Represents the definition of a loaded object (.DAT or .json) such a ride type or scenery item.
|
* Represents the definition of a loaded object (.DAT or .json) such a ride type or scenery item.
|
||||||
*/
|
*/
|
||||||
interface Object {
|
interface Object {
|
||||||
|
/**
|
||||||
|
* The object type.
|
||||||
|
*/
|
||||||
|
readonly type: ObjectType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The index of the loaded object for the object type.
|
||||||
|
*/
|
||||||
|
readonly index: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The unique name identifier of the object, e.g. "BURGB ".
|
* The unique name identifier of the object, e.g. "BURGB ".
|
||||||
* This may have trailing spaces if the name is shorter than 8 characters.
|
* This may have trailing spaces if the name is shorter than 8 characters.
|
||||||
|
|||||||
@@ -14,11 +14,13 @@
|
|||||||
# include "../actions/CustomAction.hpp"
|
# include "../actions/CustomAction.hpp"
|
||||||
# include "../actions/ParkSetNameAction.hpp"
|
# include "../actions/ParkSetNameAction.hpp"
|
||||||
# include "../actions/SmallSceneryPlaceAction.hpp"
|
# include "../actions/SmallSceneryPlaceAction.hpp"
|
||||||
|
# include "../object/ObjectManager.h"
|
||||||
# include "../scenario/Scenario.h"
|
# include "../scenario/Scenario.h"
|
||||||
# include "Duktape.hpp"
|
# include "Duktape.hpp"
|
||||||
# include "HookEngine.h"
|
# include "HookEngine.h"
|
||||||
# include "ScConfiguration.hpp"
|
# include "ScConfiguration.hpp"
|
||||||
# include "ScDisposable.hpp"
|
# include "ScDisposable.hpp"
|
||||||
|
# include "ScObject.hpp"
|
||||||
# include "ScriptEngine.h"
|
# include "ScriptEngine.h"
|
||||||
|
|
||||||
# include <cstdio>
|
# include <cstdio>
|
||||||
@@ -51,8 +53,64 @@ namespace OpenRCT2::Scripting
|
|||||||
return std::make_shared<ScConfiguration>(scriptEngine.GetSharedStorage());
|
return std::make_shared<ScConfiguration>(scriptEngine.GetSharedStorage());
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerIntent(const DukValue& desc)
|
static DukValue CreateScObject(duk_context* ctx, uint8_t type, int32_t index)
|
||||||
{
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case OBJECT_TYPE_RIDE:
|
||||||
|
return GetObjectAsDukValue(ctx, std::make_shared<ScRideObject>(type, index));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return GetObjectAsDukValue(ctx, std::make_shared<ScObject>(type, index));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DukValue getObject(const std::string& typez, int32_t index)
|
||||||
|
{
|
||||||
|
auto ctx = GetContext()->GetScriptEngine().GetContext();
|
||||||
|
auto& objManager = GetContext()->GetObjectManager();
|
||||||
|
|
||||||
|
auto type = ScObject::StringToObjectType(typez);
|
||||||
|
if (type)
|
||||||
|
{
|
||||||
|
auto obj = objManager.GetLoadedObject(*type, index);
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
return CreateScObject(ctx, *type, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
duk_error(ctx, DUK_ERR_ERROR, "Invalid object type.");
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<DukValue> getAllObjects(const std::string& typez)
|
||||||
|
{
|
||||||
|
auto ctx = GetContext()->GetScriptEngine().GetContext();
|
||||||
|
auto& objManager = GetContext()->GetObjectManager();
|
||||||
|
|
||||||
|
std::vector<DukValue> result;
|
||||||
|
auto type = ScObject::StringToObjectType(typez);
|
||||||
|
if (type)
|
||||||
|
{
|
||||||
|
auto count = object_entry_group_counts[*type];
|
||||||
|
for (int32_t i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
auto obj = objManager.GetLoadedObject(*type, i);
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
result.push_back(CreateScObject(ctx, *type, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
duk_error(ctx, DUK_ERR_ERROR, "Invalid object type.");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getRandom(int32_t min, int32_t max)
|
int32_t getRandom(int32_t min, int32_t max)
|
||||||
@@ -230,8 +288,9 @@ namespace OpenRCT2::Scripting
|
|||||||
{
|
{
|
||||||
dukglue_register_property(ctx, &ScContext::configuration_get, nullptr, "configuration");
|
dukglue_register_property(ctx, &ScContext::configuration_get, nullptr, "configuration");
|
||||||
dukglue_register_property(ctx, &ScContext::sharedStorage_get, nullptr, "sharedStorage");
|
dukglue_register_property(ctx, &ScContext::sharedStorage_get, nullptr, "sharedStorage");
|
||||||
|
dukglue_register_method(ctx, &ScContext::getObject, "getObject");
|
||||||
|
dukglue_register_method(ctx, &ScContext::getAllObjects, "getAllObjects");
|
||||||
dukglue_register_method(ctx, &ScContext::getRandom, "getRandom");
|
dukglue_register_method(ctx, &ScContext::getRandom, "getRandom");
|
||||||
dukglue_register_method(ctx, &ScContext::registerIntent, "registerIntent");
|
|
||||||
dukglue_register_method(ctx, &ScContext::subscribe, "subscribe");
|
dukglue_register_method(ctx, &ScContext::subscribe, "subscribe");
|
||||||
dukglue_register_method(ctx, &ScContext::queryAction, "queryAction");
|
dukglue_register_method(ctx, &ScContext::queryAction, "queryAction");
|
||||||
dukglue_register_method(ctx, &ScContext::executeAction, "executeAction");
|
dukglue_register_method(ctx, &ScContext::executeAction, "executeAction");
|
||||||
|
|||||||
151
src/openrct2/scripting/ScObject.hpp
Normal file
151
src/openrct2/scripting/ScObject.hpp
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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
|
||||||
|
|
||||||
|
#ifdef __ENABLE_SCRIPTING__
|
||||||
|
|
||||||
|
# include "../common.h"
|
||||||
|
# include "../object/ObjectManager.h"
|
||||||
|
# include "../object/RideObject.h"
|
||||||
|
# include "Duktape.hpp"
|
||||||
|
# include "ScriptEngine.h"
|
||||||
|
|
||||||
|
# include <optional>
|
||||||
|
|
||||||
|
namespace OpenRCT2::Scripting
|
||||||
|
{
|
||||||
|
class ScObject
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _type{};
|
||||||
|
int32_t _index{};
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScObject(uint8_t type, int32_t index)
|
||||||
|
: _type(type)
|
||||||
|
, _index(index)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Register(duk_context* ctx)
|
||||||
|
{
|
||||||
|
dukglue_register_property(ctx, &ScObject::type_get, nullptr, "type");
|
||||||
|
dukglue_register_property(ctx, &ScObject::index_get, nullptr, "index");
|
||||||
|
dukglue_register_property(ctx, &ScObject::identifier_get, nullptr, "identifier");
|
||||||
|
dukglue_register_property(ctx, &ScObject::name_get, nullptr, "name");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::optional<uint8_t> StringToObjectType(const std::string_view& type)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < OBJECT_TYPE_COUNT; i++)
|
||||||
|
{
|
||||||
|
auto s = ObjectTypeToString(i);
|
||||||
|
if (s == type)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string_view ObjectTypeToString(uint8_t type)
|
||||||
|
{
|
||||||
|
static const char* Types[] = { "ride", "small_scenery", "large_scenery", "wall", "banner",
|
||||||
|
"footpath", "footpath_addition", "scenery_group", "park_entrance", "water",
|
||||||
|
"stex", "terrain_surface", "terrain_edge", "station", "music" };
|
||||||
|
if (type >= std::size(Types))
|
||||||
|
return "unknown";
|
||||||
|
return Types[type];
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string type_get()
|
||||||
|
{
|
||||||
|
return std::string(ObjectTypeToString(_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t index_get()
|
||||||
|
{
|
||||||
|
return _index;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string identifier_get()
|
||||||
|
{
|
||||||
|
auto obj = GetObject();
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
return obj->GetIdentifier();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string name_get()
|
||||||
|
{
|
||||||
|
auto obj = GetObject();
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
return obj->GetName();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Object* GetObject()
|
||||||
|
{
|
||||||
|
auto& objManager = GetContext()->GetObjectManager();
|
||||||
|
return objManager.GetLoadedObject(_type, _index);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScRideObject : public ScObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScRideObject(uint8_t type, int32_t index)
|
||||||
|
: ScObject(type, index)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Register(duk_context* ctx)
|
||||||
|
{
|
||||||
|
dukglue_set_base_class<ScObject, ScRideObject>(ctx);
|
||||||
|
dukglue_register_property(ctx, &ScRideObject::description_get, nullptr, "description");
|
||||||
|
dukglue_register_property(ctx, &ScRideObject::capacity_get, nullptr, "capacity");
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string description_get()
|
||||||
|
{
|
||||||
|
auto obj = GetObject();
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
return obj->GetDescription();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string capacity_get()
|
||||||
|
{
|
||||||
|
auto obj = GetObject();
|
||||||
|
if (obj != nullptr)
|
||||||
|
{
|
||||||
|
return obj->GetCapacity();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
RideObject* GetObject()
|
||||||
|
{
|
||||||
|
return static_cast<RideObject*>(ScObject::GetObject());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace OpenRCT2::Scripting
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -12,74 +12,13 @@
|
|||||||
#ifdef __ENABLE_SCRIPTING__
|
#ifdef __ENABLE_SCRIPTING__
|
||||||
|
|
||||||
# include "../common.h"
|
# include "../common.h"
|
||||||
# include "../object/RideObject.h"
|
|
||||||
# include "../ride/Ride.h"
|
# include "../ride/Ride.h"
|
||||||
# include "Duktape.hpp"
|
# include "Duktape.hpp"
|
||||||
|
# include "ScObject.hpp"
|
||||||
# include "ScriptEngine.h"
|
# include "ScriptEngine.h"
|
||||||
|
|
||||||
namespace OpenRCT2::Scripting
|
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, &ScRideObject::id_get, nullptr, "identifier");
|
|
||||||
dukglue_register_property(ctx, &ScRideObject::name_get, nullptr, "name");
|
|
||||||
dukglue_register_property(ctx, &ScRideObject::description_get, nullptr, "description");
|
|
||||||
dukglue_register_property(ctx, &ScRideObject::capacity_get, nullptr, "capacity");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string id_get()
|
|
||||||
{
|
|
||||||
auto obj = static_cast<Object*>(_entry->obj);
|
|
||||||
if (obj != nullptr)
|
|
||||||
{
|
|
||||||
return obj->GetIdentifier();
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string name_get()
|
|
||||||
{
|
|
||||||
auto obj = static_cast<Object*>(_entry->obj);
|
|
||||||
if (obj != nullptr)
|
|
||||||
{
|
|
||||||
return obj->GetName();
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string description_get()
|
|
||||||
{
|
|
||||||
auto obj = static_cast<RideObject*>(_entry->obj);
|
|
||||||
if (obj != nullptr)
|
|
||||||
{
|
|
||||||
return obj->GetDescription();
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string capacity_get()
|
|
||||||
{
|
|
||||||
auto obj = static_cast<RideObject*>(_entry->obj);
|
|
||||||
if (obj != nullptr)
|
|
||||||
{
|
|
||||||
return obj->GetCapacity();
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ScRide
|
class ScRide
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@@ -102,10 +41,10 @@ namespace OpenRCT2::Scripting
|
|||||||
auto ride = GetRide();
|
auto ride = GetRide();
|
||||||
if (ride != nullptr)
|
if (ride != nullptr)
|
||||||
{
|
{
|
||||||
auto rideEntry = ride->GetRideEntry();
|
auto rideObject = GetContext()->GetObjectManager().GetLoadedObject(OBJECT_TYPE_RIDE, ride->subtype);
|
||||||
if (rideEntry != nullptr)
|
if (rideObject != nullptr)
|
||||||
{
|
{
|
||||||
return std::make_shared<ScRideObject>(rideEntry);
|
return std::make_shared<ScRideObject>(OBJECT_TYPE_RIDE, ride->subtype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
# include "ScDisposable.hpp"
|
# include "ScDisposable.hpp"
|
||||||
# include "ScMap.hpp"
|
# include "ScMap.hpp"
|
||||||
# include "ScNetwork.hpp"
|
# include "ScNetwork.hpp"
|
||||||
|
# include "ScObject.hpp"
|
||||||
# include "ScPark.hpp"
|
# include "ScPark.hpp"
|
||||||
# include "ScRide.hpp"
|
# include "ScRide.hpp"
|
||||||
# include "ScThing.hpp"
|
# include "ScThing.hpp"
|
||||||
@@ -373,6 +374,7 @@ void ScriptEngine::Initialise()
|
|||||||
ScDisposable::Register(ctx);
|
ScDisposable::Register(ctx);
|
||||||
ScMap::Register(ctx);
|
ScMap::Register(ctx);
|
||||||
ScNetwork::Register(ctx);
|
ScNetwork::Register(ctx);
|
||||||
|
ScObject::Register(ctx);
|
||||||
ScPark::Register(ctx);
|
ScPark::Register(ctx);
|
||||||
ScPlayer::Register(ctx);
|
ScPlayer::Register(ctx);
|
||||||
ScPlayerGroup::Register(ctx);
|
ScPlayerGroup::Register(ctx);
|
||||||
|
|||||||
Reference in New Issue
Block a user