diff --git a/Source/objects.cpp b/Source/objects.cpp index 20b0bf2ab90..da47c4640c6 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1288,27 +1288,33 @@ void AddBarrel(Object &barrel) void AddShrine(Object &shrine) { shrine._oRndSeed = AdvanceRndSeed(); - bool slist[NumberOfShrineTypes]; - shrine._oPreFlag = true; - int shrines = gbIsHellfire ? NumberOfShrineTypes : 26; + int shrineCount = gbIsHellfire ? NumberOfShrineTypes : 26; + bool slist[NumberOfShrineTypes] = {}; + + for (int i = 0; i < shrineCount; i++) { + bool isShrineAvailable = true; - for (int j = 0; j < shrines; j++) { - slist[j] = j != ShrineEnchanted || IsAnyOf(leveltype, DTYPE_CATHEDRAL, DTYPE_CATACOMBS); - if (gbIsMultiplayer && shrineavail[j] == ShrineTypeSingle) { - slist[j] = false; - } else if (!gbIsMultiplayer && shrineavail[j] == ShrineTypeMulti) { - slist[j] = false; + if (gbIsMultiplayer) { + isShrineAvailable = (shrineavail[i] != ShrineTypeSingle); + } else { + isShrineAvailable = (shrineavail[i] != ShrineTypeMulti); } + + bool isEnchantedShrine = (i == ShrineEnchanted); + bool isCorrectLevelType = IsAnyOf(leveltype, DTYPE_CATHEDRAL, DTYPE_CATACOMBS); + + slist[i] = isShrineAvailable && (!isEnchantedShrine || isCorrectLevelType); } - int val; + int selectedIndex; do { - val = GenerateRnd(shrines); - } while (!slist[val]); + selectedIndex = GenerateRnd(shrineCount); + } while (!slist[selectedIndex]); + + shrine._oVar1 = selectedIndex; - shrine._oVar1 = val; if (!FlipCoin()) { shrine._oAnimFrame = 12; shrine._oAnimLen = 22;