Handle legacy objects correctly

This commit is contained in:
Ted John 2023-04-30 14:42:22 +01:00
parent 069a2b3192
commit cbd4c78cf6
5 changed files with 47 additions and 6 deletions

View File

@ -98,6 +98,29 @@ std::string ObjectEntryDescriptor::ToString() const
}
}
static uint32_t ParseHex(std::string_view x)
{
assert(x.size() != 8);
char buffer[9];
std::memcpy(buffer, x.data(), 8);
buffer[8] = 0;
char* endp{};
return static_cast<uint32_t>(std::strtol(buffer, &endp, 16));
}
ObjectEntryDescriptor ObjectEntryDescriptor::Parse(std::string_view identifier)
{
if (identifier.size() == 26 && identifier[8] == '|' && identifier[17] == '|')
{
RCTObjectEntry entry{};
entry.flags = ParseHex(identifier.substr(0, 8));
entry.SetName(identifier.substr(9, 8));
entry.checksum = ParseHex(identifier.substr(18));
return ObjectEntryDescriptor(entry);
}
return ObjectEntryDescriptor(identifier);
}
bool ObjectEntryDescriptor::operator==(const ObjectEntryDescriptor& rhs) const
{
if (Generation != rhs.Generation)

View File

@ -143,6 +143,8 @@ struct ObjectEntryDescriptor
bool operator==(const ObjectEntryDescriptor& rhs) const;
bool operator!=(const ObjectEntryDescriptor& rhs) const;
static ObjectEntryDescriptor Parse(std::string_view identifier);
};
struct IObjectRepository;

View File

@ -133,7 +133,14 @@ namespace OpenRCT2::Scripting
auto installedObject = GetInstalledObject();
if (installedObject != nullptr)
{
return installedObject->Identifier;
if (installedObject->Generation == ObjectGeneration::DAT)
{
return ObjectEntryDescriptor(installedObject->ObjectEntry).ToString();
}
else
{
return installedObject->Identifier;
}
}
return {};
}

View File

@ -71,7 +71,7 @@ namespace OpenRCT2::Scripting
if (obj != nullptr)
{
auto& objectRepository = GetContext()->GetObjectRepository();
auto installedObject = objectRepository.FindObject(obj->GetIdentifier());
auto installedObject = objectRepository.FindObject(obj->GetDescriptor());
if (installedObject != nullptr)
{
return std::make_shared<ScInstalledObject>(installedObject->Id);

View File

@ -1,3 +1,12 @@
/*****************************************************************************
* Copyright (c) 2014-2023 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.
*****************************************************************************/
#include "ScObjectManager.h"
#include "../../../object/ObjectList.h"
@ -51,7 +60,7 @@ DukValue ScObjectManager::load(const DukValue& p1, const DukValue& p2)
throw DukException() << "Expected string for 'identifier'.";
const auto& identifier = item.as_string();
descriptors.emplace_back(identifier);
descriptors.push_back(ObjectEntryDescriptor::Parse(identifier));
}
duk_push_array(ctx);
@ -84,7 +93,7 @@ DukValue ScObjectManager::load(const DukValue& p1, const DukValue& p2)
throw DukException() << "Expected string for 'identifier'.";
const auto& identifier = p1.as_string();
ObjectEntryDescriptor descriptor(identifier);
auto descriptor = ObjectEntryDescriptor::Parse(identifier);
auto installedObject = objectRepository.FindObject(descriptor);
if (installedObject != nullptr)
@ -154,7 +163,7 @@ void ScObjectManager::unload(const DukValue& p1, const DukValue& p2)
else
{
// unload(identifier)
objectManager.UnloadObjects({ ObjectEntryDescriptor(szP1) });
objectManager.UnloadObjects({ ObjectEntryDescriptor::Parse(szP1) });
}
}
else if (p1.is_array())
@ -166,7 +175,7 @@ void ScObjectManager::unload(const DukValue& p1, const DukValue& p2)
{
if (identifier.type() == DukValue::STRING)
{
descriptors.emplace_back(identifier.as_string());
descriptors.push_back(ObjectEntryDescriptor::Parse(identifier.as_string()));
}
}
objectManager.UnloadObjects(descriptors);