Close #12428: Refactor OBJECT_SOURCE_GAME to use strong enum

This commit is contained in:
Haven Kim 2020-10-17 13:27:02 -07:00 committed by GitHub
parent a9316869fc
commit 8a4df108ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 71 additions and 71 deletions

View File

@ -1433,24 +1433,24 @@ static bool filter_string(const ObjectRepositoryItem* item)
return inName || inRideType || inPath; return inName || inRideType || inPath;
} }
static bool sources_match(uint8_t source) static bool sources_match(ObjectSourceGame source)
{ {
// clang-format off // clang-format off
return (_FILTER_RCT1 && source == OBJECT_SOURCE_RCT1) || return (_FILTER_RCT1 && source == ObjectSourceGame::RCT1) ||
(_FILTER_AA && source == OBJECT_SOURCE_ADDED_ATTRACTIONS) || (_FILTER_AA && source == ObjectSourceGame::AddedAttractions) ||
(_FILTER_LL && source == OBJECT_SOURCE_LOOPY_LANDSCAPES) || (_FILTER_LL && source == ObjectSourceGame::LoopyLandscapes) ||
(_FILTER_RCT2 && source == OBJECT_SOURCE_RCT2) || (_FILTER_RCT2 && source == ObjectSourceGame::RCT2) ||
(_FILTER_WW && source == OBJECT_SOURCE_WACKY_WORLDS) || (_FILTER_WW && source == ObjectSourceGame::WackyWorlds) ||
(_FILTER_TT && source == OBJECT_SOURCE_TIME_TWISTER) || (_FILTER_TT && source == ObjectSourceGame::TimeTwister) ||
(_FILTER_OO && source == OBJECT_SOURCE_OPENRCT2_OFFICIAL) || (_FILTER_OO && source == ObjectSourceGame::OpenRCT2Official) ||
(_FILTER_CUSTOM && (_FILTER_CUSTOM &&
source != OBJECT_SOURCE_RCT1 && source != ObjectSourceGame::RCT1 &&
source != OBJECT_SOURCE_ADDED_ATTRACTIONS && source != ObjectSourceGame::AddedAttractions &&
source != OBJECT_SOURCE_LOOPY_LANDSCAPES && source != ObjectSourceGame::LoopyLandscapes &&
source != OBJECT_SOURCE_RCT2 && source != ObjectSourceGame::RCT2 &&
source != OBJECT_SOURCE_WACKY_WORLDS && source != ObjectSourceGame::WackyWorlds &&
source != OBJECT_SOURCE_TIME_TWISTER && source != ObjectSourceGame::TimeTwister &&
source != OBJECT_SOURCE_OPENRCT2_OFFICIAL); source != ObjectSourceGame::OpenRCT2Official);
// clang-format on // clang-format on
} }

View File

