refactor: get rid of global game variables

This commit is contained in:
Jan 2024-10-19 21:03:36 +02:00
parent ce16d8e6c8
commit b00c65c8c0
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
28 changed files with 177 additions and 156 deletions

26
src/Common/Game/IGame.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "IGame.h"
#include "IW3/GameIW3.h"
#include "IW4/GameIW4.h"
#include "IW5/GameIW5.h"
#include "T5/GameT5.h"
#include "T6/GameT6.h"
#include <cassert>
IGame* IGame::GetGameById(GameId gameId)
{
static IGame* games[static_cast<unsigned>(GameId::COUNT)]{
new IW3::Game(),
new IW4::Game(),
new IW5::Game(),
new T5::Game(),
new T6::Game(),
};
assert(static_cast<unsigned>(gameId) < static_cast<unsigned>(GameId::COUNT));
auto* result = games[static_cast<unsigned>(gameId)];
assert(result);
return result;
}

View File

@ -36,13 +36,13 @@ public:
IGame& operator=(const IGame& other) = default;
IGame& operator=(IGame&& other) noexcept = default;
virtual GameId GetId() = 0;
virtual std::string GetFullName() = 0;
virtual std::string GetShortName() = 0;
[[nodiscard]] virtual GameId GetId() const = 0;
[[nodiscard]] virtual const std::string& GetFullName() const = 0;
[[nodiscard]] virtual const std::string& GetShortName() const = 0;
virtual void AddZone(Zone* zone) = 0;
virtual void RemoveZone(Zone* zone) = 0;
virtual std::vector<Zone*> GetZones() = 0;
virtual const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() = 0;
[[nodiscard]] virtual const std::vector<Zone*>& GetZones() const = 0;
[[nodiscard]] virtual const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const = 0;
static IGame* GetGameById(GameId gameId);
};

View File

