diff --git a/Source/levels/drlg_l1.cpp b/Source/levels/drlg_l1.cpp index cc0902c45..a0e57cbbf 100644 --- a/Source/levels/drlg_l1.cpp +++ b/Source/levels/drlg_l1.cpp @@ -1259,14 +1259,20 @@ void PlaceMiniSetRandom(const Miniset &miniset, int rndper) Point SelectChamber() { int chamber; - if (!HasChamber1) - chamber = PickRandomlyAmong({ 2, 3 }); - else if (!HasChamber2) - chamber = PickRandomlyAmong({ 3, 1 }); - else if (!HasChamber3) - chamber = PickRandomlyAmong({ 2, 1 }); - else + if (HasChamber1 && HasChamber2 && HasChamber3) { chamber = GenerateRnd(3) + 1; + } else if (HasChamber1 && HasChamber2) { + chamber = PickRandomlyAmong({ 2, 1 }); // Reverse order to match vanilla + } else if (HasChamber1 && HasChamber3) { + chamber = PickRandomlyAmong({ 3, 1 }); // Reverse order to match vanilla + } else if (HasChamber2 && HasChamber3) { + chamber = PickRandomlyAmong({ 2, 3 }); + } else { + // The dungeon generation logic ensures that chamber 2 is available if + // either (or both of) 1 or 3 aren't, so if we ever end up with a single + // chamber layout it's always chamber 2. + chamber = 2; + } switch (chamber) { case 1: diff --git a/test/Fixtures.cmake b/test/Fixtures.cmake index 09eb884a9..a720744ab 100644 --- a/test/Fixtures.cmake +++ b/test/Fixtures.cmake @@ -32,6 +32,7 @@ set(devilutionx_fixtures hellfire/1-536340718.dun hellfire/2-128964898.dun hellfire/2-1180526547.dun + hellfire/3-1369955278.dun hellfire/3-1512491184.dun hellfire/3-1799396623.dun hellfire/4-1190318991.dun diff --git a/test/drlg_l1_test.cpp b/test/drlg_l1_test.cpp index f2c941138..3bfd7fbbf 100644 --- a/test/drlg_l1_test.cpp +++ b/test/drlg_l1_test.cpp @@ -148,6 +148,22 @@ TEST(Drlg_l1, CreateL5Dungeon_hellfire_2_1180526547) EXPECT_EQ(ViewPosition, Point(81, 45)); } +TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1369955278) +{ + LoadExpectedLevelData("hellfire/3-1369955278.dun"); + + Players.resize(1); + MyPlayer = &Players[0]; + MyPlayer->pOriginalCathedral = false; + InitQuests(); + Quests[Q_SKELKING]._qactive = QUEST_INIT; + + TestCreateDungeon(3, 1369955278, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(63, 86)); + TestCreateDungeon(3, 1369955278, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(75, 69)); +} + TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1799396623) { LoadExpectedLevelData("hellfire/3-1799396623.dun"); diff --git a/test/fixtures/hellfire/3-1369955278.dun b/test/fixtures/hellfire/3-1369955278.dun new file mode 100644 index 000000000..1b45cf8db Binary files /dev/null and b/test/fixtures/hellfire/3-1369955278.dun differ