Fix subroom doors

Doors weren't getting added to the correct subrooms in certain cases.

Also fix one of the themerooms, because doors have to be added
after subrooms; there was a possibility of no door to the subroom(s)
in that themeroom, because the subrooms overwrote the doors in
the parent room.

Test case for the subroom doors:

Large room, with a medium subroom, with a tiny subroom inside that.
The doors go from outermost room <-> tiny innermost room <-> middle room.

des.room({ type = "ordinary", x = 1, y = 1, w = 10, h = 10,
   contents = function()
      des.room({ type = "ordinary", w = 6, h = 6, x = 2, y = 2,
         contents = function()
            des.room({ type = "ordinary", w = 2, h = 2, x = 0, y = 0,
               contents = function()
                  des.door({ state="random", wall="south", pos = 1 });
               end
            });
            des.door({ state="random", wall="north", pos = 1 });
         end
      });
   end
});

Before this fix:

ROOM: ndoors:1, subrooms:1
  SUBROOM: ndoors:1, subrooms:1
    SUBROOM: ndoors:1, subrooms:0

after this fix:

ROOM: ndoors:1, subrooms:1
  SUBROOM: ndoors:1, subrooms:1
    SUBROOM: ndoors:2, subrooms:0
This commit is contained in:
Pasi Kallinen
2023-03-07 09:43:39 +02:00
parent f0e88bbc68
commit 8e6cf385b1
3 changed files with 11 additions and 4 deletions

View File

@@ -3974,6 +3974,9 @@ lspo_room(lua_State *L)
if (tmpcr) {
gc.coder->tmproomlist[gc.coder->n_subroom] = tmpcr;
gc.coder->failed_room[gc.coder->n_subroom] = FALSE;
/* added a subroom, make parent room irregular */
if (gc.coder->tmproomlist[gc.coder->n_subroom - 1])
gc.coder->tmproomlist[gc.coder->n_subroom - 1]->irregular = TRUE;
gc.coder->n_subroom++;
update_croom();
lua_getfield(L, 1, "contents");
@@ -6007,11 +6010,14 @@ static void
add_doors_to_room(struct mkroom *croom)
{
coordxy x, y;
int i;
for (x = croom->lx - 1; x <= croom->hx + 1; x++)
for (y = croom->ly - 1; y <= croom->hy + 1; y++)
if (IS_DOOR(levl[x][y].typ) || levl[x][y].typ == SDOOR)
maybe_add_door(x, y, croom);
for (i = 0; i < croom->nsubrooms; i++)
add_doors_to_room(croom->sbrooms[i]);
}
DISABLE_WARNING_UNREACHABLE_CODE