1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-04 13:42:55 +01:00

Expose obj image offset and num images to plugins (#17567)

Co-authored-by: Duncan <duncans_pumpkin@hotmail.co.uk>
This commit is contained in:
Nikolas Parshook
2023-04-13 15:09:15 -04:00
committed by GitHub
parent d0c7d0f6fb
commit ef35dfa40a
22 changed files with 106 additions and 52 deletions

View File

@@ -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

View File

@@ -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.
*/

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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));

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<ObjectType> 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
{