diff options
Diffstat (limited to 'extension/src')
-rw-r--r-- | extension/src/openvic2/Good.cpp | 19 | ||||
-rw-r--r-- | extension/src/openvic2/Good.hpp | 25 | ||||
-rw-r--r-- | extension/src/openvic2/LoadGoods.cpp | 88 | ||||
-rw-r--r-- | extension/src/openvic2/LoadGoods.hpp | 15 |
4 files changed, 147 insertions, 0 deletions
diff --git a/extension/src/openvic2/Good.cpp b/extension/src/openvic2/Good.cpp new file mode 100644 index 0000000..ecd2bfb --- /dev/null +++ b/extension/src/openvic2/Good.cpp @@ -0,0 +1,19 @@ +#include "Good.hpp" + +using namespace OpenVic2;; + +Good::Good() = default; + +Good::Good(const godot::String& identifier, const godot::String& category, price_t cost, const godot::String& colour, + bool isAvailable, bool isTradable, bool isMoney, bool hasOverseasPenalty) { + this->identifier = identifier; + this->category = category; + this->cost = cost; + this->colour = colour; + this->isAvailableAtStart = isAvailable; + this->isTradable = isTradable; + this->isMoney = isMoney; + this->hasOverseasPenalty = hasOverseasPenalty; +} + +Good::~Good() = default;
\ No newline at end of file diff --git a/extension/src/openvic2/Good.hpp b/extension/src/openvic2/Good.hpp new file mode 100644 index 0000000..dd2e8a8 --- /dev/null +++ b/extension/src/openvic2/Good.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include <string> +#include <godot_cpp/variant/string.hpp> + +namespace OpenVic2 { + class Good { + public: + using price_t = float; + + godot::String identifier; + godot::String category; + price_t cost; + godot::String colour; + bool isAvailableAtStart; + bool isTradable; + bool isMoney; + bool hasOverseasPenalty; + + Good(); + Good(const godot::String& identifier, const godot::String& category, price_t cost, const godot::String& colour, + bool isAvailable, bool isTradable, bool isMoney, bool hasOverseasPenalty); + ~Good(); + }; +}
\ No newline at end of file diff --git a/extension/src/openvic2/LoadGoods.cpp b/extension/src/openvic2/LoadGoods.cpp new file mode 100644 index 0000000..12d8d0d --- /dev/null +++ b/extension/src/openvic2/LoadGoods.cpp @@ -0,0 +1,88 @@ +#include "LoadGoods.hpp" + +#include <cstdint> +#include <godot_cpp/variant/utility_functions.hpp> +#include <godot_cpp/classes/file_access.hpp> +#include <godot_cpp/classes/json.hpp> + +using namespace OpenVic2; +using namespace godot; + +#define JSON_PROPERTY_NAME(x) godot::StringName(x) + +std::vector<Good> LoadGoods::load_goods_from_disk(godot::String const& file_path) { + std::vector<Good> goods; + Ref<FileAccess> file = FileAccess::open(file_path, FileAccess::ModeFlags::READ); + Error err = FileAccess::get_open_error(); + if (err != OK || file.is_null()) { + UtilityFunctions::push_error("Failed to open good configuration file: ", file_path); + return std::vector<Good>(); + } + godot::String file_content = file->get_as_text(); + JSON parsed_goods; + err = parsed_goods.parse(file_content); + if (err != OK) { + UtilityFunctions::push_error("Failed to parse goods.json"); + return std::vector<Good>(); + } + Variant v_goods = parsed_goods.get_data().get("goods", nullptr); + if (v_goods.get_type() != Variant::ARRAY) { + UtilityFunctions::push_error("Failed to parse goods.json: Top level property is not an array"); + return std::vector<Good>(); + } + godot::Array v_goods_array = (godot::Array)v_goods; + int32_t count = v_goods_array.size(); + goods.resize(count); + for (size_t i = 0; i < count; i++) { + if(!extract_property_from_json(v_goods_array[i], goods, i)) { + return std::vector<Good>(); + } + } + return goods; +} + +bool LoadGoods::extract_property_from_json(godot::Variant const& variant, std::vector<Good>& goods, int32_t index) { + bool valid; + String id = variant.get_named(JSON_PROPERTY_NAME("id"), valid); + if(!valid) { + UtilityFunctions::push_error("Could not extract property id of type string from goods.json"); + return false; + } + String category = variant.get_named(JSON_PROPERTY_NAME("category"), valid); + if(!valid) { + UtilityFunctions::push_error("Could not extract property category of type string from goods.json"); + return false; + } + float cost = static_cast<float>(variant.get_named(JSON_PROPERTY_NAME("cost"), valid)); + if(!valid) { + UtilityFunctions::push_error("Could not extract property cost of type float from goods.json"); + return false; + } + String colour = variant.get_named(JSON_PROPERTY_NAME("colour"), valid); + if(!valid) { + UtilityFunctions::push_error("Could not extract property colour of type string from goods.json"); + return false; + } + bool isAvailableAtStart = static_cast<bool>(variant.get_named(JSON_PROPERTY_NAME("isAvailableAtStart"), valid)); + if(!valid) { + UtilityFunctions::push_error("Could not extract property isAvailableAtStart of type bool from goods.json"); + return false; + } + bool isTradable = static_cast<bool>(variant.get_named(JSON_PROPERTY_NAME("isTradeable"), valid)); + if(!valid) { + UtilityFunctions::push_error("Could not extract property isTradable of type bool from goods.json"); + return false; + } + bool isMoney = static_cast<bool>(variant.get_named(JSON_PROPERTY_NAME("isMoney"), valid)); + if(!valid) { + UtilityFunctions::push_error("Could not extract property isMoney of type bool from goods.json"); + return false; + } + bool hasOverseasPenalty = static_cast<bool>(variant.get_named(JSON_PROPERTY_NAME("hasOverseasPenalty"), valid)); + if(!valid) { + UtilityFunctions::push_error("Could not extract property hasOverseaPenalty of type bool from goods.json"); + return false; + } + goods.at(index) = Good(id, category, cost, colour, isAvailableAtStart, isTradable, isMoney, hasOverseasPenalty); + return true; +}
\ No newline at end of file diff --git a/extension/src/openvic2/LoadGoods.hpp b/extension/src/openvic2/LoadGoods.hpp new file mode 100644 index 0000000..38b8c7b --- /dev/null +++ b/extension/src/openvic2/LoadGoods.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "Good.hpp" + +#include <vector> +#include <godot_cpp/classes/object.hpp> + +namespace OpenVic2 { + class LoadGoods { + private: + static bool extract_property_from_json(godot::Variant const& variant, std::vector<Good>& goods, int32_t index); + + public: + static std::vector<Good> load_goods_from_disk(godot::String const& file_path); + }; +}
\ No newline at end of file |