@ -48,8 +48,8 @@ void BannerObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStream* st
if (item != nullptr) if (item != nullptr)
{ {
auto sourceGame = item->GetFirstSourceGame(); auto sourceGame = item->GetFirstSourceGame();
if (sourceGame == OBJECT_SOURCE_WACKY_WORLDS || sourceGame == OBJECT_SOURCE_TIME_TWISTER if (sourceGame == ObjectSourceGame::WackyWorlds || sourceGame == ObjectSourceGame::TimeTwister
|| sourceGame == OBJECT_SOURCE_CUSTOM) || sourceGame == ObjectSourceGame::Custom)
{ {
auto scgPathX = Object::GetScgPathXHeader(); auto scgPathX = Object::GetScgPathXHeader();
SetPrimarySceneryGroup(&scgPathX); SetPrimarySceneryGroup(&scgPathX);

View File

@ -52,8 +52,8 @@ void FootpathItemObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStre
if (item != nullptr) if (item != nullptr)
{ {
auto sourceGame = item->GetFirstSourceGame(); auto sourceGame = item->GetFirstSourceGame();
if (sourceGame == OBJECT_SOURCE_WACKY_WORLDS || sourceGame == OBJECT_SOURCE_TIME_TWISTER if (sourceGame == ObjectSourceGame::WackyWorlds || sourceGame == ObjectSourceGame::TimeTwister
|| sourceGame == OBJECT_SOURCE_CUSTOM) || sourceGame == ObjectSourceGame::Custom)
{ {
auto scgPathX = Object::GetScgPathXHeader(); auto scgPathX = Object::GetScgPathXHeader();
SetPrimarySceneryGroup(&scgPathX); SetPrimarySceneryGroup(&scgPathX);

View File

@ -100,12 +100,12 @@ rct_object_entry Object::CreateHeader(const char name[DAT_NAME_LENGTH + 1], uint
return header; return header;
} }
std::vector<uint8_t> Object::GetSourceGames() std::vector<ObjectSourceGame> Object::GetSourceGames()
{ {
return _sourceGames; return _sourceGames;
} }
void Object::SetSourceGames(const std::vector<uint8_t>& sourceGames) void Object::SetSourceGames(const std::vector<ObjectSourceGame>& sourceGames)
{ {
_sourceGames = sourceGames; _sourceGames = sourceGames;
} }

View File

@ -59,16 +59,16 @@ enum OBJECT_SELECTION_FLAGS
#define OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED 0 #define OBJECT_SELECTION_NOT_SELECTED_OR_REQUIRED 0
enum OBJECT_SOURCE_GAME enum class ObjectSourceGame : uint8_t
{ {
OBJECT_SOURCE_CUSTOM, Custom,
OBJECT_SOURCE_WACKY_WORLDS, WackyWorlds,
OBJECT_SOURCE_TIME_TWISTER, TimeTwister,
OBJECT_SOURCE_OPENRCT2_OFFICIAL, OpenRCT2Official,
OBJECT_SOURCE_RCT1, RCT1,
OBJECT_SOURCE_ADDED_ATTRACTIONS, AddedAttractions,
OBJECT_SOURCE_LOOPY_LANDSCAPES, LoopyLandscapes,
OBJECT_SOURCE_RCT2 = 8 RCT2 = 8
}; };
#pragma pack(push, 1) #pragma pack(push, 1)
@ -179,7 +179,7 @@ private:
rct_object_entry _objectEntry{}; rct_object_entry _objectEntry{};
StringTable _stringTable; StringTable _stringTable;
ImageTable _imageTable; ImageTable _imageTable;
std::vector<uint8_t> _sourceGames; std::vector<ObjectSourceGame> _sourceGames;
std::vector<std::string> _authors; std::vector<std::string> _authors;
bool _isJsonObject{}; bool _isJsonObject{};
@ -269,8 +269,8 @@ public:
virtual void SetRepositoryItem(ObjectRepositoryItem* /*item*/) const virtual void SetRepositoryItem(ObjectRepositoryItem* /*item*/) const
{ {
} }
std::vector<uint8_t> GetSourceGames(); std::vector<ObjectSourceGame> GetSourceGames();
void SetSourceGames(const std::vector<uint8_t>& sourceGames); void SetSourceGames(const std::vector<ObjectSourceGame>& sourceGames);
const std::vector<std::string>& GetAuthors() const; const std::vector<std::string>& GetAuthors() const;
void SetAuthors(const std::vector<std::string>&& authors); void SetAuthors(const std::vector<std::string>&& authors);

View File

@ -167,20 +167,20 @@ namespace ObjectFactory
static std::unique_ptr<Object> CreateObjectFromJson( static std::unique_ptr<Object> CreateObjectFromJson(
IObjectRepository& objectRepository, json_t& jRoot, const IFileDataRetriever* fileRetriever); IObjectRepository& objectRepository, json_t& jRoot, const IFileDataRetriever* fileRetriever);
static uint8_t ParseSourceGame(const std::string& s) static ObjectSourceGame ParseSourceGame(const std::string& s)
{ {
static const std::unordered_map<std::string, OBJECT_SOURCE_GAME> LookupTable{ static const std::unordered_map<std::string, ObjectSourceGame> LookupTable{
{ "rct1", OBJECT_SOURCE_RCT1 }, { "rct1", ObjectSourceGame::RCT1 },
{ "rct1aa", OBJECT_SOURCE_ADDED_ATTRACTIONS }, { "rct1aa", ObjectSourceGame::AddedAttractions },
{ "rct1ll", OBJECT_SOURCE_LOOPY_LANDSCAPES }, { "rct1ll", ObjectSourceGame::LoopyLandscapes },
{ "rct2", OBJECT_SOURCE_RCT2 }, { "rct2", ObjectSourceGame::RCT2 },
{ "rct2ww", OBJECT_SOURCE_WACKY_WORLDS }, { "rct2ww", ObjectSourceGame::WackyWorlds },
{ "rct2tt", OBJECT_SOURCE_TIME_TWISTER }, { "rct2tt", ObjectSourceGame::TimeTwister },
{ "official", OBJECT_SOURCE_OPENRCT2_OFFICIAL }, { "official", ObjectSourceGame::OpenRCT2Official },
{ "custom", OBJECT_SOURCE_CUSTOM }, { "custom", ObjectSourceGame::Custom },
}; };
auto result = LookupTable.find(s); auto result = LookupTable.find(s);
return (result != LookupTable.end()) ? result->second : OBJECT_SOURCE_CUSTOM; return (result != LookupTable.end()) ? result->second : ObjectSourceGame::Custom;
} }
static void ReadObjectLegacy(Object& object, IReadObjectContext* context, OpenRCT2::IStream* stream) static void ReadObjectLegacy(Object& object, IReadObjectContext* context, OpenRCT2::IStream* stream)
@ -400,7 +400,7 @@ namespace ObjectFactory
auto sourceGames = jRoot["sourceGame"]; auto sourceGames = jRoot["sourceGame"];
if (sourceGames.is_array() || sourceGames.is_string()) if (sourceGames.is_array() || sourceGames.is_string())
{ {
std::vector<uint8_t> sourceGameVector; std::vector<ObjectSourceGame> sourceGameVector;
for (const auto& jSourceGame : sourceGames) for (const auto& jSourceGame : sourceGames)
{ {
sourceGameVector.push_back(ParseSourceGame(Json::GetString(jSourceGame))); sourceGameVector.push_back(ParseSourceGame(Json::GetString(jSourceGame)));
@ -412,18 +412,18 @@ namespace ObjectFactory
else else
{ {
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str()); log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM }); result.SetSourceGames({ ObjectSourceGame::Custom });
} }
} }
// >90% of objects are custom, so allow omitting the parameter without displaying an error. // >90% of objects are custom, so allow omitting the parameter without displaying an error.
else if (sourceGames.is_null()) else if (sourceGames.is_null())
{ {
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM }); result.SetSourceGames({ ObjectSourceGame::Custom });
} }
else else
{ {
log_error("Object %s has an incorrect sourceGame parameter.", id.c_str()); log_error("Object %s has an incorrect sourceGame parameter.", id.c_str());
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM }); result.SetSourceGames({ ObjectSourceGame::Custom });
} }
} }

