Conquer Space 0.0.0
A space themed grand strategy game set in the near future, with realistic orbital mechanics, and an emphasis on economics and politics.
universe.h
Go to the documentation of this file.
1/* Conquer Space
2 * Copyright (C) 2021-2025 Conquer Space
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#pragma once
18
19#include <fmt/format.h>
20
21#include <map>
22#include <memory>
23#include <ranges>
24#include <string>
25#include <vector>
26
27#include <entt/entt.hpp>
28
34
35namespace cqsp::core {
36class Node;
37
38class Universe : public entt::registry {
39 public:
40 explicit Universe(std::string uuid);
41 Universe();
42
44
45 std::map<std::string, entt::entity> goods;
46 std::vector<entt::entity> consumergoods;
47 std::map<std::string, entt::entity> recipes;
48 std::map<std::string, entt::entity> terrain_data;
49 std::map<std::string, actions::NameGenerator> name_generators;
50 std::map<std::string, entt::entity> fields;
51 std::map<std::string, entt::entity> technologies;
52 std::map<std::string, entt::entity> planets;
53 std::map<std::string, entt::entity> time_zones;
54 std::map<std::string, entt::entity> countries;
55 std::map<std::string, entt::entity> provinces;
56 std::map<std::string, entt::entity> cities;
57 // color -> province map
58 std::map<entt::entity, std::map<int, entt::entity>> province_colors;
59 // province -> color
60 std::map<entt::entity, std::map<entt::entity, int>> colors_province;
61 entt::entity sun;
62
63 void EnableTick() { to_tick = true; }
64 void DisableTick() { to_tick = false; }
65 bool ToTick() { return to_tick; }
66 void ToggleTick() { to_tick = !to_tick; }
67
68 int GetDate() { return date.GetDate(); }
69 std::unique_ptr<cqsp::core::util::IRandom> random;
70 std::string uuid;
71
75 double tick_fraction = 0;
76 std::function<Node(entt::entity)> nodeFactory;
77 auto NodeTransform() const { return std::views::transform(nodeFactory); }
78 std::vector<Node> Convert(const std::vector<entt::entity>& entities) const;
79 std::set<Node> Convert(const std::set<entt::entity>& entities) const;
80
81 template <typename... Components>
82 auto nodes() {
83 return this->template view<Components...>() | NodeTransform();
84 }
85 template <typename... Components>
86 auto nodes() const {
87 return this->template view<Components...>() | NodeTransform();
88 }
89 template <typename... Components, typename... Exclude>
90 auto nodes(entt::exclude_t<Exclude...> exclude) {
91 return this->template view<Components...>(exclude) | NodeTransform();
92 }
93 template <typename... Components, typename... Exclude>
94 auto nodes(entt::exclude_t<Exclude...> exclude) const {
95 return this->template view<Components...>(exclude) | NodeTransform();
96 }
97
98 systems::EconomyConfig economy_config;
99
100 private:
101 bool to_tick = false;
102};
103
104class Node : public entt::handle {
105 public:
106 explicit Node(const Universe& universe, const entt::entity entity);
107 Node(const entt::handle handle, const entt::entity entity);
108 explicit Node(Universe& universe);
109 Universe& universe() const;
110 std::vector<Node> Convert(const std::vector<entt::entity>& entities) const;
111 std::set<Node> Convert(const std::set<entt::entity>& entities) const;
112 Node Convert(const entt::entity entity) const;
113
114 // Overload equivalence against entt::null_t
115 friend bool operator==(const Node& lhs, const entt::null_t&) { return lhs.entity() == entt::null; }
116 friend bool operator==(const entt::null_t&, const Node& rhs) { return rhs.entity() == entt::null; }
117 friend bool operator!=(const Node& lhs, const entt::null_t&) { return lhs.entity() != entt::null; }
118 friend bool operator!=(const entt::null_t&, const Node& rhs) { return rhs.entity() != entt::null; }
119};
120
121} // namespace cqsp::core
122
123template <>
124struct fmt::formatter<entt::entity> : formatter<std::string> {
125 template <typename FormatContext>
126 constexpr auto format(entt::entity entity, FormatContext& ctx) const {
127 return formatter<std::string>::format(std::to_string((uint64_t)entity), ctx);
128 }
129};
130
131template <>
132struct fmt::formatter<cqsp::core::Node> : fmt::formatter<std::string> {
133 template <typename FormatContext>
134 auto format(const cqsp::core::Node ship, FormatContext& ctx) const {
135 return fmt::formatter<entt::entity> {}.format(ship.entity(), ctx);
136 }
137};
Definition: universe.h:104
friend bool operator!=(const entt::null_t &, const Node &rhs)
Definition: universe.h:118
friend bool operator==(const entt::null_t &, const Node &rhs)
Definition: universe.h:116
friend bool operator==(const Node &lhs, const entt::null_t &)
Definition: universe.h:115
friend bool operator!=(const Node &lhs, const entt::null_t &)
Definition: universe.h:117
Definition: universe.h:38
std::map< std::string, entt::entity > provinces
Definition: universe.h:55
void EnableTick()
Definition: universe.h:63
std::vector< entt::entity > consumergoods
Definition: universe.h:46
auto nodes() const
Definition: universe.h:86
std::unique_ptr< cqsp::core::util::IRandom > random
Definition: universe.h:69
std::function< Node(entt::entity)> nodeFactory
Definition: universe.h:76
std::string uuid
Definition: universe.h:70
std::map< std::string, entt::entity > terrain_data
Definition: universe.h:48
auto nodes()
Definition: universe.h:82
auto nodes(entt::exclude_t< Exclude... > exclude)
Definition: universe.h:90
void ToggleTick()
Definition: universe.h:66
systems::EconomyConfig economy_config
Definition: universe.h:98
std::map< std::string, entt::entity > fields
Definition: universe.h:50
void DisableTick()
Definition: universe.h:64
bool to_tick
Definition: universe.h:101
auto nodes(entt::exclude_t< Exclude... > exclude) const
Definition: universe.h:94
std::map< std::string, entt::entity > goods
Definition: universe.h:45
std::map< std::string, entt::entity > planets
Definition: universe.h:52
std::map< entt::entity, std::map< entt::entity, int > > colors_province
Definition: universe.h:60
std::map< std::string, actions::NameGenerator > name_generators
Definition: universe.h:49
std::map< std::string, entt::entity > countries
Definition: universe.h:54
double tick_fraction
What is the current fraction of the wait of the tick we are processing
Definition: universe.h:75
std::map< std::string, entt::entity > recipes
Definition: universe.h:47
std::map< entt::entity, std::map< int, entt::entity > > province_colors
Definition: universe.h:58
std::map< std::string, entt::entity > cities
Definition: universe.h:56
std::map< std::string, entt::entity > time_zones
Definition: universe.h:53
auto NodeTransform() const
Definition: universe.h:77
bool ToTick()
Definition: universe.h:65
components::StarDate date
Definition: universe.h:43
std::map< std::string, entt::entity > technologies
Definition: universe.h:51
Universe()
Definition: universe.cpp:27
entt::entity sun
Definition: universe.h:61
int GetDate()
Definition: universe.h:68
std::vector< Node > Convert(const std::vector< entt::entity > &entities) const
Definition: universe.cpp:33
Holds and calculates the tick that is on going. Date is the number of hours that has been ongoing sin...
Definition: stardate.h:46
uint64_t GetDate()
Definition: stardate.h:60
std::vector< std::string > entities
Definition: loadcities.cpp:40
Definition: cityactions.cpp:23
Definition: universe.h:132
auto format(const cqsp::core::Node ship, FormatContext &ctx) const
Definition: universe.h:134
Definition: universe.h:124
constexpr auto format(entt::entity entity, FormatContext &ctx) const
Definition: universe.h:126
core::Universe * universe
Definition: turnsavewindow.h:3