132 std::vector<AtlasDoor> out;
133 for (
const auto& fact : doors) {
135 const char wall = WallLetter(fact.direction);
136 const bool outer = (wall ==
'N' && fact.tile_y <= 8) ||
137 (wall ==
'S' && fact.tile_y >= 50) ||
138 (wall ==
'W' && fact.tile_x <= 8) ||
139 (wall ==
'E' && fact.tile_x >= 50);
145 door.
pos = (wall ==
'N' || wall ==
'S') ? fact.tile_x + 2 : fact.tile_y + 2;
146 door.
type = fact.type;
149 out.push_back(std::move(door));
151 std::vector<std::pair<char, int>> exits;
152 for (
const auto& door : out) {
154 exits.emplace_back(door.wall, door.pos);
157 for (
auto& door : out) {
161 for (
const auto& [wall, pos] : exits) {
162 if (wall == door.wall && std::abs(pos - door.pos) <= 2) {
172 const std::vector<std::vector<AtlasDoor>>& doors_by_room) {
173 std::vector<DoorEdge> out;
174 std::set<std::pair<int, size_t>> used;
175 const int rooms = std::min<int>(kRooms, doors_by_room.size());
176 for (
int a = 0; a < rooms; ++a) {
179 const std::pair<char, int> neighbours[] = {
180 {
'E', (a & 0xF) != 0xF ? a + 1 : -1},
181 {
'S', a + 0x10 < kRooms ? a + 0x10 : -1},
182 {
'W', (a & 0xF) != 0 ? a - 1 : -1},
183 {
'N', a >= 0x10 ? a - 0x10 : -1}};
184 for (
const auto& [dir, b] : neighbours) {
185 if (b < 0 || b >= rooms) {
188 const auto& doors_a = doors_by_room[a];
189 const auto& doors_b = doors_by_room[b];
190 for (
size_t i = 0; i < doors_a.size(); ++i) {
192 if (da.
wall != dir || !Pairable(da.
category) || used.contains({a, i})) {
196 for (
size_t j = 0; j < doors_b.size(); ++j) {
198 if (db.
wall == Opposite(dir) && Pairable(db.
category) &&
199 std::abs(db.
pos - da.
pos) <= 3 && !used.contains({b, j})) {
200 match =
static_cast<int>(j);
212 used.insert({b,
static_cast<size_t>(match)});
232 out.push_back(std::move(edge));