From 715926e751610fa5a6a4e202b8e011181c91a42a Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 2 Oct 2022 15:00:49 +0200 Subject: [PATCH] Fix single room cathedral with quest piece (#5321) --- Source/levels/drlg_l1.cpp | 20 +++++++++++++------- test/Fixtures.cmake | 1 + test/drlg_l1_test.cpp | 16 ++++++++++++++++ test/fixtures/hellfire/3-1369955278.dun | Bin 0 -> 54404 bytes 4 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/hellfire/3-1369955278.dun 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 0000000000000000000000000000000000000000..1b45cf8db0d62c3bb8d84d8596cc17390c44df44 GIT binary patch literal 54404 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 Y>@C6<&R<=