diff options
Diffstat (limited to 'tools/datapacker/container.cpp')
-rw-r--r-- | tools/datapacker/container.cpp | 205 |
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 | |||
3 | namespace com::fourisland::lingo2_archipelago { | ||
4 | |||
5 | uint64_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 | |||
22 | uint64_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 | |||
51 | uint64_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 | |||
91 | uint64_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 | |||
131 | uint64_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 | |||
172 | uint64_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 | |||
201 | void Container::AddConnection(const Connection& connection) { | ||
202 | *all_objects_.add_connections() = connection; | ||
203 | } | ||
204 | |||
205 | } // namespace com::fourisland::lingo2_archipelago | ||