/*
Copyright (C) 2012 Sebastian Herbord. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Mod Organizer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mod Organizer. If not, see .
*/
#ifndef GAMEINFO_H
#define GAMEINFO_H
#include
#include
#include
#define WIN32_LEAN_AND_MEAN
#include
namespace MOShared {
enum CloseMOStyle {
DEFAULT_CLOSE,
DEFAULT_STAY,
NEVER_CLOSE
};
struct ExecutableInfo {
ExecutableInfo(const std::wstring &aTitle, const std::wstring &aBinary,
const std::wstring &aArguments, const std::wstring &aWorkingDirectory, CloseMOStyle aCloseMO)
: title(aTitle), binary(aBinary), arguments(aArguments), workingDirectory(aWorkingDirectory),
closeMO(aCloseMO), steamAppID(L"") {}
ExecutableInfo(const std::wstring &aTitle, const std::wstring &aBinary,
const std::wstring &aArguments, const std::wstring &aWorkingDirectory,
CloseMOStyle aCloseMO, const std::wstring &aSteamAppID)
: title(aTitle), binary(aBinary), arguments(aArguments), workingDirectory(aWorkingDirectory),
closeMO(aCloseMO), steamAppID(aSteamAppID) {}
std::wstring title;
std::wstring binary;
std::wstring arguments;
std::wstring workingDirectory;
CloseMOStyle closeMO;
std::wstring steamAppID;
};
/**
Class to manage information that depends on the used game type. The intention is to keep
as much of the rest of omo is game-agnostic. It is mostly concerned with figuring out the
correct paths, filenames and data types.
*/
class GameInfo
{
public:
enum Type {
TYPE_OBLIVION,
TYPE_FALLOUT3,
TYPE_FALLOUTNV,
TYPE_SKYRIM
};
enum LoadOrderMechanism {
TYPE_FILETIME,
TYPE_PLUGINSTXT
};
public:
virtual ~GameInfo() {}
std::wstring getOrganizerDirectory() { return m_OrganizerDirectory; }
virtual std::wstring getRegPath() = 0;
virtual std::wstring getBinaryName() = 0;
virtual unsigned long getBSAVersion() = 0;
virtual GameInfo::Type getType() = 0;
virtual std::wstring getGameName() const = 0;
virtual std::wstring getGameShortName() const = 0;
// full path to this games "My Games"-directory
virtual std::wstring getDocumentsDir() = 0;
virtual std::wstring getSaveGameDir() = 0;
/// determine the load order mechanism used by this game. this may throw an
/// exception if the mechanism can't be determined
virtual LoadOrderMechanism getLoadOrderMechanism() const { return TYPE_FILETIME; }
virtual std::wstring getGameDirectory() const;
// get absolute path to the directory where omo stores its mods
virtual std::wstring getModsDir() const;
// get absolute path to the directory where omo stores its profiles
virtual std::wstring getProfilesDir() const;
virtual std::wstring getIniFilename() const;
virtual std::wstring getDownloadDir() const;
virtual std::wstring getCacheDir() const;
virtual std::wstring getOverwriteDir() const;
virtual std::wstring getLogDir() const;
virtual std::wstring getLootDir() const;
virtual std::wstring getTutorialDir() const;
virtual bool requiresBSAInvalidation() const { return true; }
virtual bool requiresSteam() const;
virtual std::wstring getInvalidationBSA() = 0;
virtual bool isInvalidationBSA(const std::wstring &bsaName) = 0;
// the key in the game's ini-file that defines the list of bsas to load
virtual std::wstring archiveListKey() = 0;
virtual std::vector getPrimaryPlugins() = 0;
virtual std::vector getVanillaBSAs() = 0;
// get a list of file extensions for additional files belonging to a save game
virtual std::vector getSavegameAttachmentExtensions() = 0;
// get a set of esp/esm files that are part of known dlcs
virtual std::vector getDLCPlugins() = 0;
// file name of this games ini file(s)
virtual std::vector getIniFileNames() = 0;
virtual std::wstring getSaveGameExtension() = 0;
virtual std::wstring getReferenceDataFile() = 0;
virtual std::wstring getOMODExt() = 0;
virtual std::vector getSteamVariants() const;
virtual std::wstring getSteamAPPId(int variant = 0) const = 0;
virtual std::wstring getSEName() = 0;
virtual std::wstring getNexusPage(bool nmmScheme = true) = 0;
virtual std::wstring getNexusInfoUrl() = 0;
virtual int getNexusModID() = 0;
virtual int getNexusGameID() = 0;
// clone relevant files to the specified directory
virtual void createProfile(const std::wstring &directory, bool useDefaults) = 0;
virtual void repairProfile(const std::wstring &directory) = 0;
virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) = 0;
// get a list of executables (game binary and known-to-work 3rd party tools). All of these are relative to
// the game directory. the boolean says whether omo should be closed when the executable is started
virtual std::vector getExecutables() = 0;
public:
// initialise with the path to the omo directory (needs to be where hook.dll is stored). This
// needs to be called before the instance can be retrieved
static bool init(const std::wstring &omoDirectory, const std::wstring &gamePath = L"");
static GameInfo& instance();
protected:
GameInfo(const std::wstring &omoDirectory, const std::wstring &gameDirectory);
std::wstring getLocalAppFolder() const;
const std::wstring &getMyGamesDirectory() const { return m_MyGamesDirectory; }
void identifyMyGamesDirectory(const std::wstring &file);
private:
static bool identifyGame(const std::wstring &omoDirectory, const std::wstring &searchPath);
std::wstring getSpecialPath(LPCWSTR name) const;
static void cleanup();
private:
static GameInfo *s_Instance;
std::wstring m_MyGamesDirectory;
std::wstring m_GameDirectory;
std::wstring m_OrganizerDirectory;
};
} // namespace MOShared
#endif // GAMEINFO_H