From 041501fb5dc15d3ed6b9b7ac619a64913ec367ea Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 23 Sep 2026 21:46:04 +0200 Subject: [PATCH] chore: add game variants to IGame --- src/Common/Game/IGame.cpp | 43 +++++++++++++++++++++++++++++++++ src/Common/Game/IGame.h | 43 +++++++++++++++++++++++++++++++++ src/Common/Game/IW3/GameIW3.cpp | 8 ++++++ src/Common/Game/IW3/GameIW3.h | 6 +++++ src/Common/Game/IW4/GameIW4.cpp | 10 ++++++++ src/Common/Game/IW4/GameIW4.h | 7 ++++++ src/Common/Game/IW5/GameIW5.cpp | 9 +++++++ src/Common/Game/IW5/GameIW5.h | 7 ++++++ src/Common/Game/QOS/GameQOS.cpp | 8 ++++++ src/Common/Game/QOS/GameQOS.h | 6 +++++ src/Common/Game/T4/GameT4.cpp | 8 ++++++ src/Common/Game/T4/GameT4.h | 6 +++++ src/Common/Game/T5/GameT5.cpp | 8 ++++++ src/Common/Game/T5/GameT5.h | 6 +++++ src/Common/Game/T6/GameT6.cpp | 8 ++++++ src/Common/Game/T6/GameT6.h | 6 +++++ 16 files changed, 189 insertions(+) diff --git a/src/Common/Game/IGame.cpp b/src/Common/Game/IGame.cpp index 03211034..8a9eb9ee 100644 --- a/src/Common/Game/IGame.cpp +++ b/src/Common/Game/IGame.cpp @@ -11,6 +11,40 @@ #include +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& 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; diff --git a/src/Common/Game/IGame.h b/src/Common/Game/IGame.h index 642ce8dd..2e4011a3 100644 --- a/src/Common/Game/IGame.h +++ b/src/Common/Game/IGame.h @@ -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 == static_cast(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& GetLanguagePrefixes() const = 0; + [[nodiscard]] virtual const IGameVariant* GetVariantById(GameVariantId id) const = 0; + [[nodiscard]] virtual const std::vector& GetVariants() const = 0; + [[nodiscard]] virtual asset_type_t GetAssetTypeCount() const = 0; [[nodiscard]] virtual std::optional GetAssetTypeName(asset_type_t assetType) const = 0; [[nodiscard]] virtual std::optional FindAssetTypeByName(const std::string& potentialAssetTypeName) const = 0; @@ -90,6 +131,8 @@ public: [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + [[nodiscard]] const IGameVariant* GetVariantById(GameVariantId id) const override; + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; [[nodiscard]] std::optional FindAssetTypeByName(const std::string& potentialAssetTypeName) const override; diff --git a/src/Common/Game/IW3/GameIW3.cpp b/src/Common/Game/IW3/GameIW3.cpp index e05a927d..d1ccf75b 100644 --- a/src/Common/Game/IW3/GameIW3.cpp +++ b/src/Common/Game/IW3/GameIW3.cpp @@ -51,4 +51,12 @@ namespace IW3 static std::string shortName = "IW3"; return shortName; } + + const std::vector& Game::GetVariants() const + { + static std::vector variants = { + new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC), + }; + return variants; + } } // namespace IW3 diff --git a/src/Common/Game/IW3/GameIW3.h b/src/Common/Game/IW3/GameIW3.h index 0c238743..724e3bdd 100644 --- a/src/Common/Game/IW3/GameIW3.h +++ b/src/Common/Game/IW3/GameIW3.h @@ -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& GetVariants() const override; }; } // namespace IW3 diff --git a/src/Common/Game/IW4/GameIW4.cpp b/src/Common/Game/IW4/GameIW4.cpp index b1a738fe..d485d475 100644 --- a/src/Common/Game/IW4/GameIW4.cpp +++ b/src/Common/Game/IW4/GameIW4.cpp @@ -3,6 +3,7 @@ #include "IW4.h" #include +#include using namespace IW4; @@ -53,4 +54,13 @@ namespace IW4 static std::string shortName = "IW4"; return shortName; } + + const std::vector& Game::GetVariants() const + { + static std::vector 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 diff --git a/src/Common/Game/IW4/GameIW4.h b/src/Common/Game/IW4/GameIW4.h index ae94a3be..1bf2d8d6 100644 --- a/src/Common/Game/IW4/GameIW4.h +++ b/src/Common/Game/IW4/GameIW4.h @@ -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& GetVariants() const override; }; } // namespace IW4 diff --git a/src/Common/Game/IW5/GameIW5.cpp b/src/Common/Game/IW5/GameIW5.cpp index 5d0b6ff0..484535da 100644 --- a/src/Common/Game/IW5/GameIW5.cpp +++ b/src/Common/Game/IW5/GameIW5.cpp @@ -90,4 +90,13 @@ namespace IW5 static std::string shortName = "IW5"; return shortName; } + + const std::vector& Game::GetVariants() const + { + static std::vector 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 diff --git a/src/Common/Game/IW5/GameIW5.h b/src/Common/Game/IW5/GameIW5.h index 73c9d765..c5399e6a 100644 --- a/src/Common/Game/IW5/GameIW5.h +++ b/src/Common/Game/IW5/GameIW5.h @@ -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& GetVariants() const override; }; } // namespace IW5 diff --git a/src/Common/Game/QOS/GameQOS.cpp b/src/Common/Game/QOS/GameQOS.cpp index 5d7dd20c..5bc4e378 100644 --- a/src/Common/Game/QOS/GameQOS.cpp +++ b/src/Common/Game/QOS/GameQOS.cpp @@ -85,4 +85,12 @@ namespace QOS static std::string shortName = "QOS"; return shortName; } + + const std::vector& Game::GetVariants() const + { + static std::vector variants = { + new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC), + }; + return variants; + } } // namespace QOS diff --git a/src/Common/Game/QOS/GameQOS.h b/src/Common/Game/QOS/GameQOS.h index 6314e00e..708e7990 100644 --- a/src/Common/Game/QOS/GameQOS.h +++ b/src/Common/Game/QOS/GameQOS.h @@ -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& GetVariants() const override; }; } // namespace QOS diff --git a/src/Common/Game/T4/GameT4.cpp b/src/Common/Game/T4/GameT4.cpp index 8066cb09..605718f6 100644 --- a/src/Common/Game/T4/GameT4.cpp +++ b/src/Common/Game/T4/GameT4.cpp @@ -92,4 +92,12 @@ namespace T4 static std::string shortName = "T4"; return shortName; } + + const std::vector& Game::GetVariants() const + { + static std::vector variants = { + new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC), + }; + return variants; + } } // namespace T4 diff --git a/src/Common/Game/T4/GameT4.h b/src/Common/Game/T4/GameT4.h index fb7fc691..6dbb5a21 100644 --- a/src/Common/Game/T4/GameT4.h +++ b/src/Common/Game/T4/GameT4.h @@ -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& GetVariants() const override; }; } // namespace T4 diff --git a/src/Common/Game/T5/GameT5.cpp b/src/Common/Game/T5/GameT5.cpp index b24eec28..eb9f2676 100644 --- a/src/Common/Game/T5/GameT5.cpp +++ b/src/Common/Game/T5/GameT5.cpp @@ -76,4 +76,12 @@ namespace T5 return prefixes; } + + const std::vector& Game::GetVariants() const + { + static std::vector variants = { + new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC), + }; + return variants; + } } // namespace T5 diff --git a/src/Common/Game/T5/GameT5.h b/src/Common/Game/T5/GameT5.h index 80aff27c..b005cee1 100644 --- a/src/Common/Game/T5/GameT5.h +++ b/src/Common/Game/T5/GameT5.h @@ -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& GetLanguagePrefixes() const override; + [[nodiscard]] const std::vector& GetVariants() const override; }; } // namespace T5 diff --git a/src/Common/Game/T6/GameT6.cpp b/src/Common/Game/T6/GameT6.cpp index eacdcbbf..c8f6baca 100644 --- a/src/Common/Game/T6/GameT6.cpp +++ b/src/Common/Game/T6/GameT6.cpp @@ -132,4 +132,12 @@ namespace T6 return prefixes; } + + const std::vector& Game::GetVariants() const + { + static std::vector variants = { + new GameVariant(std::to_underlying(VariantId::PC), "pc", GameEndianness::LE, GameWordSize::ARCH_32, GamePlatform::PC), + }; + return variants; + } } // namespace T6 diff --git a/src/Common/Game/T6/GameT6.h b/src/Common/Game/T6/GameT6.h index 2bcc9447..c12e409e 100644 --- a/src/Common/Game/T6/GameT6.h +++ b/src/Common/Game/T6/GameT6.h @@ -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& GetLanguagePrefixes() const override; + [[nodiscard]] const std::vector& GetVariants() const override; }; } // namespace T6