@ -1,34 +1,32 @@
#include "GameIW3.h"
#include "IW3.h"
#include <algorithm>
using namespace IW3;
GameIW3 g_GameIW3;
GameId GameIW3::GetId()
GameId Game::GetId() const
{
return GameId::IW3;
}
std::string GameIW3::GetFullName()
const std::string& Game::GetFullName() const
{
return "Call Of Duty 4: Modern Warfare";
static std::string fullName = "Call Of Duty 4: Modern Warfare";
return fullName;
}
std::string GameIW3::GetShortName()
const std::string& Game::GetShortName() const
{
return "IW3";
static std::string shortName = "IW3";
return shortName;
}
void GameIW3::AddZone(Zone* zone)
void Game::AddZone(Zone* zone)
{
m_zones.push_back(zone);
}
void GameIW3::RemoveZone(Zone* zone)
void Game::RemoveZone(Zone* zone)
{
const auto foundEntry = std::ranges::find(m_zones, zone);
@ -36,12 +34,12 @@ void GameIW3::RemoveZone(Zone* zone)
m_zones.erase(foundEntry);
}
std::vector<Zone*> GameIW3::GetZones()
const std::vector<Zone*>& Game::GetZones() const
{
return m_zones;
}
const std::vector<GameLanguagePrefix>& GameIW3::GetLanguagePrefixes()
const std::vector<GameLanguagePrefix>& Game::GetLanguagePrefixes() const
{
static std::vector<GameLanguagePrefix> prefixes;
return prefixes;

View File

@ -1,19 +1,20 @@
#pragma once
#include "Game/IGame.h"
class GameIW3 final : public IGame
namespace IW3
{
class Game final : public IGame
{
public:
GameId GetId() override;
std::string GetFullName() override;
std::string GetShortName() override;
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
void AddZone(Zone* zone) override;
void RemoveZone(Zone* zone) override;
std::vector<Zone*> GetZones() override;
const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() override;
[[nodiscard]] const std::vector<Zone*>& GetZones() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
private:
std::vector<Zone*> m_zones;
};
extern GameIW3 g_GameIW3;
} // namespace IW3

View File

@ -1,34 +1,32 @@
#include "GameIW4.h"
#include "IW4.h"
#include <algorithm>
using namespace IW4;
GameIW4 g_GameIW4;
GameId GameIW4::GetId()
GameId Game::GetId() const
{
return GameId::IW4;
}
std::string GameIW4::GetFullName()
const std::string& Game::GetFullName() const
{
return "Call Of Duty: Modern Warfare 2";
static std::string fullName = "Call Of Duty: Modern Warfare 2";
return fullName;
}
std::string GameIW4::GetShortName()
const std::string& Game::GetShortName() const
{
return "IW4";
static std::string shortName = "IW4";
return shortName;
}
void GameIW4::AddZone(Zone* zone)
void Game::AddZone(Zone* zone)
{
m_zones.push_back(zone);
}
void GameIW4::RemoveZone(Zone* zone)
void Game::RemoveZone(Zone* zone)
{
const auto foundEntry = std::ranges::find(m_zones, zone);
@ -36,12 +34,12 @@ void GameIW4::RemoveZone(Zone* zone)
m_zones.erase(foundEntry);
}
std::vector<Zone*> GameIW4::GetZones()
const std::vector<Zone*>& Game::GetZones() const
{
return m_zones;
}
const std::vector<GameLanguagePrefix>& GameIW4::GetLanguagePrefixes()
const std::vector<GameLanguagePrefix>& Game::GetLanguagePrefixes() const
{
static std::vector<GameLanguagePrefix> prefixes;
return prefixes;

View File

@ -1,19 +1,20 @@
#pragma once
#include "Game/IGame.h"
class GameIW4 final : public IGame
namespace IW4
{
class Game final : public IGame
{
public:
GameId GetId() override;
std::string GetFullName() override;
std::string GetShortName() override;
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
void AddZone(Zone* zone) override;
void RemoveZone(Zone* zone) override;
std::vector<Zone*> GetZones() override;
const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() override;
[[nodiscard]] const std::vector<Zone*>& GetZones() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
private:
std::vector<Zone*> m_zones;
};
extern GameIW4 g_GameIW4;
} // namespace IW4

View File

@ -1,34 +1,32 @@
#include "GameIW5.h"
#include "IW5.h"
#include <algorithm>
using namespace IW5;
GameIW5 g_GameIW5;
GameId GameIW5::GetId()
GameId Game::GetId() const
{
return GameId::IW5;
}
std::string GameIW5::GetFullName()
const std::string& Game::GetFullName() const
{
return "Call Of Duty: Modern Warfare 3";
static std::string fullName = "Call Of Duty: Modern Warfare 3";
return fullName;
}
std::string GameIW5::GetShortName()
const std::string& Game::GetShortName() const
{
return "IW5";
static std::string shortName = "IW5";
return shortName;
}
void GameIW5::AddZone(Zone* zone)
void Game::AddZone(Zone* zone)
{
m_zones.push_back(zone);
}
void GameIW5::RemoveZone(Zone* zone)
void Game::RemoveZone(Zone* zone)
{
const auto foundEntry = std::ranges::find(m_zones, zone);
@ -36,12 +34,12 @@ void GameIW5::RemoveZone(Zone* zone)
m_zones.erase(foundEntry);
}
std::vector<Zone*> GameIW5::GetZones()
const std::vector<Zone*>& Game::GetZones() const
{
return m_zones;
}
const std::vector<GameLanguagePrefix>& GameIW5::GetLanguagePrefixes()
const std::vector<GameLanguagePrefix>& Game::GetLanguagePrefixes() const
{
static std::vector<GameLanguagePrefix> prefixes;
return prefixes;

View File

@ -1,19 +1,20 @@
#pragma once
#include "Game/IGame.h"
class GameIW5 final : public IGame
namespace IW5
{
class Game final : public IGame
{
public:
GameId GetId() override;
std::string GetFullName() override;
std::string GetShortName() override;
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
void AddZone(Zone* zone) override;
void RemoveZone(Zone* zone) override;
std::vector<Zone*> GetZones() override;
const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() override;
[[nodiscard]] const std::vector<Zone*>& GetZones() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
private:
std::vector<Zone*> m_zones;
};
extern GameIW5 g_GameIW5;
} // namespace IW5

View File

@ -1,34 +1,32 @@
#include "GameT5.h"
#include "T5.h"
#include <algorithm>
using namespace T5;
GameT5 g_GameT5;
GameId GameT5::GetId()
GameId Game::GetId() const
{
return GameId::T5;
}
std::string GameT5::GetFullName()
const std::string& Game::GetFullName() const
{
return "Call Of Duty: Black Ops";
static std::string fullName = "Call Of Duty: Black Ops";
return fullName;
}
std::string GameT5::GetShortName()
const std::string& Game::GetShortName() const
{
return "T5";
static std::string shortName = "T5";
return shortName;
}
void GameT5::AddZone(Zone* zone)
void Game::AddZone(Zone* zone)
{
m_zones.push_back(zone);
}
void GameT5::RemoveZone(Zone* zone)
void Game::RemoveZone(Zone* zone)
{
const auto foundEntry = std::ranges::find(m_zones, zone);
@ -36,12 +34,12 @@ void GameT5::RemoveZone(Zone* zone)
m_zones.erase(foundEntry);
}
std::vector<Zone*> GameT5::GetZones()
const std::vector<Zone*>& Game::GetZones() const
{
return m_zones;
}
const std::vector<GameLanguagePrefix>& GameT5::GetLanguagePrefixes()
const std::vector<GameLanguagePrefix>& Game::GetLanguagePrefixes() const
{
static std::vector<GameLanguagePrefix> prefixes{
{GameLanguage::LANGUAGE_ENGLISH, "en_"},

View File

@ -1,19 +1,20 @@
#pragma once
#include "Game/IGame.h"
class GameT5 final : public IGame
namespace T5
{
class Game final : public IGame
{
public:
GameId GetId() override;
std::string GetFullName() override;
std::string GetShortName() override;
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
void AddZone(Zone* zone) override;
void RemoveZone(Zone* zone) override;
std::vector<Zone*> GetZones() override;
const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() override;
[[nodiscard]] const std::vector<Zone*>& GetZones() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
private:
std::vector<Zone*> m_zones;
};
extern GameT5 g_GameT5;
} // namespace T5

View File

@ -1,34 +1,32 @@
#include "GameT6.h"
#include "T6.h"
#include <algorithm>
using namespace T6;
GameT6 g_GameT6;
GameId GameT6::GetId()
GameId Game::GetId() const
{
return GameId::T6;
}
std::string GameT6::GetFullName()
const std::string& Game::GetFullName() const
{
return "Call Of Duty: Black Ops II";
static std::string fullName = "Call Of Duty: Black Ops II";
return fullName;
}
std::string GameT6::GetShortName()
const std::string& Game::GetShortName() const
{
return "T6";
static std::string shortName = "T6";
return shortName;
}
void GameT6::AddZone(Zone* zone)
void Game::AddZone(Zone* zone)
{
m_zones.push_back(zone);
}
void GameT6::RemoveZone(Zone* zone)
void Game::RemoveZone(Zone* zone)
{
const auto foundEntry = std::ranges::find(m_zones, zone);
@ -36,12 +34,12 @@ void GameT6::RemoveZone(Zone* zone)
m_zones.erase(foundEntry);
}
std::vector<Zone*> GameT6::GetZones()
const std::vector<Zone*>& Game::GetZones() const
{
return m_zones;
}
const std::vector<GameLanguagePrefix>& GameT6::GetLanguagePrefixes()
const std::vector<GameLanguagePrefix>& Game::GetLanguagePrefixes() const
{
static std::vector<GameLanguagePrefix> prefixes{
{GameLanguage::LANGUAGE_ENGLISH, "en_"},

View File

@ -1,19 +1,20 @@
#pragma once
#include "Game/IGame.h"
class GameT6 final : public IGame
namespace T6
{
class Game final : public IGame
{
public:
GameId GetId() override;
std::string GetFullName() override;
std::string GetShortName() override;
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
void AddZone(Zone* zone) override;
void RemoveZone(Zone* zone) override;
std::vector<Zone*> GetZones() override;
const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() override;
[[nodiscard]] const std::vector<Zone*>& GetZones() const override;
[[nodiscard]] const std::vector<GameLanguagePrefix>& GetLanguagePrefixes() const override;
private:
std::vector<Zone*> m_zones;
};
extern GameT6 g_GameT6;
} // namespace T6

View File

@ -40,7 +40,7 @@ GameId ZoneCreator::GetGameId() const
std::unique_ptr<Zone> ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& context) const
{
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, &g_GameIW3);
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, IGame::GetGameById(GameId::IW3));
CreateZoneAssetPools(zone.get());
for (const auto& assetEntry : context.m_definition->m_assets)

View File

@ -39,7 +39,7 @@ GameId ZoneCreator::GetGameId() const
std::unique_ptr<Zone> ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& context) const
{
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, &g_GameIW4);
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, IGame::GetGameById(GameId::IW4));
CreateZoneAssetPools(zone.get());
for (const auto& assetEntry : context.m_definition->m_assets)

View File

@ -39,7 +39,7 @@ GameId ZoneCreator::GetGameId() const
std::unique_ptr<Zone> ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& context) const
{
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, &g_GameIW5);
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, IGame::GetGameById(GameId::IW5));
CreateZoneAssetPools(zone.get());
for (const auto& assetEntry : context.m_definition->m_assets)

View File

@ -40,7 +40,7 @@ GameId ZoneCreator::GetGameId() const
std::unique_ptr<Zone> ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& context) const
{
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, &g_GameT5);
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, IGame::GetGameById(GameId::T5));
CreateZoneAssetPools(zone.get());
for (const auto& assetEntry : context.m_definition->m_assets)

