77 root[
"rom"] = {{
"name", atlas.
rom.
name},
85 root[
"title"] = atlas.
title;
88 root[
"owners_source"] =
97 {
"door_edges", atlas.
edges.size()}};
100 for (
const auto& area : atlas.
areas) {
102 out[
"key"] = area.key;
103 out[
"code"] = area.code;
104 out[
"name"] = area.name;
105 out[
"kind"] = area.kind;
106 if (!area.owner.empty()) {
107 out[
"owner"] = area.owner;
109 out[
"color"] = area.color.Hex();
110 out[
"rooms"] = area.rooms;
111 out[
"source"] = area.origin.ToString();
112 out[
"color_source"] = area.color_origin.ToString();
113 areas.push_back(std::move(out));
115 root[
"areas"] = std::move(areas);
118 for (
const auto& plan : atlas.
plans) {
120 out[
"key"] = plan.key;
121 out[
"label"] = plan.label;
122 out[
"name"] = plan.name;
123 out[
"status"] = plan.status;
124 out[
"color"] = plan.has_color ?
Json(plan.color.Hex()) :
Json(
nullptr);
125 out[
"rooms"] = RoomList(plan.rooms);
126 if (!plan.note.empty()) {
127 out[
"note"] = plan.note;
129 out[
"source"] = plan.origin.ToString();
130 plans.push_back(std::move(out));
132 root[
"plans"] = std::move(plans);
135 for (
const auto& room : atlas.
rooms) {
137 out[
"room"] = Hex(room.room_id);
138 out[
"area"] = room.area;
139 out[
"area_source"] = room.area_origin.ToString();
140 out[
"owner"] = room.owner.
empty() ?
Json(
nullptr) :
Json(room.owner);
141 out[
"owner_name"] = room.owner_name;
142 out[
"name"] = room.name;
144 room.name.
empty() ?
Json(
nullptr) :
Json(room.name_origin.ToString());
145 if (!room.note.empty()) {
146 out[
"note"] = room.note;
149 out[
"status_source"] = room.status_origin.ToString();
150 out[
"reached"] = room.reached;
151 out[
"empty"] = room.
empty;
152 out[
"interior"] = room.interior;
153 out[
"objects"] = room.objects;
154 out[
"sprites"] = room.sprites;
155 out[
"vanilla_similarity"] =
156 room.vanilla_similarity < 0.0f
158 :
Json(std::round(room.vanilla_similarity * 100.0) / 100.0);
159 out[
"tags"] = {Hex(room.tag1), Hex(room.tag2)};
160 out[
"blockset"] = room.blockset;
161 out[
"pit_damage"] = room.pit_damage;
162 out[
"plans"] = room.plans;
163 out[
"reasons"] = room.reasons;
165 for (
const auto& door : room.doors) {
166 doors.push_back({{
"wall", std::string(1, door.wall)},
168 {
"type", Hex(door.type)},
169 {
"type_name", door.type_name},
172 out[
"doors"] = std::move(doors);
174 for (
const auto& link : room.links_out) {
175 links_out.push_back(LinkJson(link,
true));
177 out[
"links_out"] = std::move(links_out);
179 for (
const auto& link : room.links_in) {
180 links_in.push_back(LinkJson(link,
false));
182 out[
"links_in"] = std::move(links_in);
183 out[
"badges"] = {{
"k_chest", room.badges.k_chest},
184 {
"c", room.badges.c},
185 {
"m", room.badges.m},
186 {
"bk_chest", room.badges.bk_chest},
187 {
"big_chest", room.badges.big_chest},
188 {
"other", room.badges.other},
189 {
"k_pot", room.badges.k_pot},
190 {
"k_drop", room.badges.k_drop},
191 {
"bk_drop", room.badges.bk_drop}};
192 rooms.push_back(std::move(out));
194 root[
"rooms"] = std::move(rooms);
197 for (
const auto& edge : atlas.
edges) {
198 edges.push_back({{
"a", Hex(edge.a)},
200 {
"dir", std::string(1, edge.dir)},
203 {
"sides", edge.both_sides ?
"both" :
"a"},
204 {
"one_sided_type", edge.one_sided_type},
205 {
"types", edge.types}});
207 root[
"edges"] = std::move(edges);
210 for (
const auto& row : atlas.
key_table) {
211 key_table.push_back({{
"area", row.area},
212 {
"k_chest", row.k_chest},
213 {
"k_pot", row.k_pot},
214 {
"k_drop", row.k_drop},
220 root[
"key_table"] = std::move(key_table);
223 return root.
dump(indent);