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;
}
static bool sources_match(uint8_t source)
static bool sources_match(ObjectSourceGame source)
{
// clang-format off
return (_FILTER_RCT1 && source == OBJECT_SOURCE_RCT1) ||
(_FILTER_AA && source == OBJECT_SOURCE_ADDED_ATTRACTIONS) ||
(_FILTER_LL && source == OBJECT_SOURCE_LOOPY_LANDSCAPES) ||
(_FILTER_RCT2 && source == OBJECT_SOURCE_RCT2) ||
(_FILTER_WW && source == OBJECT_SOURCE_WACKY_WORLDS) ||
(_FILTER_TT && source == OBJECT_SOURCE_TIME_TWISTER) ||
(_FILTER_OO && source == OBJECT_SOURCE_OPENRCT2_OFFICIAL) ||
return (_FILTER_RCT1 && source == ObjectSourceGame::RCT1) ||
(_FILTER_AA && source == ObjectSourceGame::AddedAttractions) ||
(_FILTER_LL && source == ObjectSourceGame::LoopyLandscapes) ||
(_FILTER_RCT2 && source == ObjectSourceGame::RCT2) ||
(_FILTER_WW && source == ObjectSourceGame::WackyWorlds) ||
(_FILTER_TT && source == ObjectSourceGame::TimeTwister) ||
(_FILTER_OO && source == ObjectSourceGame::OpenRCT2Official) ||
(_FILTER_CUSTOM &&
source != OBJECT_SOURCE_RCT1 &&
source != OBJECT_SOURCE_ADDED_ATTRACTIONS &&
source != OBJECT_SOURCE_LOOPY_LANDSCAPES &&
source != OBJECT_SOURCE_RCT2 &&
source != OBJECT_SOURCE_WACKY_WORLDS &&
source != OBJECT_SOURCE_TIME_TWISTER &&
source != OBJECT_SOURCE_OPENRCT2_OFFICIAL);
source != ObjectSourceGame::RCT1 &&
source != ObjectSourceGame::AddedAttractions &&
source != ObjectSourceGame::LoopyLandscapes &&
source != ObjectSourceGame::RCT2 &&
source != ObjectSourceGame::WackyWorlds &&
source != ObjectSourceGame::TimeTwister &&
source != ObjectSourceGame::OpenRCT2Official);
// clang-format on
}

View File

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

View File

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

View File

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

View File

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

View File

@ -167,20 +167,20 @@ namespace ObjectFactory
static std::unique_ptr<Object> CreateObjectFromJson(
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{
{ "rct1", OBJECT_SOURCE_RCT1 },
{ "rct1aa", OBJECT_SOURCE_ADDED_ATTRACTIONS },
{ "rct1ll", OBJECT_SOURCE_LOOPY_LANDSCAPES },
{ "rct2", OBJECT_SOURCE_RCT2 },
{ "rct2ww", OBJECT_SOURCE_WACKY_WORLDS },
{ "rct2tt", OBJECT_SOURCE_TIME_TWISTER },
{ "official", OBJECT_SOURCE_OPENRCT2_OFFICIAL },
{ "custom", OBJECT_SOURCE_CUSTOM },
static const std::unordered_map<std::string, ObjectSourceGame> LookupTable{
{ "rct1", ObjectSourceGame::RCT1 },
{ "rct1aa", ObjectSourceGame::AddedAttractions },
{ "rct1ll", ObjectSourceGame::LoopyLandscapes },
{ "rct2", ObjectSourceGame::RCT2 },
{ "rct2ww", ObjectSourceGame::WackyWorlds },
{ "rct2tt", ObjectSourceGame::TimeTwister },
{ "official", ObjectSourceGame::OpenRCT2Official },
{ "custom", ObjectSourceGame::Custom },
};
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)
@ -400,7 +400,7 @@ namespace ObjectFactory
auto sourceGames = jRoot["sourceGame"];
if (sourceGames.is_array() || sourceGames.is_string())
{
std::vector<uint8_t> sourceGameVector;
std::vector<ObjectSourceGame> sourceGameVector;
for (const auto& jSourceGame : sourceGames)
{
sourceGameVector.push_back(ParseSourceGame(Json::GetString(jSourceGame)));
@ -412,18 +412,18 @@ namespace ObjectFactory
else
{
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.
else if (sourceGames.is_null())
{
result.SetSourceGames({ OBJECT_SOURCE_CUSTOM });
result.SetSourceGames({ ObjectSourceGame::Custom });
}
else
{
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;
}
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);
void* get_loaded_object_chunk(size_t index);
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");
}
static rct_string_id GetObjectSourceGameString(const uint8_t sourceGame)
static rct_string_id GetObjectSourceGameString(const ObjectSourceGame sourceGame)
{
switch (sourceGame)
{
case OBJECT_SOURCE_RCT1:
case ObjectSourceGame::RCT1:
return STR_SCENARIO_CATEGORY_RCT1;
case OBJECT_SOURCE_ADDED_ATTRACTIONS:
case ObjectSourceGame::AddedAttractions:
return STR_SCENARIO_CATEGORY_RCT1_AA;
case OBJECT_SOURCE_LOOPY_LANDSCAPES:
case ObjectSourceGame::LoopyLandscapes:
return STR_SCENARIO_CATEGORY_RCT1_LL;
case OBJECT_SOURCE_RCT2:
case ObjectSourceGame::RCT2:
return STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
case OBJECT_SOURCE_WACKY_WORLDS:
case ObjectSourceGame::WackyWorlds:
return STR_OBJECT_FILTER_WW;
case OBJECT_SOURCE_TIME_TWISTER:
case ObjectSourceGame::TimeTwister:
return STR_OBJECT_FILTER_TT;
case OBJECT_SOURCE_OPENRCT2_OFFICIAL:
case ObjectSourceGame::OpenRCT2Official:
return STR_OBJECT_FILTER_OPENRCT2_OFFICIAL;
default:
return STR_OBJECT_FILTER_CUSTOM;
@ -774,7 +774,7 @@ void object_manager_unload_all_objects()
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);
}

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_unload_objects(const std::vector<rct_object_entry>& entries);
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++)
{
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>();
@ -671,10 +671,10 @@ bool IsObjectCustom(const ObjectRepositoryItem* object)
switch (object->GetFirstSourceGame())
{
case OBJECT_SOURCE_RCT2:
case OBJECT_SOURCE_WACKY_WORLDS:
case OBJECT_SOURCE_TIME_TWISTER:
case OBJECT_SOURCE_OPENRCT2_OFFICIAL:
case ObjectSourceGame::RCT2:
case ObjectSourceGame::WackyWorlds:
case ObjectSourceGame::TimeTwister:
case ObjectSourceGame::OpenRCT2Official:
return false;
default:
return true;

View File

@ -41,7 +41,7 @@ struct ObjectRepositoryItem
std::string Path;
std::string Name;
std::vector<std::string> Authors;
std::vector<uint8_t> Sources;
std::vector<ObjectSourceGame> Sources;
Object* LoadedObject{};
struct
{
@ -54,12 +54,12 @@ struct ObjectRepositoryItem
std::vector<rct_object_entry> Entries;
} SceneryGroupInfo;
OBJECT_SOURCE_GAME GetFirstSourceGame() const
ObjectSourceGame GetFirstSourceGame() const
{
if (Sources.empty())
return OBJECT_SOURCE_CUSTOM;
return ObjectSourceGame::Custom;
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)
{
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);
entries.push_back(entry);
}