Browse Source

add IsAreaOk function instead of multiple manual checks

pull/6458/head
qndel 3 years ago committed by Anders Jenbo
parent
commit
384a303afa
  1. 65
      Source/objects.cpp

65
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 };

Loading…
Cancel
Save