mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
10ac78200b
Adds a decent way to customize the folders the project file expects the iso data and decompiler data to be in. When you run any version other than the default, for example Jak 1 PAL, it uses the `gameName` decompiler config to consume and output it's results. However the project file will assume `jak1` unless you hard-code it differently -- basically, it needs to be explicitly told just the decompiler is told what version to use. We now have a per-user REPL Config json file, so that can be used to override the default `jak1` behaviour. Fixes #1993
100 lines
3 KiB
C++
100 lines
3 KiB
C++
#include "config.h"
|
|
|
|
#include "common/versions.h"
|
|
|
|
#include "third-party/fmt/core.h"
|
|
|
|
namespace REPL {
|
|
void to_json(json& j, const Config& obj) {
|
|
j = json{
|
|
{"gameVersionFolder", obj.game_version_folder},
|
|
{"numConnectToTargetAttempts", obj.target_connect_attempts},
|
|
{"asmFileSearchDirs", obj.asm_file_search_dirs},
|
|
{"keybinds", obj.keybinds},
|
|
};
|
|
}
|
|
|
|
void from_json(const json& j, Config& obj) {
|
|
if (j.contains("gameVersionFolder")) {
|
|
j.at("gameVersionFolder").get_to(obj.game_version_folder);
|
|
}
|
|
if (j.contains("numConnectToTargetAttempts")) {
|
|
j.at("numConnectToTargetAttempts").get_to(obj.target_connect_attempts);
|
|
}
|
|
if (j.contains("asmFileSearchDirs")) {
|
|
j.at("asmFileSearchDirs").get_to(obj.asm_file_search_dirs);
|
|
}
|
|
if (j.contains("appendKeybinds")) {
|
|
j.at("appendKeybinds").get_to(obj.append_keybinds);
|
|
}
|
|
if (j.contains("keybinds")) {
|
|
std::vector<KeyBind> keybinds = j.at("keybinds");
|
|
if (!obj.append_keybinds) {
|
|
obj.keybinds = keybinds;
|
|
} else {
|
|
// append the keybinds
|
|
// - start with the provided ones
|
|
// - skip ones from the default set if they have the same key + modifier combination
|
|
for (const auto& default_bind : obj.keybinds) {
|
|
// check if it's a duplicate bind
|
|
bool duplicate = false;
|
|
for (const auto& new_bind : keybinds) {
|
|
if (new_bind.key == default_bind.key && new_bind.modifier == default_bind.modifier) {
|
|
duplicate = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!duplicate) {
|
|
keybinds.push_back(default_bind);
|
|
}
|
|
}
|
|
obj.keybinds = keybinds;
|
|
}
|
|
}
|
|
// if there is game specific configuration, override any values we just set
|
|
if (j.contains(version_to_game_name(obj.game_version))) {
|
|
from_json(j.at(version_to_game_name(obj.game_version)), obj);
|
|
}
|
|
}
|
|
|
|
std::string KeyBind::string() const {
|
|
switch (modifier) {
|
|
case KeyBind::Modifier::CTRL:
|
|
return fmt::format("CTRL-{}", key);
|
|
case KeyBind::Modifier::SHIFT:
|
|
return fmt::format("SHIFT-{}", key);
|
|
case KeyBind::Modifier::META:
|
|
return fmt::format("META-{}", key);
|
|
}
|
|
}
|
|
|
|
void to_json(json& j, const KeyBind& obj) {
|
|
j = json{{"description", obj.description}, {"command", obj.command}, {"key", obj.key}};
|
|
switch (obj.modifier) {
|
|
case KeyBind::Modifier::CTRL:
|
|
j["modifier"] = "ctrl";
|
|
break;
|
|
case KeyBind::Modifier::SHIFT:
|
|
j["modifier"] = "shift";
|
|
break;
|
|
case KeyBind::Modifier::META:
|
|
j["modifier"] = "meta";
|
|
break;
|
|
}
|
|
}
|
|
|
|
void from_json(const json& j, KeyBind& obj) {
|
|
j.at("description").get_to(obj.description);
|
|
j.at("command").get_to(obj.command);
|
|
j.at("key").get_to(obj.key);
|
|
auto modString = j.at("modifier").get<std::string>();
|
|
if (modString == "ctrl") {
|
|
obj.modifier = KeyBind::Modifier::CTRL;
|
|
} else if (modString == "shift") {
|
|
obj.modifier = KeyBind::Modifier::SHIFT;
|
|
} else if (modString == "meta") {
|
|
obj.modifier = KeyBind::Modifier::META;
|
|
}
|
|
}
|
|
} // namespace REPL
|