Portals - fix autolinking to internal rooms

Portal autolinking was previously agnostic to room priorities, which meant that portals would link to the first room they found (often outside rooms). This PR fixes this by making the autolinking priority aware, and will preferentially link to internal rooms.
This commit is contained in:
lawnjelly 2021-08-08 14:37:04 +01:00
parent 42e40a7d3c
commit a339f6fc49

View file

@ -971,6 +971,9 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
Vector3 test_pos = portal->_pt_center_world + (dist * portal->_plane.normal);
int best_priority = -1000;
int best_room = -1;
for (int r = 0; r < _rooms.size(); r++) {
Room *room = _rooms[r];
if (room->_room_ID == portal->_linkedroom_ID[0]) {
@ -993,9 +996,23 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
} // for through planes
if (!outside) {
// we found a suitable room, but we want the highest priority in
// case there are internal rooms...
if (room->_room_priority > best_priority) {
best_priority = room->_room_priority;
best_room = r;
}
}
} // for through rooms
// found a suitable link room
if (best_room != -1) {
Room *room = _rooms[best_room];
// great, we found a linked room!
convert_log("\t\tAUTOLINK OK from " + source_room->get_name() + " to " + room->get_name(), 1);
portal->_linkedroom_ID[1] = r;
portal->_linkedroom_ID[1] = best_room;
// add the portal to the portals list for the receiving room
room->_portals.push_back(n);
@ -1011,8 +1028,6 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
break;
}
} // for through rooms
} // for attempt
// error condition