diff --git a/Source/objects.cpp b/Source/objects.cpp index 720eceb7a..6b6ad654f 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -321,6 +321,15 @@ bool RndLocOk(int xp, int yp) return IsNoneOf(leveltype, DTYPE_CATHEDRAL, DTYPE_CRYPT) || dPiece[xp][yp] <= 125 || dPiece[xp][yp] >= 143; } +bool IsAreaOk(Rectangle rect) +{ + for (Point position : PointsInRectangle(rect)) { + if (!RndLocOk(position.x, position.y)) + return false; + } + return true; +} + bool CanPlaceWallTrap(int xp, int yp) { if (dObject[xp][yp] != 0) @@ -339,15 +348,7 @@ void InitRndLocObj(int min, int max, _object_id objtype) while (true) { int xp = GenerateRnd(80) + 16; int yp = GenerateRnd(80) + 16; - if (RndLocOk(xp - 1, yp - 1) - && RndLocOk(xp, yp - 1) - && RndLocOk(xp + 1, yp - 1) - && RndLocOk(xp - 1, yp) - && RndLocOk(xp, yp) - && RndLocOk(xp + 1, yp) - && RndLocOk(xp - 1, yp + 1) - && RndLocOk(xp, yp + 1) - && RndLocOk(xp + 1, yp + 1)) { + if (IsAreaOk(Rectangle { { xp - 1, yp - 1 }, { 3, 3 } })) { AddObject(objtype, { xp, yp }); break; } @@ -362,18 +363,7 @@ void InitRndLocBigObj(int min, int max, _object_id objtype) while (true) { int xp = GenerateRnd(80) + 16; int yp = GenerateRnd(80) + 16; - if (RndLocOk(xp - 1, yp - 2) - && RndLocOk(xp, yp - 2) - && RndLocOk(xp + 1, yp - 2) - && RndLocOk(xp - 1, yp - 1) - && RndLocOk(xp, yp - 1) - && RndLocOk(xp + 1, yp - 1) - && RndLocOk(xp - 1, yp) - && RndLocOk(xp, yp) - && RndLocOk(xp + 1, yp) - && RndLocOk(xp - 1, yp + 1) - && RndLocOk(xp, yp + 1) - && RndLocOk(xp + 1, yp + 1)) { + if (IsAreaOk(Rectangle { { xp - 1, yp - 2 }, { 3, 4 } })) { AddObject(objtype, { xp, yp }); break; } @@ -845,15 +835,7 @@ void AddNakrulLever() while (true) { int xp = GenerateRnd(80) + 16; int yp = GenerateRnd(80) + 16; - if (RndLocOk(xp - 1, yp - 1) - && RndLocOk(xp, yp - 1) - && RndLocOk(xp + 1, yp - 1) - && RndLocOk(xp - 1, yp) - && RndLocOk(xp, yp) - && RndLocOk(xp + 1, yp) - && RndLocOk(xp - 1, yp + 1) - && RndLocOk(xp, yp + 1) - && RndLocOk(xp + 1, yp + 1)) { + if (IsAreaOk(Rectangle { { xp - 1, yp - 1 }, { 3, 3 } })) { break; } } @@ -969,23 +951,18 @@ void AddLazStand() int cnt = 0; int xp; int yp; - bool found = false; - while (!found) { - found = true; + while (true) { xp = GenerateRnd(80) + 16; yp = GenerateRnd(80) + 16; - for (int yy = -3; yy <= 3; yy++) { - for (int xx = -2; xx <= 3; xx++) { - if (!RndLocOk(xp + xx, yp + yy)) - found = false; - } - } - if (!found) { + + if (!IsAreaOk(Rectangle { { xp - 2, yp - 3 }, { 6, 7 } })) { cnt++; if (cnt > 10000) { InitRndLocObj(1, 1, OBJ_LAZSTAND); return; } + } else { + break; } } AddObject(OBJ_LAZSTAND, { xp, yp }); @@ -1528,13 +1505,7 @@ Point GetRndObjLoc(int randarea) randarea--; x = GenerateRnd(MAXDUNX); y = GenerateRnd(MAXDUNY); - bool failed = false; - for (int i = 0; i < randarea && !failed; i++) { - for (int j = 0; j < randarea && !failed; j++) { - failed = !RndLocOk(i + x, j + y); - } - } - if (!failed) + if (IsAreaOk(Rectangle { { x, y }, { randarea, randarea } })) break; } return { x, y };