OpenRCT2/src/openrct2/PlatformEnvironment.cpp

253 lines
8.6 KiB
C++
Raw Normal View History

/*****************************************************************************
2020-07-21 15:04:34 +02:00
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
2018-06-22 23:25:16 +02:00
#include "PlatformEnvironment.h"
#include "OpenRCT2.h"
2017-06-11 13:53:37 +02:00
#include "config/Config.h"
2016-12-07 17:28:07 +01:00
#include "core/Path.hpp"
#include "core/String.hpp"
#include "platform/Platform2.h"
2018-06-22 23:25:16 +02:00
#include "platform/platform.h"
2017-06-11 13:53:37 +02:00
using namespace OpenRCT2;
2017-06-06 18:02:45 +02:00
class PlatformEnvironment final : public IPlatformEnvironment
{
2016-12-07 17:28:07 +01:00
private:
2016-12-12 03:16:08 +01:00
std::string _basePath[DIRBASE_COUNT];
2016-12-07 17:28:07 +01:00
public:
2018-01-04 02:12:34 +01:00
explicit PlatformEnvironment(DIRBASE_VALUES basePaths)
{
for (size_t i = 0; i < DIRBASE_COUNT; i++)
2016-12-07 17:28:07 +01:00
{
_basePath[i] = basePaths[i];
}
}
2017-06-06 18:02:45 +02:00
std::string GetDirectoryPath(DIRBASE base) const override
{
return _basePath[static_cast<size_t>(base)];
2017-06-06 18:02:45 +02:00
}
2016-12-07 17:28:07 +01:00
std::string GetDirectoryPath(DIRBASE base, DIRID did) const override
{
2017-06-06 18:02:45 +02:00
auto basePath = GetDirectoryPath(base);
2018-06-22 23:25:16 +02:00
const utf8* directoryName;
switch (base)
{
default:
case DIRBASE::RCT1:
case DIRBASE::RCT2:
directoryName = DirectoryNamesRCT2[static_cast<size_t>(did)];
2018-06-22 23:25:16 +02:00
break;
case DIRBASE::OPENRCT2:
case DIRBASE::USER:
case DIRBASE::CONFIG:
directoryName = DirectoryNamesOpenRCT2[static_cast<size_t>(did)];
2018-06-22 23:25:16 +02:00
break;
2016-12-07 17:28:07 +01:00
}
2017-06-06 18:02:45 +02:00
return Path::Combine(basePath, directoryName);
}
2016-12-07 17:28:07 +01:00
std::string GetFilePath(PATHID pathid) const override
{
auto dirbase = GetDefaultBaseDirectory(pathid);
auto basePath = GetDirectoryPath(dirbase);
auto fileName = FileNames[static_cast<size_t>(pathid)];
return Path::Combine(basePath, fileName);
}
2016-12-07 17:28:07 +01:00
2018-06-22 23:25:16 +02:00
void SetBasePath(DIRBASE base, const std::string& path) override
{
_basePath[static_cast<size_t>(base)] = path;
}
2016-12-07 17:28:07 +01:00
private:
2018-06-22 23:25:16 +02:00
static const char* DirectoryNamesRCT2[];
static const char* DirectoryNamesOpenRCT2[];
static const char* FileNames[];
static DIRBASE GetDefaultBaseDirectory(PATHID pathid)
{
switch (pathid)
{
2018-06-22 23:25:16 +02:00
case PATHID::CONFIG:
case PATHID::CONFIG_SHORTCUTS_LEGACY:
case PATHID::CONFIG_SHORTCUTS:
2018-06-22 23:25:16 +02:00
return DIRBASE::CONFIG;
case PATHID::CACHE_OBJECTS:
case PATHID::CACHE_TRACKS:
case PATHID::CACHE_SCENARIOS:
return DIRBASE::CACHE;
case PATHID::MP_DAT:
return DIRBASE::RCT1;
case PATHID::SCORES_RCT2:
return DIRBASE::RCT2;
case PATHID::CHANGELOG:
return DIRBASE::DOCUMENTATION;
case PATHID::NETWORK_GROUPS:
case PATHID::NETWORK_SERVERS:
case PATHID::NETWORK_USERS:
case PATHID::SCORES:
case PATHID::SCORES_LEGACY:
default:
return DIRBASE::USER;
}
}
2016-12-07 17:28:07 +01:00
};
std::unique_ptr<IPlatformEnvironment> OpenRCT2::CreatePlatformEnvironment(DIRBASE_VALUES basePaths)
2016-12-07 17:28:07 +01:00
{
return std::make_unique<PlatformEnvironment>(basePaths);
2016-12-07 17:28:07 +01:00
}
static std::string GetOpenRCT2DirectoryName()
{
#if defined(__ANDROID__)
return "openrct2-user";
#else
return "OpenRCT2";
#endif
}
std::unique_ptr<IPlatformEnvironment> OpenRCT2::CreatePlatformEnvironment()
2017-06-11 13:53:37 +02:00
{
auto subDirectory = GetOpenRCT2DirectoryName();
2017-06-11 13:53:37 +02:00
// Set default paths
std::string basePaths[DIRBASE_COUNT];
basePaths[static_cast<size_t>(DIRBASE::OPENRCT2)] = Platform::GetInstallPath();
basePaths[static_cast<size_t>(DIRBASE::USER)] = Path::Combine(
Platform::GetFolderPath(SPECIAL_FOLDER::USER_DATA), subDirectory);
basePaths[static_cast<size_t>(DIRBASE::CONFIG)] = Path::Combine(
Platform::GetFolderPath(SPECIAL_FOLDER::USER_CONFIG), subDirectory);
basePaths[static_cast<size_t>(DIRBASE::CACHE)] = Path::Combine(
Platform::GetFolderPath(SPECIAL_FOLDER::USER_CACHE), subDirectory);
basePaths[static_cast<size_t>(DIRBASE::DOCUMENTATION)] = Platform::GetDocsPath();
// Override paths that have been specified via the command line
if (!String::IsNullOrEmpty(gCustomRCT1DataPath))
{
basePaths[static_cast<size_t>(DIRBASE::RCT1)] = gCustomRCT1DataPath;
}
if (!String::IsNullOrEmpty(gCustomRCT2DataPath))
{
basePaths[static_cast<size_t>(DIRBASE::RCT2)] = gCustomRCT2DataPath;
}
if (!String::IsNullOrEmpty(gCustomOpenRCT2DataPath))
{
basePaths[static_cast<size_t>(DIRBASE::OPENRCT2)] = gCustomOpenRCT2DataPath;
}
if (!String::IsNullOrEmpty(gCustomUserDataPath))
{
basePaths[static_cast<size_t>(DIRBASE::USER)] = gCustomUserDataPath;
basePaths[static_cast<size_t>(DIRBASE::CONFIG)] = gCustomUserDataPath;
basePaths[static_cast<size_t>(DIRBASE::CACHE)] = gCustomUserDataPath;
}
2017-06-11 13:53:37 +02:00
if (basePaths[static_cast<size_t>(DIRBASE::DOCUMENTATION)].empty())
2018-01-21 03:13:32 +01:00
{
basePaths[static_cast<size_t>(DIRBASE::DOCUMENTATION)] = basePaths[static_cast<size_t>(DIRBASE::OPENRCT2)];
2018-01-21 03:13:32 +01:00
}
auto env = OpenRCT2::CreatePlatformEnvironment(basePaths);
// Now load the config so we can get the RCT1 and RCT2 paths
auto configPath = env->GetFilePath(PATHID::CONFIG);
config_set_defaults();
if (!config_open(configPath.c_str()))
{
config_save(configPath.c_str());
}
if (String::IsNullOrEmpty(gCustomRCT1DataPath))
{
env->SetBasePath(DIRBASE::RCT1, String::ToStd(gConfigGeneral.rct1_path));
}
if (String::IsNullOrEmpty(gCustomRCT2DataPath))
{
env->SetBasePath(DIRBASE::RCT2, String::ToStd(gConfigGeneral.rct2_path));
}
2017-06-11 13:53:37 +02:00
// Log base paths
log_verbose("DIRBASE::RCT1 : %s", env->GetDirectoryPath(DIRBASE::RCT1).c_str());
log_verbose("DIRBASE::RCT2 : %s", env->GetDirectoryPath(DIRBASE::RCT2).c_str());
log_verbose("DIRBASE::OPENRCT2: %s", env->GetDirectoryPath(DIRBASE::OPENRCT2).c_str());
log_verbose("DIRBASE::USER : %s", env->GetDirectoryPath(DIRBASE::USER).c_str());
log_verbose("DIRBASE::CONFIG : %s", env->GetDirectoryPath(DIRBASE::CONFIG).c_str());
log_verbose("DIRBASE::CACHE : %s", env->GetDirectoryPath(DIRBASE::CACHE).c_str());
2017-06-11 13:53:37 +02:00
return env;
}
// clang-format off
2016-12-07 17:28:07 +01:00
const char * PlatformEnvironment::DirectoryNamesRCT2[] =
{
2016-12-08 12:42:21 +01:00
"Data", // DATA
"Landscapes", // LANDSCAPE
nullptr, // LANGUAGE
nullptr, // LOG_CHAT
nullptr, // LOG_SERVER
nullptr, // NETWORK_KEY
"ObjData", // OBJECT
2018-03-18 17:27:48 +01:00
nullptr, // PLUGIN
2016-12-08 12:42:21 +01:00
"Saved Games", // SAVE
"Scenarios", // SCENARIO
nullptr, // SCREENSHOT
nullptr, // SEQUENCE
nullptr, // SHADER
nullptr, // THEME
"Tracks", // TRACK
2016-12-07 17:28:07 +01:00
};
const char * PlatformEnvironment::DirectoryNamesOpenRCT2[] =
{
2016-12-08 12:42:21 +01:00
"data", // DATA
"landscape", // LANDSCAPE
"language", // LANGUAGE
"chatlogs", // LOG_CHAT
"serverlogs", // LOG_SERVER
"keys", // NETWORK_KEY
"object", // OBJECT
2018-03-18 17:27:48 +01:00
"plugin", // PLUGIN
2016-12-08 12:42:21 +01:00
"save", // SAVE
"scenario", // SCENARIO
"screenshot", // SCREENSHOT
"sequence", // SEQUENCE
"shaders", // SHADER
2016-12-08 12:42:21 +01:00
"themes", // THEME
"track", // TRACK
"heightmap", // HEIGHTMAP
"replay", // REPLAY
"desyncs", // DESYNCS
"crash", // CRASH
2016-12-07 17:28:07 +01:00
};
const char * PlatformEnvironment::FileNames[] =
{
2016-12-08 12:42:21 +01:00
"config.ini", // CONFIG
"hotkeys.dat", // CONFIG_SHORTCUTS_LEGACY
"shortcuts.json", // CONFIG_SHORTCUTS
2016-12-08 12:42:21 +01:00
"objects.idx", // CACHE_OBJECTS
"tracks.idx", // CACHE_TRACKS
"scenarios.idx", // CACHE_SCENARIOS
"Data" PATH_SEPARATOR "mp.dat", // MP_DAT
2016-12-08 12:42:21 +01:00
"groups.json", // NETWORK_GROUPS
"servers.cfg", // NETWORK_SERVERS
"users.json", // NETWORK_USERS
"highscores.dat", // SCORES
"scores.dat", // SCORES (LEGACY)
"Saved Games" PATH_SEPARATOR "scores.dat", // SCORES (RCT2)
2020-03-07 13:37:07 +01:00
"changelog.txt", // CHANGELOG
"plugin.store.json" // PLUGIN_STORE
};
// clang-format on