View File

@ -69,9 +69,9 @@ bool object_entry_is_empty(const rct_object_entry* entry)
return false; return false;
} }
uint8_t object_entry_get_source_game_legacy(const rct_object_entry* objectEntry) ObjectSourceGame object_entry_get_source_game_legacy(const rct_object_entry* objectEntry)
{ {
return (objectEntry->flags & 0xF0) >> 4; return static_cast<ObjectSourceGame>((objectEntry->flags & 0xF0) >> 4);
} }
/** /**

View File

@ -21,4 +21,4 @@ void get_type_entry_index(size_t index, uint8_t* outObjectType, ObjectEntryIndex
const rct_object_entry* get_loaded_object_entry(size_t index); const rct_object_entry* get_loaded_object_entry(size_t index);
void* get_loaded_object_chunk(size_t index); void* get_loaded_object_chunk(size_t index);
uint8_t object_entry_get_type(const rct_object_entry* objectEntry); uint8_t object_entry_get_type(const rct_object_entry* objectEntry);
uint8_t object_entry_get_source_game_legacy(const rct_object_entry* objectEntry); ObjectSourceGame object_entry_get_source_game_legacy(const rct_object_entry* objectEntry);

View File

@ -270,23 +270,23 @@ public:
LoadObject("#ORCT2SN"); LoadObject("#ORCT2SN");
} }
static rct_string_id GetObjectSourceGameString(const uint8_t sourceGame) static rct_string_id GetObjectSourceGameString(const ObjectSourceGame sourceGame)
{ {
switch (sourceGame) switch (sourceGame)
{ {
case OBJECT_SOURCE_RCT1: case ObjectSourceGame::RCT1:
return STR_SCENARIO_CATEGORY_RCT1; return STR_SCENARIO_CATEGORY_RCT1;
case OBJECT_SOURCE_ADDED_ATTRACTIONS: case ObjectSourceGame::AddedAttractions:
return STR_SCENARIO_CATEGORY_RCT1_AA; return STR_SCENARIO_CATEGORY_RCT1_AA;
case OBJECT_SOURCE_LOOPY_LANDSCAPES: case ObjectSourceGame::LoopyLandscapes:
return STR_SCENARIO_CATEGORY_RCT1_LL; return STR_SCENARIO_CATEGORY_RCT1_LL;
case OBJECT_SOURCE_RCT2: case ObjectSourceGame::RCT2:
return STR_ROLLERCOASTER_TYCOON_2_DROPDOWN; return STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
case OBJECT_SOURCE_WACKY_WORLDS: case ObjectSourceGame::WackyWorlds:
return STR_OBJECT_FILTER_WW; return STR_OBJECT_FILTER_WW;
case OBJECT_SOURCE_TIME_TWISTER: case ObjectSourceGame::TimeTwister:
return STR_OBJECT_FILTER_TT; return STR_OBJECT_FILTER_TT;
case OBJECT_SOURCE_OPENRCT2_OFFICIAL: case ObjectSourceGame::OpenRCT2Official:
return STR_OBJECT_FILTER_OPENRCT2_OFFICIAL; return STR_OBJECT_FILTER_OPENRCT2_OFFICIAL;
default: default:
return STR_OBJECT_FILTER_CUSTOM; return STR_OBJECT_FILTER_CUSTOM;
@ -774,7 +774,7 @@ void object_manager_unload_all_objects()
objectManager.UnloadAll(); objectManager.UnloadAll();
} }
rct_string_id object_manager_get_source_game_string(const uint8_t sourceGame) rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame)
{ {
return ObjectManager::GetObjectSourceGameString(sourceGame); return ObjectManager::GetObjectSourceGameString(sourceGame);
} }

View File

@ -50,4 +50,4 @@ ObjectEntryIndex object_manager_get_loaded_object_entry_index(const void* loaded
void* object_manager_load_object(const rct_object_entry* entry); void* object_manager_load_object(const rct_object_entry* entry);
void object_manager_unload_objects(const std::vector<rct_object_entry>& entries); void object_manager_unload_objects(const std::vector<rct_object_entry>& entries);
void object_manager_unload_all_objects(); void object_manager_unload_all_objects();
rct_string_id object_manager_get_source_game_string(const uint8_t sourceGame); rct_string_id object_manager_get_source_game_string(const ObjectSourceGame sourceGame);

View File

@ -178,7 +178,7 @@ protected:
for (size_t i = 0; i < sourceLength; i++) for (size_t i = 0; i < sourceLength; i++)
{ {
auto value = stream->ReadValue<uint8_t>(); auto value = stream->ReadValue<uint8_t>();
item.Sources.push_back(value); item.Sources.push_back(static_cast<ObjectSourceGame>(value));
} }
auto authorsLength = stream->ReadValue<uint8_t>(); auto authorsLength = stream->ReadValue<uint8_t>();
@ -671,10 +671,10 @@ bool IsObjectCustom(const ObjectRepositoryItem* object)
switch (object->GetFirstSourceGame()) switch (object->GetFirstSourceGame())
{ {
case OBJECT_SOURCE_RCT2: case ObjectSourceGame::RCT2:
case OBJECT_SOURCE_WACKY_WORLDS: case ObjectSourceGame::WackyWorlds:
case OBJECT_SOURCE_TIME_TWISTER: case ObjectSourceGame::TimeTwister:
case OBJECT_SOURCE_OPENRCT2_OFFICIAL: case ObjectSourceGame::OpenRCT2Official:
return false; return false;
default: default:
return true; return true;

View File

@ -41,7 +41,7 @@ struct ObjectRepositoryItem
std::string Path; std::string Path;
std::string Name; std::string Name;
std::vector<std::string> Authors; std::vector<std::string> Authors;
std::vector<uint8_t> Sources; std::vector<ObjectSourceGame> Sources;
Object* LoadedObject{}; Object* LoadedObject{};
struct struct
{ {
@ -54,12 +54,12 @@ struct ObjectRepositoryItem
std::vector<rct_object_entry> Entries; std::vector<rct_object_entry> Entries;
} SceneryGroupInfo; } SceneryGroupInfo;
OBJECT_SOURCE_GAME GetFirstSourceGame() const ObjectSourceGame GetFirstSourceGame() const
{ {
if (Sources.empty()) if (Sources.empty())
return OBJECT_SOURCE_CUSTOM; return ObjectSourceGame::Custom;
else else
return static_cast<OBJECT_SOURCE_GAME>(Sources[0]); return static_cast<ObjectSourceGame>(Sources[0]);
} }
}; };

View File

@ -1930,7 +1930,7 @@ private:
for (const auto objectName : objectNames) for (const auto objectName : objectNames)
{ {
rct_object_entry entry{}; rct_object_entry entry{};
entry.flags = ((OBJECT_SOURCE_RCT2 << 4) & 0xF0) | (objectType & 0x0F); entry.flags = ((static_cast<uint8_t>(ObjectSourceGame::RCT2) << 4) & 0xF0) | (objectType & 0x0F);
entry.SetName(objectName); entry.SetName(objectName);
entries.push_back(entry); entries.push_back(entry);
} }