chore: add game variants to IGame

This commit is contained in:
Jan Laupetin committed 2026-10-22 20:01:05 +02:00
1 parent c24d1f0cd8
commit 041501fb5d
16 files changed
+189

No files matched your search

+43
View File
@@ -11,6 +11,40 @@
#include <cassert>
GameVariant::GameVariant(const GameVariantId id, std::string name, const GameEndianness endianness, const GameWordSize wordSize, const GamePlatform platform)
: m_id(id),
m_name(std::move(name)),
m_endianness(endianness),
m_word_size(wordSize),
m_platform(platform)
{
}
GameVariantId GameVariant::GetId() const
{
return m_id;
}
const std::string& GameVariant::GetName() const
{
return m_name;
}
GameEndianness GameVariant::GetEndianness() const
{
return m_endianness;
}
GameWordSize GameVariant::GetWordSize() const
{
return m_word_size;
}
GamePlatform GameVariant::GetPlatform() const
{
return m_platform;
}
IGame* IGame::GetGameById(GameId gameId)
{
static IGame* games[]{
@@ -53,6 +87,15 @@ const std::vector<GameLanguagePrefix>& AbstractGame::GetLanguagePrefixes() const
return prefixes;
}
const IGameVariant* AbstractGame::GetVariantById(const GameVariantId id) const
{
const auto& variants = GetVariants();
assert(id < variants.size());
return variants[id];
}
asset_type_t AbstractGame::GetAssetTypeCount() const
{
return m_asset_type_count;
+43
View File
@@ -23,6 +23,8 @@ enum class GameId : std::uint8_t
COUNT
};
typedef std::uint8_t GameVariantId;
// The full uppercase names are macros in the standard lib
// So unfortunately not usable as values in the enum
enum class GameEndianness : std::uint8_t
@@ -58,6 +60,42 @@ static constexpr const char* GameId_Names[]{
};
static_assert(std::extent_v<decltype(GameId_Names)> == static_cast<unsigned>(GameId::COUNT));
class IGameVariant
{
public:
IGameVariant() = default;
virtual ~IGameVariant() = default;
IGameVariant(const IGameVariant& other) = default;
IGameVariant(IGameVariant&& other) noexcept = default;
IGameVariant& operator=(const IGameVariant& other) = default;
IGameVariant& operator=(IGameVariant&& other) noexcept = default;
[[nodiscard]] virtual GameVariantId GetId() const = 0;
[[nodiscard]] virtual const std::string& GetName() const = 0;
[[nodiscard]] virtual GameEndianness GetEndianness() const = 0;
[[nodiscard]] virtual GameWordSize GetWordSize() const = 0;
[[nodiscard]] virtual GamePlatform GetPlatform() const = 0;
};
class GameVariant : public IGameVariant
{
public:
GameVariant(GameVariantId id, std::string name, GameEndianness endianness, GameWordSize wordSize, GamePlatform platform);
[[nodiscard]] GameVariantId GetId() const override;
[[nodiscard]] const std::string& GetName() const override;
[[nodiscard]] GameEndianness GetEndianness() const override;
[[nodiscard]] GameWordSize GetWordSize() const override;
[[nodiscard]] GamePlatform GetPlatform() const override;
private:
GameVariantId m_id;
std::string m_name;
GameEndianness m_endianness;
GameWordSize m_word_size;
GamePlatform m_platform;
};
class IGame
{
public:
@@ -73,6 +111,9 @@ public:
[[nodiscard]] virtual const std::string& GetShortName() const = 0;
[[nodiscard]] virtual const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const = 0;
[[nodiscard]] virtual const IGameVariant* GetVariantById(GameVariantId id) const = 0;
[[nodiscard]] virtual const std::vector<IGameVariant*>& GetVariants() const = 0;
[[nodiscard]] virtual asset_type_t GetAssetTypeCount() const = 0;
[[nodiscard]] virtual std::optional<const char*> GetAssetTypeName(asset_type_t assetType) const = 0;
[[nodiscard]] virtual std::optional<asset_type_t> FindAssetTypeByName(const std::string& potentialAssetTypeName) const = 0;
@@ -90,6 +131,8 @@ public:
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
[[nodiscard]] const IGameVariant* GetVariantById(GameVariantId id) const override;
[[nodiscard]] asset_type_t GetAssetTypeCount() const override;
[[nodiscard]] std::optional<const char*> GetAssetTypeName(asset_type_t assetType) const override;
[[nodiscard]] std::optional<asset_type_t> FindAssetTypeByName(const std::string& potentialAssetTypeName) const override;
+8
View File
@@ -51,4 +51,12 @@ namespace IW3
static std::string shortName = "IW3";
return shortName;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
};
return variants;
}
} // namespace IW3
+6
View File
@@ -4,6 +4,11 @@
namespace IW3
{
enum class VariantId : std::uint8_t
{
PC,
};
class Game final : public AbstractGame
{
public:
@@ -12,5 +17,6 @@ namespace IW3
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace IW3
+10
View File
@@ -3,6 +3,7 @@
#include "IW4.h"
#include <algorithm>
#include <utility>
using namespace IW4;
@@ -53,4 +54,13 @@ namespace IW4
static std::string shortName = "IW4";
return shortName;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC32), "pc32", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
new GameVariant(std::to_underlying(VariantId::PC32), "pc64", GameEndianness::LE, GameWordSize::ARCH_64, GamePlatform::PC),
};
return variants;
}
} // namespace IW4
+7
View File
@@ -4,6 +4,12 @@
namespace IW4
{
enum class VariantId : std::uint8_t
{
PC32,
PC64,
};
class Game final : public AbstractGame
{
public:
@@ -12,5 +18,6 @@ namespace IW4
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace IW4
+9
View File
@@ -90,4 +90,13 @@ namespace IW5
static std::string shortName = "IW5";
return shortName;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC32), "pc32", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
new GameVariant(std::to_underlying(VariantId::PC32), "pc64", GameEndianness::LE, GameWordSize::ARCH_64, GamePlatform::PC),
};
return variants;
}
} // namespace IW5
+7
View File
@@ -4,6 +4,12 @@
namespace IW5
{
enum class VariantId : std::uint8_t
{
PC32,
PC64,
};
class Game final : public AbstractGame
{
public:
@@ -12,5 +18,6 @@ namespace IW5
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace IW5
+8
View File
@@ -85,4 +85,12 @@ namespace QOS
static std::string shortName = "QOS";
return shortName;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
};
return variants;
}
} // namespace QOS
+6
View File
@@ -4,6 +4,11 @@
namespace QOS
{
enum class VariantId : std::uint8_t
{
PC,
};
class Game final : public AbstractGame
{
public:
@@ -12,5 +17,6 @@ namespace QOS
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace QOS
+8
View File
@@ -92,4 +92,12 @@ namespace T4
static std::string shortName = "T4";
return shortName;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
};
return variants;
}
} // namespace T4
+6
View File
@@ -4,6 +4,11 @@
namespace T4
{
enum class VariantId : std::uint8_t
{
PC,
};
class Game final : public AbstractGame
{
public:
@@ -12,5 +17,6 @@ namespace T4
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace T4
+8
View File
@@ -76,4 +76,12 @@ namespace T5
return prefixes;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
};
return variants;
}
} // namespace T5
+6
View File
@@ -4,6 +4,11 @@
namespace T5
{
enum class VariantId : std::uint8_t
{
PC,
};
class Game final : public AbstractGame
{
public:
@@ -13,5 +18,6 @@ namespace T5
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace T5
+8
View File
@@ -132,4 +132,12 @@ namespace T6
return prefixes;
}
const std::vector<IGameVariant*>& Game::GetVariants() const
{
static std::vector<IGameVariant*> variants = {
new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC),
};
return variants;
}
} // namespace T6
+6
View File
@@ -4,6 +4,11 @@
namespace T6
{
enum class VariantId : std::uint8_t
{
PC,
};
class Game final : public AbstractGame
{
public:
@@ -13,5 +18,6 @@ namespace T6
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
[[nodiscard]] const std::vector<IGameVariant*>& GetVariants() const override;
};
} // namespace T6