mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #7432 from IntelOrca/refactor/use-shared-ptr-2
Use shared_ptr for long-life objects (part 2)
This commit is contained in:
commit
00278c6ca6
|
@ -89,17 +89,17 @@ namespace OpenRCT2
|
|||
|
||||
// Services
|
||||
std::shared_ptr<LocalisationService> _localisationService;
|
||||
IObjectRepository * _objectRepository = nullptr;
|
||||
IObjectManager * _objectManager = nullptr;
|
||||
ITrackDesignRepository * _trackDesignRepository = nullptr;
|
||||
IScenarioRepository * _scenarioRepository = nullptr;
|
||||
std::shared_ptr<IObjectRepository> _objectRepository;
|
||||
std::shared_ptr<IObjectManager> _objectManager;
|
||||
std::unique_ptr<ITrackDesignRepository> _trackDesignRepository;
|
||||
std::unique_ptr<IScenarioRepository> _scenarioRepository;
|
||||
#ifdef __ENABLE_DISCORD__
|
||||
std::unique_ptr<DiscordService> _discordService;
|
||||
#endif
|
||||
StdInOutConsole _stdInOutConsole;
|
||||
|
||||
// Game states
|
||||
TitleScreen * _titleScreen = nullptr;
|
||||
std::unique_ptr<TitleScreen> _titleScreen;
|
||||
|
||||
bool _initialised = false;
|
||||
bool _isWindowMinimised = false;
|
||||
|
@ -143,13 +143,6 @@ namespace OpenRCT2
|
|||
EVP_MD_CTX_destroy(gHashCTX);
|
||||
#endif // DISABLE_NETWORK
|
||||
|
||||
delete _titleScreen;
|
||||
|
||||
delete _scenarioRepository;
|
||||
delete _trackDesignRepository;
|
||||
delete _objectManager;
|
||||
delete _objectRepository;
|
||||
|
||||
Instance = nullptr;
|
||||
}
|
||||
|
||||
|
@ -173,24 +166,24 @@ namespace OpenRCT2
|
|||
return *_localisationService;
|
||||
}
|
||||
|
||||
IObjectManager * GetObjectManager() override
|
||||
std::shared_ptr<IObjectManager> GetObjectManager() override
|
||||
{
|
||||
return _objectManager;
|
||||
}
|
||||
|
||||
IObjectRepository * GetObjectRepository() override
|
||||
std::shared_ptr<IObjectRepository> GetObjectRepository() override
|
||||
{
|
||||
return _objectRepository;
|
||||
}
|
||||
|
||||
ITrackDesignRepository * GetTrackDesignRepository() override
|
||||
{
|
||||
return _trackDesignRepository;
|
||||
return _trackDesignRepository.get();
|
||||
}
|
||||
|
||||
IScenarioRepository * GetScenarioRepository() override
|
||||
{
|
||||
return _scenarioRepository;
|
||||
return _scenarioRepository.get();
|
||||
}
|
||||
|
||||
sint32 RunOpenRCT2(int argc, const char * * argv) override
|
||||
|
@ -346,8 +339,8 @@ namespace OpenRCT2
|
|||
_env->SetBasePath(DIRBASE::RCT2, rct2InstallPath);
|
||||
}
|
||||
|
||||
_objectRepository = CreateObjectRepository(_env);
|
||||
_objectManager = CreateObjectManager(_objectRepository);
|
||||
_objectRepository = std::shared_ptr<IObjectRepository>(CreateObjectRepository(_env));
|
||||
_objectManager = std::shared_ptr<IObjectManager>(CreateObjectManager(_objectRepository));
|
||||
_trackDesignRepository = CreateTrackDesignRepository(_env);
|
||||
_scenarioRepository = CreateScenarioRepository(_env);
|
||||
#ifdef __ENABLE_DISCORD__
|
||||
|
@ -432,7 +425,7 @@ namespace OpenRCT2
|
|||
viewport_init_all();
|
||||
game_init_all(150);
|
||||
|
||||
_titleScreen = new TitleScreen();
|
||||
_titleScreen = std::make_unique<TitleScreen>();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -462,12 +455,12 @@ namespace OpenRCT2
|
|||
if (info.Version <= FILE_TYPE_S4_CUTOFF)
|
||||
{
|
||||
// Save is an S4 (RCT1 format)
|
||||
parkImporter.reset(ParkImporter::CreateS4());
|
||||
parkImporter = ParkImporter::CreateS4();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Save is an S6 (RCT2 format)
|
||||
parkImporter.reset(ParkImporter::CreateS6(_objectRepository, _objectManager));
|
||||
parkImporter = ParkImporter::CreateS6(_objectRepository, _objectManager);
|
||||
}
|
||||
|
||||
try
|
||||
|
|
|
@ -98,8 +98,8 @@ namespace OpenRCT2
|
|||
virtual std::shared_ptr<Ui::IUiContext> GetUiContext() abstract;
|
||||
virtual std::shared_ptr<IPlatformEnvironment> GetPlatformEnvironment() abstract;
|
||||
virtual Localisation::LocalisationService& GetLocalisationService() abstract;
|
||||
virtual IObjectManager * GetObjectManager() abstract;
|
||||
virtual IObjectRepository * GetObjectRepository() abstract;
|
||||
virtual std::shared_ptr<IObjectManager> GetObjectManager() abstract;
|
||||
virtual std::shared_ptr<IObjectRepository> GetObjectRepository() abstract;
|
||||
virtual ITrackDesignRepository * GetTrackDesignRepository() abstract;
|
||||
virtual IScenarioRepository * GetScenarioRepository() abstract;
|
||||
|
||||
|
|
|
@ -99,9 +99,9 @@ ParkLoadResult * ParkLoadResult_CreateInvalidExtension()
|
|||
|
||||
namespace ParkImporter
|
||||
{
|
||||
IParkImporter * Create(const std::string &hintPath)
|
||||
std::unique_ptr<IParkImporter> Create(const std::string &hintPath)
|
||||
{
|
||||
IParkImporter * parkImporter = nullptr;
|
||||
std::unique_ptr<IParkImporter> parkImporter;
|
||||
std::string extension = Path::GetExtension(hintPath);
|
||||
if (ExtensionIsRCT1(extension))
|
||||
{
|
||||
|
|
|
@ -29,6 +29,7 @@ enum PARK_LOAD_ERROR
|
|||
PARK_LOAD_ERROR_UNKNOWN = 255
|
||||
};
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "core/String.hpp"
|
||||
|
@ -79,9 +80,9 @@ public:
|
|||
|
||||
namespace ParkImporter
|
||||
{
|
||||
IParkImporter * Create(const std::string &hintPath);
|
||||
IParkImporter * CreateS4();
|
||||
IParkImporter * CreateS6(IObjectRepository * objectRepository, IObjectManager * objectManager);
|
||||
std::unique_ptr<IParkImporter> Create(const std::string &hintPath);
|
||||
std::unique_ptr<IParkImporter> CreateS4();
|
||||
std::unique_ptr<IParkImporter> CreateS6(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager);
|
||||
|
||||
bool ExtensionIsRCT1(const std::string &extension);
|
||||
bool ExtensionIsScenario(const std::string &extension);
|
||||
|
|
|
@ -105,7 +105,7 @@ exitcode_t CommandLine::HandleCommandConvert(CommandLineArgEnumerator * enumerat
|
|||
|
||||
try
|
||||
{
|
||||
auto importer = std::unique_ptr<IParkImporter>(ParkImporter::Create(sourcePath));
|
||||
auto importer = ParkImporter::Create(sourcePath);
|
||||
importer->Load(sourcePath);
|
||||
importer->Import();
|
||||
}
|
||||
|
|
|
@ -1107,7 +1107,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection)
|
|||
// This will send all custom objects to connected clients
|
||||
// TODO: fix it so custom objects negotiation is performed even in this case.
|
||||
auto context = GetContext();
|
||||
IObjectManager * objManager = context->GetObjectManager();
|
||||
auto objManager = context->GetObjectManager();
|
||||
objects = objManager->GetPackableObjects();
|
||||
}
|
||||
|
||||
|
@ -1794,7 +1794,7 @@ void Network::Server_Client_Joined(const char* name, const std::string &keyhash,
|
|||
chat_history_add(text);
|
||||
|
||||
auto context = GetContext();
|
||||
IObjectManager * objManager = context->GetObjectManager();
|
||||
auto objManager = context->GetObjectManager();
|
||||
auto objects = objManager->GetPackableObjects();
|
||||
Server_Send_OBJECTS(connection, objects);
|
||||
|
||||
|
@ -1815,7 +1815,7 @@ void Network::Server_Handle_TOKEN(NetworkConnection& connection, NetworkPacket&
|
|||
|
||||
void Network::Client_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
auto repo = GetContext()->GetObjectRepository();
|
||||
uint32 size;
|
||||
packet >> size;
|
||||
log_verbose("client received object list, it has %u entries", size);
|
||||
|
@ -1868,7 +1868,7 @@ void Network::Server_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket
|
|||
return;
|
||||
}
|
||||
log_verbose("Client requested %u objects", size);
|
||||
IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
auto repo = GetContext()->GetObjectRepository();
|
||||
for (uint32 i = 0; i < size; i++)
|
||||
{
|
||||
const char * name = (const char *)packet.Read(8);
|
||||
|
@ -2059,8 +2059,7 @@ bool Network::LoadMap(IStream * stream)
|
|||
try
|
||||
{
|
||||
auto context = GetContext();
|
||||
auto importer = std::unique_ptr<IParkImporter>(
|
||||
ParkImporter::CreateS6(GetContext()->GetObjectRepository(), context->GetObjectManager()));
|
||||
auto importer = ParkImporter::CreateS6(context->GetObjectRepository(), context->GetObjectManager());
|
||||
importer->LoadFromStream(stream, false);
|
||||
importer->Import();
|
||||
|
||||
|
|
|
@ -36,19 +36,19 @@
|
|||
class ObjectManager final : public IObjectManager
|
||||
{
|
||||
private:
|
||||
IObjectRepository * _objectRepository;
|
||||
std::vector<Object *> _loadedObjects;
|
||||
std::shared_ptr<IObjectRepository> _objectRepository;
|
||||
std::vector<Object *> _loadedObjects;
|
||||
|
||||
public:
|
||||
explicit ObjectManager(IObjectRepository * objectRepository)
|
||||
explicit ObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
|
||||
: _objectRepository(objectRepository)
|
||||
{
|
||||
Guard::ArgumentNotNull(objectRepository);
|
||||
|
||||
_objectRepository = objectRepository;
|
||||
_loadedObjects.resize(OBJECT_ENTRY_COUNT);
|
||||
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
~ObjectManager() override
|
||||
|
@ -134,7 +134,7 @@ public:
|
|||
}
|
||||
_loadedObjects[slot] = loadedObject;
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ public:
|
|||
{
|
||||
SetNewLoadedObjectList(std::get<1>(loadedObjects));
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size());
|
||||
return true;
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ public:
|
|||
if (numObjectsUnloaded > 0)
|
||||
{
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,7 +207,7 @@ public:
|
|||
UnloadObject(object);
|
||||
}
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
void ResetObjects() override
|
||||
|
@ -221,7 +221,7 @@ public:
|
|||
}
|
||||
}
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
std::vector<const ObjectRepositoryItem *> GetPackableObjects() override
|
||||
|
@ -546,6 +546,11 @@ private:
|
|||
return loadedObject;
|
||||
}
|
||||
|
||||
void ResetTypeToRideEntryIndexMap()
|
||||
{
|
||||
reset_type_to_ride_entry_index_map(*this);
|
||||
}
|
||||
|
||||
static void ReportMissingObject(const rct_object_entry * entry)
|
||||
{
|
||||
utf8 objName[DAT_NAME_LENGTH + 1] = { 0 };
|
||||
|
@ -572,28 +577,28 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
IObjectManager * CreateObjectManager(IObjectRepository * objectRepository)
|
||||
std::unique_ptr<IObjectManager> CreateObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
|
||||
{
|
||||
return new ObjectManager(objectRepository);
|
||||
return std::make_unique<ObjectManager>(objectRepository);
|
||||
}
|
||||
|
||||
void * object_manager_get_loaded_object_by_index(size_t index)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
Object * loadedObject = objectManager->GetLoadedObject(index);
|
||||
return (void *)loadedObject;
|
||||
}
|
||||
|
||||
void * object_manager_get_loaded_object(const rct_object_entry * entry)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
Object * loadedObject = objectManager->GetLoadedObject(entry);
|
||||
return (void *)loadedObject;
|
||||
}
|
||||
|
||||
uint8 object_manager_get_loaded_object_entry_index(const void * loadedObject)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
const Object * object = static_cast<const Object *>(loadedObject);
|
||||
uint8 entryIndex = objectManager->GetLoadedObjectEntryIndex(object);
|
||||
return entryIndex;
|
||||
|
@ -601,20 +606,20 @@ uint8 object_manager_get_loaded_object_entry_index(const void * loadedObject)
|
|||
|
||||
void * object_manager_load_object(const rct_object_entry * entry)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
Object * loadedObject = objectManager->LoadObject(entry);
|
||||
return (void *)loadedObject;
|
||||
}
|
||||
|
||||
void object_manager_unload_objects(const rct_object_entry * entries, size_t count)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
objectManager->UnloadObjects(entries, count);
|
||||
}
|
||||
|
||||
void object_manager_unload_all_objects()
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
if (objectManager != nullptr)
|
||||
{
|
||||
objectManager->UnloadAll();
|
||||
|
|
|
@ -44,7 +44,7 @@ interface IObjectManager
|
|||
virtual std::vector<const ObjectRepositoryItem *> GetPackableObjects() abstract;
|
||||
};
|
||||
|
||||
IObjectManager * CreateObjectManager(IObjectRepository * objectRepository);
|
||||
std::unique_ptr<IObjectManager> CreateObjectManager(std::shared_ptr<IObjectRepository> objectRepository);
|
||||
|
||||
void * object_manager_get_loaded_object_by_index(size_t index);
|
||||
void * object_manager_get_loaded_object(const rct_object_entry * entry);
|
||||
|
|
|
@ -639,9 +639,9 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
IObjectRepository * CreateObjectRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
std::unique_ptr<IObjectRepository> CreateObjectRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
{
|
||||
return new ObjectRepository(env);
|
||||
return std::make_unique<ObjectRepository>(env);
|
||||
}
|
||||
|
||||
bool IsObjectCustom(const ObjectRepositoryItem * object)
|
||||
|
@ -671,14 +671,14 @@ void object_list_load()
|
|||
auto objectRepository = context->GetObjectRepository();
|
||||
objectRepository->LoadOrConstruct(localisationService.GetCurrentLanguage());
|
||||
|
||||
IObjectManager * objectManager = context->GetObjectManager();
|
||||
auto objectManager = context->GetObjectManager();
|
||||
objectManager->UnloadAll();
|
||||
}
|
||||
|
||||
void * object_repository_load_object(const rct_object_entry * objectEntry)
|
||||
{
|
||||
Object * object = nullptr;
|
||||
IObjectRepository * objRepository = GetContext()->GetObjectRepository();
|
||||
auto objRepository = GetContext()->GetObjectRepository();
|
||||
const ObjectRepositoryItem * ori = objRepository->FindObject(objectEntry);
|
||||
if (ori != nullptr)
|
||||
{
|
||||
|
@ -710,7 +710,7 @@ void scenario_translate(scenario_index_entry * scenarioEntry, const rct_object_e
|
|||
// Checks for a scenario string object (possibly for localisation)
|
||||
if ((stexObjectEntry->flags & 0xFF) != 255)
|
||||
{
|
||||
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
|
||||
auto objectRepository = GetContext()->GetObjectRepository();
|
||||
const ObjectRepositoryItem * ori = objectRepository->FindObject(stexObjectEntry);
|
||||
if (ori != nullptr)
|
||||
{
|
||||
|
@ -733,25 +733,25 @@ void scenario_translate(scenario_index_entry * scenarioEntry, const rct_object_e
|
|||
|
||||
size_t object_repository_get_items_count()
|
||||
{
|
||||
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
|
||||
auto objectRepository = GetContext()->GetObjectRepository();
|
||||
return objectRepository->GetNumObjects();
|
||||
}
|
||||
|
||||
const ObjectRepositoryItem * object_repository_get_items()
|
||||
{
|
||||
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
|
||||
auto objectRepository = GetContext()->GetObjectRepository();
|
||||
return objectRepository->GetObjects();
|
||||
}
|
||||
|
||||
const ObjectRepositoryItem * object_repository_find_object_by_entry(const rct_object_entry * entry)
|
||||
{
|
||||
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
|
||||
auto objectRepository = GetContext()->GetObjectRepository();
|
||||
return objectRepository->FindObject(entry);
|
||||
}
|
||||
|
||||
const ObjectRepositoryItem * object_repository_find_object_by_name(const char * name)
|
||||
{
|
||||
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
|
||||
auto objectRepository = GetContext()->GetObjectRepository();
|
||||
return objectRepository->FindObject(name);
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ interface IObjectRepository
|
|||
virtual void WritePackedObjects(IStream * stream, std::vector<const ObjectRepositoryItem *> &objects) abstract;
|
||||
};
|
||||
|
||||
IObjectRepository * CreateObjectRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
std::unique_ptr<IObjectRepository> CreateObjectRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
|
||||
bool IsObjectCustom(const ObjectRepositoryItem * object);
|
||||
|
||||
|
|
|
@ -75,8 +75,8 @@ void SceneryGroupObject::DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint
|
|||
void SceneryGroupObject::UpdateEntryIndexes()
|
||||
{
|
||||
auto context = GetContext();
|
||||
IObjectRepository * objectRepository = context->GetObjectRepository();
|
||||
IObjectManager * objectManager = context->GetObjectManager();
|
||||
auto objectRepository = context->GetObjectRepository();
|
||||
auto objectManager = context->GetObjectManager();
|
||||
|
||||
_legacyType.entry_count = 0;
|
||||
for (const auto &objectEntry : _items)
|
||||
|
|
|
@ -1863,7 +1863,7 @@ private:
|
|||
|
||||
void LoadObjects(uint8 objectType, const std::vector<const char *> &entries)
|
||||
{
|
||||
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
|
||||
uint32 entryIndex = 0;
|
||||
for (const char * objectName : entries)
|
||||
|
@ -1912,7 +1912,7 @@ private:
|
|||
|
||||
void GetInvalidObjects(uint8 objectType, const std::vector<const char *> &entries, std::vector<rct_object_entry> &missingObjects)
|
||||
{
|
||||
IObjectRepository * objectRepository = OpenRCT2::GetContext()->GetObjectRepository();
|
||||
auto objectRepository = OpenRCT2::GetContext()->GetObjectRepository();
|
||||
for (const char * objectName : entries)
|
||||
{
|
||||
rct_object_entry entry;
|
||||
|
@ -2832,9 +2832,9 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
IParkImporter * ParkImporter::CreateS4()
|
||||
std::unique_ptr<IParkImporter> ParkImporter::CreateS4()
|
||||
{
|
||||
return new S4Importer();
|
||||
return std::unique_ptr<S4Importer>();
|
||||
}
|
||||
|
||||
ParkLoadResult * load_from_sv4(const utf8 * path)
|
||||
|
|
|
@ -107,7 +107,7 @@ void S6Exporter::Save(IStream * stream, bool isScenario)
|
|||
// 2: Write packed objects
|
||||
if (_s6.header.num_packed_objects > 0)
|
||||
{
|
||||
IObjectRepository * objRepo = OpenRCT2::GetContext()->GetObjectRepository();
|
||||
auto objRepo = OpenRCT2::GetContext()->GetObjectRepository();
|
||||
objRepo->WritePackedObjects(stream, ExportObjectsList);
|
||||
}
|
||||
|
||||
|
@ -783,7 +783,7 @@ sint32 scenario_save(const utf8 * path, sint32 flags)
|
|||
{
|
||||
if (flags & S6_SAVE_FLAG_EXPORT)
|
||||
{
|
||||
IObjectManager * objManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
auto objManager = OpenRCT2::GetContext()->GetObjectManager();
|
||||
s6exporter->ExportObjectsList = objManager->GetPackableObjects();
|
||||
}
|
||||
s6exporter->RemoveTracklessRides = true;
|
||||
|
|
|
@ -68,15 +68,15 @@ public:
|
|||
class S6Importer final : public IParkImporter
|
||||
{
|
||||
private:
|
||||
IObjectRepository * const _objectRepository;
|
||||
IObjectManager * const _objectManager;
|
||||
std::shared_ptr<IObjectRepository> const _objectRepository;
|
||||
std::shared_ptr<IObjectManager> const _objectManager;
|
||||
|
||||
const utf8 * _s6Path = nullptr;
|
||||
rct_s6_data _s6 { };
|
||||
uint8 _gameVersion = 0;
|
||||
|
||||
public:
|
||||
S6Importer(IObjectRepository * objectRepository, IObjectManager * objectManager)
|
||||
S6Importer(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager)
|
||||
: _objectRepository(objectRepository),
|
||||
_objectManager(objectManager)
|
||||
{
|
||||
|
@ -852,9 +852,9 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
IParkImporter * ParkImporter::CreateS6(IObjectRepository * objectRepository, IObjectManager * objectManager)
|
||||
std::unique_ptr<IParkImporter> ParkImporter::CreateS6(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager)
|
||||
{
|
||||
return new S6Importer(objectRepository, objectManager);
|
||||
return std::make_unique<S6Importer>(objectRepository, objectManager);
|
||||
}
|
||||
|
||||
ParkLoadResult * load_from_sv6(const char * path)
|
||||
|
|
|
@ -283,23 +283,27 @@ rct_ride_entry * get_ride_entry_by_ride(Ride *ride)
|
|||
*
|
||||
* rct2: 0x006DED68
|
||||
*/
|
||||
void reset_type_to_ride_entry_index_map()
|
||||
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager)
|
||||
{
|
||||
size_t stride = MAX_RIDE_OBJECTS + 1;
|
||||
uint8 * entryTypeTable = (uint8 *)malloc(RIDE_TYPE_COUNT * stride);
|
||||
memset(entryTypeTable, 0xFF, RIDE_TYPE_COUNT * stride);
|
||||
|
||||
for (uint8 i = 0; i < MAX_RIDE_OBJECTS; i++) {
|
||||
rct_ride_entry * rideEntry = get_ride_entry(i);
|
||||
if (rideEntry == nullptr) {
|
||||
continue;
|
||||
}
|
||||
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) {
|
||||
uint8 rideType = rideEntry->ride_type[j];
|
||||
if (rideType < RIDE_TYPE_COUNT) {
|
||||
uint8 * entryArray = &entryTypeTable[rideType * stride];
|
||||
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
|
||||
*nextEntry = i;
|
||||
|
||||
auto obj = objectManager.GetLoadedObject(OBJECT_TYPE_RIDE, i);
|
||||
if (obj != nullptr)
|
||||
{
|
||||
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
|
||||
{
|
||||
auto rideEntry = (rct_ride_entry *)obj->GetLegacyData();
|
||||
uint8 rideType = rideEntry->ride_type[j];
|
||||
if (rideType < RIDE_TYPE_COUNT)
|
||||
{
|
||||
uint8 * entryArray = &entryTypeTable[rideType * stride];
|
||||
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
|
||||
*nextEntry = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include "RideRatings.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
interface IObjectManager;
|
||||
|
||||
#define MAX_RIDE_TYPES_PER_RIDE_ENTRY 3
|
||||
// The max number of different types of vehicle.
|
||||
// Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway.
|
||||
|
@ -1038,7 +1040,7 @@ sint32 ride_get_unused_preset_vehicle_colour(uint8 ride_sub_type);
|
|||
void ride_set_vehicle_colours_to_random_preset(Ride *ride, uint8 preset_index);
|
||||
rct_ride_entry *get_ride_entry_by_ride(Ride *ride);
|
||||
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType);
|
||||
void reset_type_to_ride_entry_index_map();
|
||||
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager);
|
||||
void ride_measurement_clear(Ride *ride);
|
||||
void ride_measurements_update();
|
||||
rct_ride_measurement *ride_get_measurement(sint32 rideIndex, rct_string_id *message);
|
||||
|
|
|
@ -166,7 +166,7 @@ public:
|
|||
size_t GetCountForObjectEntry(uint8 rideType, const std::string &entry) const override
|
||||
{
|
||||
size_t count = 0;
|
||||
const IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
const auto repo = GetContext()->GetObjectRepository();
|
||||
|
||||
for (const auto &item : _items)
|
||||
{
|
||||
|
@ -195,7 +195,7 @@ public:
|
|||
size_t GetCountForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override
|
||||
{
|
||||
size_t count = 0;
|
||||
const IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
const auto repo = GetContext()->GetObjectRepository();
|
||||
|
||||
for (const auto &item : _items)
|
||||
{
|
||||
|
@ -227,7 +227,7 @@ public:
|
|||
std::vector<track_design_file_ref> GetItemsForObjectEntry(uint8 rideType, const std::string &entry) const override
|
||||
{
|
||||
std::vector<track_design_file_ref> refs;
|
||||
const IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
const auto repo = GetContext()->GetObjectRepository();
|
||||
|
||||
for (const auto &item : _items)
|
||||
{
|
||||
|
@ -260,7 +260,7 @@ public:
|
|||
std::vector<track_design_file_ref> GetItemsForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override
|
||||
{
|
||||
std::vector<track_design_file_ref> refs;
|
||||
const IObjectRepository * repo = GetContext()->GetObjectRepository();
|
||||
const auto repo = GetContext()->GetObjectRepository();
|
||||
|
||||
for (const auto &item : _items)
|
||||
{
|
||||
|
@ -398,9 +398,9 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
ITrackDesignRepository * CreateTrackDesignRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
std::unique_ptr<ITrackDesignRepository> CreateTrackDesignRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
{
|
||||
return new TrackDesignRepository(env);
|
||||
return std::make_unique<TrackDesignRepository>(env);
|
||||
}
|
||||
|
||||
void track_repository_scan()
|
||||
|
|
|
@ -52,7 +52,7 @@ interface ITrackDesignRepository
|
|||
virtual std::string Install(const std::string &path) abstract;
|
||||
};
|
||||
|
||||
ITrackDesignRepository * CreateTrackDesignRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
std::unique_ptr<ITrackDesignRepository> CreateTrackDesignRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
std::string GetNameFromTrackPath(const std::string &path);
|
||||
|
||||
void track_repository_scan();
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <algorithm>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "../Context.h"
|
||||
#include "../core/Console.hpp"
|
||||
#include "../core/File.h"
|
||||
#include "../core/FileIndex.hpp"
|
||||
|
@ -218,7 +219,7 @@ private:
|
|||
bool result = false;
|
||||
try
|
||||
{
|
||||
auto s4Importer = std::unique_ptr<IParkImporter>(ParkImporter::CreateS4());
|
||||
auto s4Importer = ParkImporter::CreateS4();
|
||||
s4Importer->LoadScenario(path.c_str(), true);
|
||||
if (s4Importer->GetDetails(entry))
|
||||
{
|
||||
|
@ -728,17 +729,14 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
static ScenarioRepository * _scenarioRepository;
|
||||
|
||||
IScenarioRepository * CreateScenarioRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
std::unique_ptr<IScenarioRepository> CreateScenarioRepository(const std::shared_ptr<IPlatformEnvironment>& env)
|
||||
{
|
||||
_scenarioRepository = new ScenarioRepository(env);
|
||||
return _scenarioRepository;
|
||||
return std::make_unique<ScenarioRepository>(env);
|
||||
}
|
||||
|
||||
IScenarioRepository * GetScenarioRepository()
|
||||
{
|
||||
return _scenarioRepository;
|
||||
return GetContext()->GetScenarioRepository();
|
||||
}
|
||||
|
||||
void scenario_repository_scan()
|
||||
|
|
|
@ -78,7 +78,7 @@ interface IScenarioRepository
|
|||
virtual bool TryRecordHighscore(sint32 language, const utf8 * scenarioFileName, money32 companyValue, const utf8 * name) abstract;
|
||||
};
|
||||
|
||||
IScenarioRepository * CreateScenarioRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
std::unique_ptr<IScenarioRepository> CreateScenarioRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
|
||||
IScenarioRepository * GetScenarioRepository();
|
||||
|
||||
void scenario_repository_scan();
|
||||
|
|
|
@ -416,7 +416,7 @@ private:
|
|||
}
|
||||
else
|
||||
{
|
||||
auto parkImporter = std::unique_ptr<IParkImporter>(ParkImporter::Create(path));
|
||||
auto parkImporter = ParkImporter::Create(path);
|
||||
parkImporter->Load(path);
|
||||
parkImporter->Import();
|
||||
}
|
||||
|
@ -451,7 +451,7 @@ private:
|
|||
{
|
||||
std::string extension = Path::GetExtension(hintPath);
|
||||
bool isScenario = ParkImporter::ExtensionIsScenario(hintPath);
|
||||
auto parkImporter = std::unique_ptr<IParkImporter>(ParkImporter::Create(hintPath));
|
||||
auto parkImporter = ParkImporter::Create(hintPath);
|
||||
parkImporter->LoadFromStream(stream, isScenario);
|
||||
parkImporter->Import();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue