aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic2/Types.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/openvic2/Types.hpp')
-rw-r--r--extension/src/openvic2/Types.hpp57
1 files changed, 49 insertions, 8 deletions
diff --git a/extension/src/openvic2/Types.hpp b/extension/src/openvic2/Types.hpp
index 98e92ce..e4a0e2d 100644
--- a/extension/src/openvic2/Types.hpp
+++ b/extension/src/openvic2/Types.hpp
@@ -1,12 +1,32 @@
#pragma once
-#include <string>
#include <vector>
+#include <cstdint>
+#include <algorithm>
+#include <map>
-#include "openvic2/Logger.hpp"
+#include "Logger.hpp"
namespace OpenVic2 {
+ // Represents a 24-bit RGB integer OR a 32-bit ARGB integer
+ using colour_t = uint32_t;
+ /* When colour_t is used as an identifier, NULL_COLOUR is disallowed
+ * and should be reserved as an error value.
+ * When colour_t is used in a purely graphical context, NULL_COLOUR
+ * should be allowed.
+ */
+ static constexpr colour_t NULL_COLOUR = 0, MAX_COLOUR_RGB = 0xFFFFFF;
+ constexpr colour_t to_alpha_value(float a) {
+ return static_cast<colour_t>(std::clamp(a, 0.0f, 1.0f) * 255.0f) << 24;
+ }
+
+ using index_t = uint16_t;
+ static constexpr index_t NULL_INDEX = 0, MAX_INDEX = 0xFFFF;
+
+ // TODO: price_t must be changed to a fixed-point numeric type before multiplayer
+ using price_t = double;
using return_t = bool;
+
// This mirrors godot::Error, where `OK = 0` and `FAILED = 1`.
static constexpr return_t SUCCESS = false, FAILURE = true;
@@ -29,6 +49,24 @@ namespace OpenVic2 {
};
/*
+ * Base class for objects with associated colour information
+ */
+ class HasColour {
+ const colour_t colour;
+ protected:
+ HasColour(colour_t const new_colour);
+ public:
+ HasColour(HasColour const&) = delete;
+ HasColour(HasColour&&) = default;
+ HasColour& operator=(HasColour const&) = delete;
+ HasColour& operator=(HasColour&&) = delete;
+
+ colour_t get_colour() const;
+ std::string colour_to_hex_string() const;
+ static std::string colour_to_hex_string(colour_t const colour);
+ };
+
+ /*
* Template for a list of objects with unique string identifiers that can
* be locked to prevent any further additions. The template argument T is
* the type of object that the registry will store, and the second part ensures
@@ -36,9 +74,12 @@ namespace OpenVic2 {
*/
template<class T, typename std::enable_if<std::is_base_of<HasIdentifier, T>::value>::type* = nullptr>
class IdentifierRegistry {
+ using identifier_index_map_t = std::map<std::string, size_t>;
+
const std::string name;
std::vector<T> items;
bool locked = false;
+ identifier_index_map_t identifier_index_map;
public:
IdentifierRegistry(std::string const& new_name) : name(new_name) {}
return_t add_item(T&& item) {
@@ -51,6 +92,7 @@ namespace OpenVic2 {
Logger::error("Cannot add item to the ", name, " registry - an item with the identifier \"", item.get_identifier(), "\" already exists!");
return FAILURE;
}
+ identifier_index_map[item.get_identifier()] = items.size();
items.push_back(std::move(item));
return SUCCESS;
}
@@ -66,6 +108,7 @@ namespace OpenVic2 {
return locked;
}
void reset() {
+ identifier_index_map.clear();
items.clear();
locked = false;
}
@@ -73,15 +116,13 @@ namespace OpenVic2 {
return items.size();
}
T* get_item_by_identifier(std::string const& identifier) {
- if (!identifier.empty())
- for (T& item : items)
- if (item.get_identifier() == identifier) return &item;
+ const identifier_index_map_t::const_iterator it = identifier_index_map.find(identifier);
+ if (it != identifier_index_map.end()) return &items[it->second];
return nullptr;
}
T const* get_item_by_identifier(std::string const& identifier) const {
- if (!identifier.empty())
- for (T const& item : items)
- if (item.get_identifier() == identifier) return &item;
+ const identifier_index_map_t::const_iterator it = identifier_index_map.find(identifier);
+ if (it != identifier_index_map.end()) return &items[it->second];
return nullptr;
}
T* get_item_by_index(size_t index) {