20 int destination_slot) {
21 if (destination_slot < 0 || destination_slot >= 8)
23 const int runtime_slot = 7 - destination_slot;
24 const bool right = main_blockset < 0x20
26 : runtime_slot == 2 || runtime_slot == 3 ||
27 runtime_slot == 4 || runtime_slot == 7;
69 uint8_t main_blockset;
72 std::vector<EntranceInfo> entrances;
75 RoomEntrance entrance(&rom,
static_cast<uint8_t
>(
id),
false);
84 for (
const EntranceInfo& entrance : entrances) {
100 std::vector<int> rooms;
101 for (
const auto& floor : map.floor_rooms) {
102 for (uint8_t room : floor) {
103 if (room != kEmptyMapRoom) {
104 rooms.push_back(room);
110 std::map<uint8_t, int> votes;
111 for (
int room : rooms) {
112 for (
const EntranceInfo& entrance : entrances) {
113 if (entrance.room == room && entrance.dungeon_id != 0xFF) {
114 ++votes[entrance.dungeon_id];
121 uint8_t dungeon_id = votes.begin()->first;
122 for (
const auto& [
id, count] : votes) {
123 if (count > votes[dungeon_id]) {
127 const EntranceInfo* representative =
nullptr;
128 for (
const EntranceInfo& entrance : entrances) {
129 if (entrance.dungeon_id == dungeon_id) {
130 representative = &entrance;
134 if (representative ==
nullptr) {
137 for (
int room : rooms) {
140 slot = {representative->id, representative->main_blockset,
152 if (result[
static_cast<size_t>(room)].source !=
156 for (
int neighbour : {room - 1, room + 1, room - 16, room + 16}) {
157 const bool adjacent = neighbour / 16 == room / 16 ||
158 neighbour == room - 16 || neighbour == room + 16;
163 result[
static_cast<size_t>(neighbour)];
167 result[
static_cast<size_t>(room)] = {