aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic2
diff options
context:
space:
mode:
author Hop311 <hop3114@gmail.com>2023-03-30 23:50:50 +0200
committer Spartan322 <Megacake1234@gmail.com>2023-04-14 17:16:02 +0200
commitc0d76b78d3762e6eec3ed1c62618be84c5b7559b (patch)
treeacfcbeedd5a47136acdf883e791a297200b7d1b8 /extension/src/openvic2
parent1f04a7827ae377372cb491ff0257a47d0d4c2967 (diff)
Add terrain map
With Directional movement using WASD With Directional movement using arrow keys With Click-Drag movement using middle mouse button With Province identifiers With Province shape loading With Province rendering With Province selection With Province overview panel With Color lookup texture
Diffstat (limited to 'extension/src/openvic2')
-rw-r--r--extension/src/openvic2/Map.cpp89
-rw-r--r--extension/src/openvic2/Map.hpp45
2 files changed, 134 insertions, 0 deletions
diff --git a/extension/src/openvic2/Map.cpp b/extension/src/openvic2/Map.cpp
new file mode 100644
index 0000000..d980b88
--- /dev/null
+++ b/extension/src/openvic2/Map.cpp
@@ -0,0 +1,89 @@
+#include "Map.hpp"
+
+#include <cassert>
+#include <sstream>
+#include <iomanip>
+
+using namespace OpenVic2;
+
+Province::Province(index_t new_index, std::string const& new_identifier, colour_t new_colour) :
+ index(new_index), identifier(new_identifier), colour(new_colour) {
+ assert(index != NULL_INDEX);
+ assert(!identifier.empty());
+ assert(colour != NULL_COLOUR);
+}
+
+std::string Province::colour_to_hex_string(colour_t colour) {
+ std::ostringstream stream;
+ stream << std::hex << std::setfill('0') << std::setw(6) << colour;
+ return stream.str();
+}
+
+Province::index_t Province::get_index() const {
+ return index;
+}
+
+std::string const& Province::get_identifier() const {
+ return identifier;
+}
+
+Province::colour_t Province::get_colour() const {
+ return colour;
+}
+
+std::string Province::to_string() const {
+ return "(#" + std::to_string(index) + ", " + identifier + ", 0x" + colour_to_hex_string(colour) + ")";
+}
+
+bool Map::add_province(std::string const& identifier, Province::colour_t colour, std::string& error_message) {
+ if (provinces_locked) {
+ error_message = "The map's province list has already been locked!";
+ return false;
+ }
+ if (provinces.size() >= Province::MAX_INDEX) {
+ error_message = "The map's province list is full - there can be at most " + std::to_string(Province::MAX_INDEX) + " provinces";
+ return false;
+ }
+ if (colour == Province::NULL_COLOUR || colour > Province::MAX_COLOUR) {
+ error_message = "Invalid province colour: " + Province::colour_to_hex_string(colour);
+ return false;
+ }
+ Province new_province{ static_cast<Province::index_t>(provinces.size() + 1), identifier, colour };
+ for (Province const& province : provinces) {
+ if (province.identifier == identifier) {
+ error_message = "Duplicate province identifiers: " + province.to_string() + " and " + new_province.to_string();
+ return false;
+ }
+ if (province.colour == colour) {
+ error_message = "Duplicate province colours: " + province.to_string() + " and " + new_province.to_string();
+ return false;
+ }
+ }
+ provinces.push_back(new_province);
+ error_message = "Added province: " + new_province.to_string();
+ return true;
+}
+
+void Map::lock_provinces() {
+ provinces_locked = true;
+}
+
+size_t Map::get_province_count() const {
+ return provinces.size();
+}
+
+Province* Map::get_province_by_index(Province::index_t index) {
+ return index != Province::NULL_INDEX && index <= provinces.size() ? &provinces[index - 1] : nullptr;
+}
+
+Province* Map::get_province_by_identifier(std::string const& identifier) {
+ for (Province& province : provinces)
+ if (province.identifier == identifier) return &province;
+ return nullptr;
+}
+
+Province* Map::get_province_by_colour(Province::colour_t colour) {
+ for (Province& province : provinces)
+ if (province.colour == colour) return &province;
+ return nullptr;
+}
diff --git a/extension/src/openvic2/Map.hpp b/extension/src/openvic2/Map.hpp
new file mode 100644
index 0000000..365d78b
--- /dev/null
+++ b/extension/src/openvic2/Map.hpp
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <string>
+#include <cstdint>
+#include <vector>
+
+namespace OpenVic2 {
+
+ struct Province {
+ using colour_t = uint32_t;
+ using index_t = uint16_t;
+ friend struct Map;
+ static const colour_t NULL_COLOUR = 0, MAX_COLOUR = 0xFFFFFF;
+ static const index_t NULL_INDEX = 0, MAX_INDEX = 0xFFFF;
+ private:
+ index_t index;
+ std::string identifier;
+ colour_t colour;
+
+ Province(index_t index, std::string const& identifier, colour_t colour);
+ public:
+ static std::string colour_to_hex_string(colour_t colour);
+
+ index_t get_index() const;
+ std::string const& get_identifier() const;
+ colour_t get_colour() const;
+ std::string to_string() const;
+ };
+
+ struct Map {
+ private:
+ std::vector<Province> provinces;
+ bool provinces_locked = false;
+
+ public:
+ bool add_province(std::string const& identifier, Province::colour_t colour, std::string& error_message);
+ void lock_provinces();
+ size_t get_province_count() const;
+
+ Province* get_province_by_index(Province::index_t index);
+ Province* get_province_by_identifier(std::string const& identifier);
+ Province* get_province_by_colour(Province::colour_t colour);
+ };
+
+}