From ef35dfa40a3c054deba7136608b65641f0241e21 Mon Sep 17 00:00:00 2001 From: Nikolas Parshook Date: Thu, 13 Apr 2023 15:09:15 -0400 Subject: [PATCH] Expose obj image offset and num images to plugins (#17567) Co-authored-by: Duncan --- contributors.md | 1 + distribution/openrct2.d.ts | 28 +++++++++++++++---- src/openrct2/object/BannerObject.cpp | 5 ++-- src/openrct2/object/EntranceObject.cpp | 5 ++-- src/openrct2/object/FootpathItemObject.cpp | 5 ++-- src/openrct2/object/FootpathObject.cpp | 5 ++-- .../object/FootpathRailingsObject.cpp | 5 ++-- src/openrct2/object/FootpathSurfaceObject.cpp | 4 +-- src/openrct2/object/LargeSceneryObject.cpp | 5 ++-- src/openrct2/object/MusicObject.cpp | 4 +-- src/openrct2/object/Object.cpp | 18 ++++++++++++ src/openrct2/object/Object.h | 9 ++++++ src/openrct2/object/RideObject.cpp | 5 ++-- src/openrct2/object/SceneryGroupObject.cpp | 5 ++-- src/openrct2/object/SmallSceneryObject.cpp | 5 ++-- src/openrct2/object/StationObject.cpp | 5 ++-- src/openrct2/object/TerrainEdgeObject.cpp | 5 ++-- src/openrct2/object/TerrainSurfaceObject.cpp | 5 ++-- src/openrct2/object/WallObject.cpp | 5 ++-- src/openrct2/object/WaterObject.cpp | 5 ++-- src/openrct2/scripting/ScriptEngine.h | 2 +- .../scripting/bindings/object/ScObject.hpp | 22 +++++++++++++++ 22 files changed, 106 insertions(+), 52 deletions(-) diff --git a/contributors.md b/contributors.md index 1360a33489..2c2b023f84 100644 --- a/contributors.md +++ b/contributors.md @@ -106,6 +106,7 @@ The following people are not part of the development team, but have been contrib * Josh Trzebiatowski (trzejos) - Ride and scenery filtering * (kyphii) - Extended color selection * Phumdol Lookthipnapha (beam41) - Misc. +* Nikolas Parshook (nparshook) - Misc. * Wenzhao Qiu (qwzhaox) - Misc. ## Bug fixes diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 0b3f305d33..3662b291a9 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -221,11 +221,13 @@ declare global { * @param type The object type. * @param index The index. */ - getObject(type: ObjectType, index: number): LoadedObject; + getObject(type: ObjectType, index: number): LoadedImageObject; + getObject(type: "music", index: number): LoadedObject; getObject(type: "ride", index: number): RideObject; getObject(type: "small_scenery", index: number): SmallSceneryObject; - getAllObjects(type: ObjectType): LoadedObject[]; + getAllObjects(type: ObjectType): LoadedImageObject[]; + getAllObjects(type: "music"): LoadedObject[]; getAllObjects(type: "ride"): RideObject[]; /** @@ -1585,7 +1587,7 @@ 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 as ride type or scenery item. */ interface LoadedObject { /** @@ -1617,10 +1619,26 @@ declare global { readonly name: string; } + /** + * Represents the definition of a loaded object that has one or more associated images. + */ + interface LoadedImageObject extends LoadedObject { + /** + * Id of the objects base image. This is also known as the preview image. + */ + readonly baseImageId: number; + + /** + * The number of images for this object. + * Use this in conjunction with the baseImageId to iterate over an objects images. + */ + readonly numImages: number; + } + /** * Represents the object definition of a ride or stall. */ - interface RideObject extends LoadedObject { + interface RideObject extends LoadedImageObject { /** * The description of the ride / stall in the player's current language. */ @@ -1727,7 +1745,7 @@ declare global { /** * Represents the object definition of a small scenery item such a tree. */ - interface SmallSceneryObject extends LoadedObject { + interface SmallSceneryObject extends LoadedImageObject { /** * Raw bit flags that describe characteristics of the scenery item. */ diff --git a/src/openrct2/object/BannerObject.cpp b/src/openrct2/object/BannerObject.cpp index 90bc64f9dd..2f591f6146 100644 --- a/src/openrct2/object/BannerObject.cpp +++ b/src/openrct2/object/BannerObject.cpp @@ -12,7 +12,6 @@ #include "../core/IStream.hpp" #include "../core/Json.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Language.h" #include "../object/Object.h" #include "../object/ObjectRepository.h" @@ -62,13 +61,13 @@ void BannerObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); } void BannerObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/EntranceObject.cpp b/src/openrct2/object/EntranceObject.cpp index 26bcd8ea24..43bded817c 100644 --- a/src/openrct2/object/EntranceObject.cpp +++ b/src/openrct2/object/EntranceObject.cpp @@ -13,7 +13,6 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Localisation.h" void EntranceObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStream* stream) @@ -30,13 +29,13 @@ void EntranceObject::Load() { GetStringTable().Sort(); _legacyType.string_idx = LanguageAllocateObjectString(GetName()); - _legacyType.image_id = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image_id = LoadImages(); } void EntranceObject::Unload() { LanguageFreeObjectString(_legacyType.string_idx); - GfxObjectFreeImages(_legacyType.image_id, GetImageTable().GetCount()); + UnloadImages(); _legacyType.string_idx = 0; _legacyType.image_id = 0; diff --git a/src/openrct2/object/FootpathItemObject.cpp b/src/openrct2/object/FootpathItemObject.cpp index 314b347528..b0a327d82e 100644 --- a/src/openrct2/object/FootpathItemObject.cpp +++ b/src/openrct2/object/FootpathItemObject.cpp @@ -12,7 +12,6 @@ #include "../core/IStream.hpp" #include "../core/Json.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../interface/Cursors.h" #include "../localisation/Localisation.h" #include "../object/Object.h" @@ -66,7 +65,7 @@ void FootpathItemObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); _legacyType.scenery_tab_id = OBJECT_ENTRY_INDEX_NULL; } @@ -74,7 +73,7 @@ void FootpathItemObject::Load() void FootpathItemObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/FootpathObject.cpp b/src/openrct2/object/FootpathObject.cpp index 867d686393..884feb4a83 100644 --- a/src/openrct2/object/FootpathObject.cpp +++ b/src/openrct2/object/FootpathObject.cpp @@ -12,7 +12,6 @@ #include "../core/IStream.hpp" #include "../core/Json.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Language.h" #include "../world/Footpath.h" @@ -38,7 +37,7 @@ void FootpathObject::Load() { GetStringTable().Sort(); _legacyType.string_idx = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); _legacyType.bridge_image = _legacyType.image + 109; _pathSurfaceDescriptor.Name = _legacyType.string_idx; @@ -63,7 +62,7 @@ void FootpathObject::Load() void FootpathObject::Unload() { LanguageFreeObjectString(_legacyType.string_idx); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.string_idx = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/FootpathRailingsObject.cpp b/src/openrct2/object/FootpathRailingsObject.cpp index 2a2e73f0f2..59375b488e 100644 --- a/src/openrct2/object/FootpathRailingsObject.cpp +++ b/src/openrct2/object/FootpathRailingsObject.cpp @@ -11,7 +11,6 @@ #include "../core/IStream.hpp" #include "../core/Json.hpp" -#include "../drawing/Image.h" void FootpathRailingsObject::Load() { @@ -21,7 +20,7 @@ void FootpathRailingsObject::Load() auto numImages = GetImageTable().GetCount(); if (numImages != 0) { - PreviewImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + PreviewImageId = LoadImages(); BridgeImageId = PreviewImageId + 37; RailingsImageId = PreviewImageId + 1; } @@ -39,7 +38,7 @@ void FootpathRailingsObject::Load() void FootpathRailingsObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(PreviewImageId, GetImageTable().GetCount()); + UnloadImages(); NameStringId = 0; PreviewImageId = 0; diff --git a/src/openrct2/object/FootpathSurfaceObject.cpp b/src/openrct2/object/FootpathSurfaceObject.cpp index e79b868e63..71a33dc82b 100644 --- a/src/openrct2/object/FootpathSurfaceObject.cpp +++ b/src/openrct2/object/FootpathSurfaceObject.cpp @@ -23,7 +23,7 @@ void FootpathSurfaceObject::Load() auto numImages = GetImageTable().GetCount(); if (numImages != 0) { - PreviewImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + PreviewImageId = LoadImages(); BaseImageId = PreviewImageId + 1; } @@ -36,7 +36,7 @@ void FootpathSurfaceObject::Load() void FootpathSurfaceObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(PreviewImageId, GetImageTable().GetCount()); + UnloadImages(); NameStringId = 0; PreviewImageId = 0; diff --git a/src/openrct2/object/LargeSceneryObject.cpp b/src/openrct2/object/LargeSceneryObject.cpp index 2ce9860066..7c95dcbea2 100644 --- a/src/openrct2/object/LargeSceneryObject.cpp +++ b/src/openrct2/object/LargeSceneryObject.cpp @@ -15,7 +15,6 @@ #include "../core/Json.hpp" #include "../core/Memory.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../interface/Cursors.h" #include "../localisation/Language.h" #include "../world/Banner.h" @@ -114,7 +113,7 @@ void LargeSceneryObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _baseImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _baseImageId = LoadImages(); _legacyType.image = _baseImageId; _legacyType.tiles = _tiles.data(); @@ -137,7 +136,7 @@ void LargeSceneryObject::Load() void LargeSceneryObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_baseImageId, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _baseImageId = _legacyType.image = 0; diff --git a/src/openrct2/object/MusicObject.cpp b/src/openrct2/object/MusicObject.cpp index 912617f140..9ebad92248 100644 --- a/src/openrct2/object/MusicObject.cpp +++ b/src/openrct2/object/MusicObject.cpp @@ -74,13 +74,13 @@ void MusicObject::Load() } _hasPreview = !!GetImageTable().GetCount(); - _previewImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _previewImageId = LoadImages(); } void MusicObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(_previewImageId, GetImageTable().GetCount()); + UnloadImages(); _hasPreview = false; _previewImageId = 0; diff --git a/src/openrct2/object/Object.cpp b/src/openrct2/object/Object.cpp index 3dc6a3cf7f..8a6c4cb619 100644 --- a/src/openrct2/object/Object.cpp +++ b/src/openrct2/object/Object.cpp @@ -15,6 +15,7 @@ #include "../core/Memory.hpp" #include "../core/String.hpp" #include "../core/ZipStream.hpp" +#include "../drawing/Image.h" #include "../localisation/Language.h" #include "../localisation/LocalisationService.h" #include "../localisation/StringIds.h" @@ -182,6 +183,23 @@ std::string Object::GetName(int32_t language) const return GetString(language, ObjectStringID::NAME); } +ImageIndex Object::LoadImages() +{ + if (_baseImageId == ImageIndexUndefined) + { + _baseImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + } + return _baseImageId; +} + +void Object::UnloadImages() +{ + if (_baseImageId != ImageIndexUndefined) + { + GfxObjectFreeImages(_baseImageId, GetImageTable().GetCount()); + } +} + void RCTObjectEntry::SetName(std::string_view value) { std::memset(name, ' ', sizeof(name)); diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index f0224b3287..71bda63dc3 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -196,6 +196,7 @@ private: ObjectGeneration _generation{}; bool _usesFallbackImages{}; bool _isCompatibilityObject{}; + ImageIndex _baseImageId{ ImageIndexUndefined }; protected: StringTable& GetStringTable() @@ -326,6 +327,14 @@ public: { return GetImageTable().GetCount(); } + + ImageIndex GetBaseImageId() const + { + return _baseImageId; + } + + uint32_t LoadImages(); + void UnloadImages(); }; #ifdef __WARN_SUGGEST_FINAL_TYPES__ # pragma GCC diagnostic pop diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index dba77dfd5b..12fd88b6ff 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -19,7 +19,6 @@ #include "../core/Memory.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../entity/Yaw.hpp" #include "../localisation/Language.h" #include "../rct2/DATLimits.h" @@ -257,7 +256,7 @@ void RideObject::Load() _legacyType.naming.Name = LanguageAllocateObjectString(GetName()); _legacyType.naming.Description = LanguageAllocateObjectString(GetDescription()); _legacyType.capacity = LanguageAllocateObjectString(GetCapacity()); - _legacyType.images_offset = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.images_offset = LoadImages(); _legacyType.vehicle_preset_list = &_presetColours; int32_t currentCarImagesOffset = _legacyType.images_offset + RCT2::ObjectLimits::MaxRideTypesPerRideEntry; @@ -326,7 +325,7 @@ void RideObject::Unload() LanguageFreeObjectString(_legacyType.naming.Name); LanguageFreeObjectString(_legacyType.naming.Description); LanguageFreeObjectString(_legacyType.capacity); - GfxObjectFreeImages(_legacyType.images_offset, GetImageTable().GetCount()); + UnloadImages(); _legacyType.naming.Name = 0; _legacyType.naming.Description = 0; diff --git a/src/openrct2/object/SceneryGroupObject.cpp b/src/openrct2/object/SceneryGroupObject.cpp index 68534b9555..7a6d32ca66 100644 --- a/src/openrct2/object/SceneryGroupObject.cpp +++ b/src/openrct2/object/SceneryGroupObject.cpp @@ -17,7 +17,6 @@ #include "../core/Memory.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../entity/Staff.h" #include "../localisation/Language.h" #include "../world/Scenery.h" @@ -58,14 +57,14 @@ void SceneryGroupObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); _legacyType.SceneryEntries.clear(); } void SceneryGroupObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/SmallSceneryObject.cpp b/src/openrct2/object/SmallSceneryObject.cpp index 89aa444c29..26e79d59f5 100644 --- a/src/openrct2/object/SmallSceneryObject.cpp +++ b/src/openrct2/object/SmallSceneryObject.cpp @@ -16,7 +16,6 @@ #include "../core/Memory.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../interface/Cursors.h" #include "../localisation/Language.h" #include "../world/Scenery.h" @@ -74,7 +73,7 @@ void SmallSceneryObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); _legacyType.scenery_tab_id = OBJECT_ENTRY_INDEX_NULL; @@ -89,7 +88,7 @@ void SmallSceneryObject::Load() void SmallSceneryObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/StationObject.cpp b/src/openrct2/object/StationObject.cpp index 7896669248..32037b2b86 100644 --- a/src/openrct2/object/StationObject.cpp +++ b/src/openrct2/object/StationObject.cpp @@ -13,7 +13,6 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Localisation.h" #include "../world/Banner.h" @@ -25,7 +24,7 @@ void StationObject::Load() auto numImages = GetImageTable().GetCount(); if (numImages != 0) { - BaseImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + BaseImageId = LoadImages(); uint32_t shelterOffset = (Flags & STATION_OBJECT_FLAGS::IS_TRANSPARENT) ? 32 : 16; if (numImages > shelterOffset) @@ -38,7 +37,7 @@ void StationObject::Load() void StationObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(BaseImageId, GetImageTable().GetCount()); + UnloadImages(); NameStringId = 0; BaseImageId = ImageIndexUndefined; diff --git a/src/openrct2/object/TerrainEdgeObject.cpp b/src/openrct2/object/TerrainEdgeObject.cpp index b08096a45f..c251379a39 100644 --- a/src/openrct2/object/TerrainEdgeObject.cpp +++ b/src/openrct2/object/TerrainEdgeObject.cpp @@ -14,7 +14,6 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Localisation.h" #include "ObjectManager.h" @@ -22,7 +21,7 @@ void TerrainEdgeObject::Load() { GetStringTable().Sort(); NameStringId = LanguageAllocateObjectString(GetName()); - IconImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + IconImageId = LoadImages(); // First image is icon followed by edge images BaseImageId = IconImageId + 1; @@ -31,7 +30,7 @@ void TerrainEdgeObject::Load() void TerrainEdgeObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(IconImageId, GetImageTable().GetCount()); + UnloadImages(); NameStringId = 0; IconImageId = 0; diff --git a/src/openrct2/object/TerrainSurfaceObject.cpp b/src/openrct2/object/TerrainSurfaceObject.cpp index 7fe2381567..545a71ab81 100644 --- a/src/openrct2/object/TerrainSurfaceObject.cpp +++ b/src/openrct2/object/TerrainSurfaceObject.cpp @@ -16,7 +16,6 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../localisation/Localisation.h" #include "../world/Location.hpp" #include "ObjectManager.h" @@ -25,7 +24,7 @@ void TerrainSurfaceObject::Load() { GetStringTable().Sort(); NameStringId = LanguageAllocateObjectString(GetName()); - IconImageId = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + IconImageId = LoadImages(); if ((Flags & SMOOTH_WITH_SELF) || (Flags & SMOOTH_WITH_OTHER)) { PatternBaseImageId = IconImageId + 1; @@ -41,7 +40,7 @@ void TerrainSurfaceObject::Load() void TerrainSurfaceObject::Unload() { LanguageFreeObjectString(NameStringId); - GfxObjectFreeImages(IconImageId, GetImageTable().GetCount()); + UnloadImages(); NameStringId = 0; IconImageId = 0; diff --git a/src/openrct2/object/WallObject.cpp b/src/openrct2/object/WallObject.cpp index 8e82aa7dc0..a180dd45a2 100644 --- a/src/openrct2/object/WallObject.cpp +++ b/src/openrct2/object/WallObject.cpp @@ -13,7 +13,6 @@ #include "../core/Json.hpp" #include "../core/String.hpp" #include "../drawing/Drawing.h" -#include "../drawing/Image.h" #include "../interface/Cursors.h" #include "../localisation/Language.h" #include "../world/Banner.h" @@ -56,13 +55,13 @@ void WallObject::Load() { GetStringTable().Sort(); _legacyType.name = LanguageAllocateObjectString(GetName()); - _legacyType.image = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image = LoadImages(); } void WallObject::Unload() { LanguageFreeObjectString(_legacyType.name); - GfxObjectFreeImages(_legacyType.image, GetImageTable().GetCount()); + UnloadImages(); _legacyType.name = 0; _legacyType.image = 0; diff --git a/src/openrct2/object/WaterObject.cpp b/src/openrct2/object/WaterObject.cpp index ded14e80c5..98f3b81788 100644 --- a/src/openrct2/object/WaterObject.cpp +++ b/src/openrct2/object/WaterObject.cpp @@ -15,7 +15,6 @@ #include "../common.h" #include "../core/IStream.hpp" #include "../core/Json.hpp" -#include "../drawing/Image.h" #include "../localisation/Formatter.h" #include "../localisation/Language.h" #include "../localisation/StringIds.h" @@ -38,7 +37,7 @@ void WaterObject::Load() { GetStringTable().Sort(); _legacyType.string_idx = LanguageAllocateObjectString(GetName()); - _legacyType.image_id = GfxObjectAllocateImages(GetImageTable().GetImages(), GetImageTable().GetCount()); + _legacyType.image_id = LoadImages(); _legacyType.palette_index_1 = _legacyType.image_id + 1; _legacyType.palette_index_2 = _legacyType.image_id + 4; @@ -47,7 +46,7 @@ void WaterObject::Load() void WaterObject::Unload() { - GfxObjectFreeImages(_legacyType.image_id, GetImageTable().GetCount()); + UnloadImages(); LanguageFreeObjectString(_legacyType.string_idx); _legacyType.string_idx = 0; diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index eb211adf93..ca3b24bed2 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -47,7 +47,7 @@ namespace OpenRCT2 namespace OpenRCT2::Scripting { - static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 72; + static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 73; // Versions marking breaking changes. static constexpr int32_t API_VERSION_33_PEEP_DEPRECATION = 33; diff --git a/src/openrct2/scripting/bindings/object/ScObject.hpp b/src/openrct2/scripting/bindings/object/ScObject.hpp index fdfbb991de..9a51f7c2e5 100644 --- a/src/openrct2/scripting/bindings/object/ScObject.hpp +++ b/src/openrct2/scripting/bindings/object/ScObject.hpp @@ -44,6 +44,8 @@ namespace OpenRCT2::Scripting dukglue_register_property(ctx, &ScObject::identifier_get, nullptr, "identifier"); dukglue_register_property(ctx, &ScObject::legacyIdentifier_get, nullptr, "legacyIdentifier"); dukglue_register_property(ctx, &ScObject::name_get, nullptr, "name"); + dukglue_register_property(ctx, &ScObject::baseImageId_get, nullptr, "baseImageId"); + dukglue_register_property(ctx, &ScObject::numImages_get, nullptr, "numImages"); } static std::optional StringToObjectType(std::string_view type) @@ -126,6 +128,26 @@ namespace OpenRCT2::Scripting return {}; } + uint32_t baseImageId_get() const + { + auto obj = GetObject(); + if (obj != nullptr) + { + return obj->GetBaseImageId(); + } + return 0; + } + + uint32_t numImages_get() const + { + auto obj = GetObject(); + if (obj != nullptr) + { + return obj->GetNumImages(); + } + return 0; + } + protected: Object* GetObject() const {