View File

@ -91,7 +91,7 @@ GameId ZoneCreator::GetGameId() const
std::unique_ptr<Zone> ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& context) const
{
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, &g_GameT6);
auto zone = std::make_unique<Zone>(context.m_definition->m_name, 0, IGame::GetGameById(GameId::T6));
CreateZoneAssetPools(zone.get());
for (const auto& assetEntry : context.m_definition->m_assets)

View File

@ -288,7 +288,7 @@ namespace T6
std::cout << std::format("Loading common ipaks for zone \"{}\"\n", zone.m_name);
LoadIPakForZone(searchPath, "base", zone);
const auto languagePrefixes = g_GameT6.GetLanguagePrefixes();
const auto& languagePrefixes = IGame::GetGameById(GameId::T6)->GetLanguagePrefixes();
for (const auto& languagePrefix : languagePrefixes)
LoadIPakForZone(searchPath, std::format("{}base", languagePrefix.m_prefix), zone);

View File

@ -199,7 +199,7 @@ namespace IW5
void MaterialConstantZoneState::ExtractNamesFromZoneInternal()
{
for (const auto* zone : g_GameIW5.GetZones())
for (const auto* zone : IGame::GetGameById(GameId::IW5)->GetZones())
{
const auto* iw5AssetPools = dynamic_cast<const GameAssetPoolIW5*>(zone->m_pools.get());
if (!iw5AssetPools)

View File

@ -201,7 +201,7 @@ namespace
public:
void Initialize()
{
for (const auto& zone : g_GameT6.GetZones())
for (const auto& zone : IGame::GetGameById(GameId::T6)->GetZones())
{
auto& sndBankPool = *dynamic_cast<GameAssetPoolT6*>(zone->m_pools.get())->m_sound_bank;
for (auto* entry : sndBankPool)

View File

@ -473,7 +473,7 @@ namespace T6
void MaterialConstantZoneState::ExtractNamesFromZoneInternal()
{
for (const auto* zone : g_GameT6.GetZones())
for (const auto* zone : IGame::GetGameById(GameId::T6)->GetZones())
{
const auto* t6AssetPools = dynamic_cast<const GameAssetPoolT6*>(zone->m_pools.get());
if (!t6AssetPools)

View File

@ -47,7 +47,7 @@ namespace
std::unique_ptr<ZoneWriter> ZoneWriterFactory::CreateWriter(Zone* zone) const
{
std::unique_ptr<ZoneWriter> writer;
auto writer = std::make_unique<ZoneWriter>();
SetupBlocks(*writer);

View File

@ -20,7 +20,7 @@ namespace
"test,data,lol\n"
"lorem,ipsum");
Zone zone("MockZone", 0, &g_GameIW3);
Zone zone("MockZone", 0, IGame::GetGameById(GameId::IW3));
MockAssetLoadingManager assetLoadingManager(zone, searchPath);
AssetLoaderStringTable assetLoader;

View File

@ -21,7 +21,7 @@ namespace
"test,data,lol\n"
"lorem,ipsum");
Zone zone("MockZone", 0, &g_GameIW4);
Zone zone("MockZone", 0, IGame::GetGameById(GameId::IW4));
MockAssetLoadingManager assetLoadingManager(zone, searchPath);
AssetLoaderStringTable assetLoader;

View File

@ -28,7 +28,7 @@ namespace test::game::iw4::menu::parsing::it
public:
MenuParsingItHelper()
: m_zone("MockZone", 0, &g_GameIW4),
: m_zone("MockZone", 0, IGame::GetGameById(GameId::IW4)),
m_manager(m_zone, m_search_path)
{
}

View File

@ -20,7 +20,7 @@ namespace
"test,data,lol\n"
"lorem,ipsum");
Zone zone("MockZone", 0, &g_GameIW5);
Zone zone("MockZone", 0, IGame::GetGameById(GameId::IW5));
MockAssetLoadingManager assetLoadingManager(zone, searchPath);
AssetLoaderStringTable assetLoader;

View File

@ -20,7 +20,7 @@ namespace
"test,data,lol\n"
"lorem,ipsum");
Zone zone("MockZone", 0, &g_GameT5);
Zone zone("MockZone", 0, IGame::GetGameById(GameId::T5));
MockAssetLoadingManager assetLoadingManager(zone, searchPath);
AssetLoaderStringTable assetLoader;

View File

@ -20,7 +20,7 @@ namespace
"test,data,lol\n"
"lorem,ipsum");
Zone zone("MockZone", 0, &g_GameT6);
Zone zone("MockZone", 0, IGame::GetGameById(GameId::T6));
MockAssetLoadingManager assetLoadingManager(zone, searchPath);
AssetLoaderStringTable assetLoader;