63 lines
2.8 KiB
C++
63 lines
2.8 KiB
C++
#include "BuildMoves.hpp"
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include "../../extern/json.hpp"
|
|
using json = nlohmann::json;
|
|
|
|
#define GET(o, objectKey, key) \
|
|
auto _##objectKey = o[#objectKey]; \
|
|
if (_##objectKey.is_null()) { \
|
|
std::cout << "Failed to retrieve key '" << #objectKey << "' for object with value '" << key << "' in file '" \
|
|
<< path << "'\n"; \
|
|
return nullptr; \
|
|
}
|
|
|
|
static PkmnLib::Library::MoveCategory ParseCategory(const std::string& input) {
|
|
if (input == "physical")
|
|
return PkmnLib::Library::MoveCategory::Physical;
|
|
else if (input == "special")
|
|
return PkmnLib::Library::MoveCategory::Special;
|
|
else if (input == "status")
|
|
return PkmnLib::Library::MoveCategory::Status;
|
|
std::cout << "Invalid move category '" << input << ".\n";
|
|
return static_cast<PkmnLib::Library::MoveCategory>(255);
|
|
}
|
|
|
|
PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path,
|
|
const CreatureLib::Library::TypeLibrary* types) {
|
|
std::ifstream fileStream(path.c_str());
|
|
if (fileStream.fail()) {
|
|
std::cout << "Failed to load Move data file at '" << path << "'\n";
|
|
return nullptr;
|
|
}
|
|
auto lib = new PkmnLib::Library::MoveLibrary();
|
|
json j;
|
|
fileStream >> j;
|
|
for (auto i : j.items()) {
|
|
auto val = i.value();
|
|
GET(val, name, i);
|
|
GET(val, type, i);
|
|
GET(val, power, i);
|
|
GET(val, pp, i);
|
|
GET(val, accuracy, i);
|
|
GET(val, priority, i);
|
|
GET(val, target, i);
|
|
GET(val, category, i);
|
|
GET(val, flags, i);
|
|
if (_pp.get<uint8_t>() == 0)
|
|
continue;
|
|
auto type = types->GetTypeId(_type.get<std::string>());
|
|
auto category = ParseCategory(_category.get<std::string>());
|
|
if (static_cast<int>(category) == 255)
|
|
return nullptr;
|
|
auto move = new PkmnLib::Library::MoveData(_name.get<std::string>(), type, category, _power.get<uint8_t>(),
|
|
_accuracy.get<uint8_t>(), _pp.get<uint8_t>(),
|
|
CreatureLib::Library::AttackTarget::Any, _priority.get<int8_t>(),
|
|
_flags.get<std::unordered_set<std::string>>());
|
|
|
|
lib->LoadAttack(move->GetName(), move);
|
|
}
|
|
|
|
return lib;
|
|
}
|