summary refs log tree commit diff stats
path: root/tools/datapacker/container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/datapacker/container.cpp')
-rw-r--r--tools/datapacker/container.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp new file mode 100644 index 0000000..ead3818 --- /dev/null +++ b/tools/datapacker/container.cpp
@@ -0,0 +1,205 @@
1#include "container.h"
2
3namespace com::fourisland::lingo2_archipelago {
4
5uint64_t Container::FindOrAddMap(std::string map_name) {
6 auto it = map_id_by_name_.find(map_name);
7
8 if (it == map_id_by_name_.end()) {
9 uint64_t new_id = all_objects_.maps_size();
10 Map* map = all_objects_.add_maps();
11 map->set_id(new_id);
12 map->set_name(map_name);
13
14 map_id_by_name_[map_name] = new_id;
15
16 return new_id;
17 } else {
18 return it->second;
19 }
20}
21
22uint64_t Container::FindOrAddRoom(std::optional<std::string> map_name,
23 std::string room_name,
24 std::optional<std::string> map_fallback) {
25 if (!map_name) {
26 if (!map_fallback) {
27 std::cout << "No map name provided for " << room_name << std::endl;
28 map_name = "global";
29 } else {
30 map_name = map_fallback;
31 }
32 }
33
34 auto& map_container = room_id_by_map_room_names_[*map_name];
35 auto it = map_container.find(room_name);
36 if (it == map_container.end()) {
37 uint64_t new_id = all_objects_.rooms_size();
38 Room* room = all_objects_.add_rooms();
39 room->set_id(new_id);
40 room->set_map_id(FindOrAddMap(*map_name));
41 room->set_name(room_name);
42
43 map_container[room_name] = new_id;
44
45 return new_id;
46 } else {
47 return it->second;
48 }
49}
50
51uint64_t Container::FindOrAddPainting(
52 std::optional<std::string> map_name, std::optional<std::string> room_name,
53 std::string painting_name, std::optional<std::string> map_fallback,
54 std::optional<std::string> room_fallback) {
55 if (!map_name) {
56 if (!map_fallback) {
57 std::cout << "No map name provided for " << painting_name << std::endl;
58 map_name = "global";
59 } else {
60 map_name = map_fallback;
61 }
62 }
63
64 if (!room_name) {
65 if (!room_fallback) {
66 std::cout << "No room name provided for " << painting_name << std::endl;
67 room_name = "global";
68 } else {
69 room_name = room_fallback;
70 }
71 }
72
73 auto& room_container =
74 painting_id_by_map_room_painting_names_[*map_name][*room_name];
75 auto it = room_container.find(painting_name);
76 if (it == room_container.end()) {
77 uint64_t new_id = all_objects_.paintings_size();
78 Painting* painting = all_objects_.add_paintings();
79 painting->set_id(new_id);
80 painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
81 painting->set_name(painting_name);
82
83 room_container[painting_name] = new_id;
84
85 return new_id;
86 } else {
87 return it->second;
88 }
89}
90
91uint64_t Container::FindOrAddPort(std::optional<std::string> map_name,
92 std::optional<std::string> room_name,
93 std::string port_name,
94 std::optional<std::string> map_fallback,
95 std::optional<std::string> room_fallback) {
96 if (!map_name) {
97 if (!map_fallback) {
98 std::cout << "No map name provided for " << port_name << std::endl;
99 map_name = "global";
100 } else {
101 map_name = map_fallback;
102 }
103 }
104
105 if (!room_name) {
106 if (!room_fallback) {
107 std::cout << "No room name provided for " << port_name << std::endl;
108 room_name = "global";
109 } else {
110 room_name = room_fallback;
111 }
112 }
113
114 auto& room_container = port_id_by_map_room_port_names_[*map_name][*room_name];
115 auto it = room_container.find(port_name);
116 if (it == room_container.end()) {
117 uint64_t new_id = all_objects_.ports_size();
118 Port* port = all_objects_.add_ports();
119 port->set_id(new_id);
120 port->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
121 port->set_name(port_name);
122
123 room_container[port_name] = new_id;
124
125 return new_id;
126 } else {
127 return it->second;
128 }
129}
130
131uint64_t Container::FindOrAddPanel(std::optional<std::string> map_name,
132 std::optional<std::string> room_name,
133 std::string panel_name,
134 std::optional<std::string> map_fallback,
135 std::optional<std::string> room_fallback) {
136 if (!map_name) {
137 if (!map_fallback) {
138 std::cout << "No map name provided for " << panel_name << std::endl;
139 map_name = "global";
140 } else {
141 map_name = map_fallback;
142 }
143 }
144
145 if (!room_name) {
146 if (!room_fallback) {
147 std::cout << "No room name provided for " << panel_name << std::endl;
148 room_name = "global";
149 } else {
150 room_name = room_fallback;
151 }
152 }
153
154 auto& room_container =
155 panel_id_by_map_room_panel_names_[*map_name][*room_name];
156 auto it = room_container.find(panel_name);
157 if (it == room_container.end()) {
158 uint64_t new_id = all_objects_.panels_size();
159 Panel* panel = all_objects_.add_panels();
160 panel->set_id(new_id);
161 panel->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
162 panel->set_name(panel_name);
163
164 room_container[panel_name] = new_id;
165
166 return new_id;
167 } else {
168 return it->second;
169 }
170}
171
172uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name,
173 std::string door_name,
174 std::optional<std::string> map_fallback) {
175 if (!map_name) {
176 if (!map_fallback) {
177 std::cout << "No map name provided for " << door_name << std::endl;
178 map_name = "global";
179 } else {
180 map_name = map_fallback;
181 }
182 }
183
184 auto& map_container = door_id_by_map_door_names_[*map_name];
185 auto it = map_container.find(door_name);
186 if (it == map_container.end()) {
187 uint64_t new_id = all_objects_.doors_size();
188 Door* door = all_objects_.add_doors();
189 door->set_id(new_id);
190 door->set_map_id(FindOrAddMap(*map_name));
191 door->set_name(door_name);
192
193 map_container[door_name] = new_id;
194
195 return new_id;
196 } else {
197 return it->second;
198 }
199}
200
201void Container::AddConnection(const Connection& connection) {
202 *all_objects_.add_connections() = connection;
203}
204
205} // namespace com::fourisland::lingo2_archipelago