Browse Source

Consolidate random object placement

pull/4726/head
Vladimir Olteanu 4 years ago committed by Anders Jenbo
parent
commit
5d3274de45
  1. 178
      Source/objects.cpp

178
Source/objects.cpp

@ -366,31 +366,36 @@ void InitRndLocBigObj(int min, int max, _object_id objtype)
}
}
bool CanPlaceRandomObject(Point position, Displacement standoff)
{
for (int yy = -standoff.deltaY; yy <= standoff.deltaX; yy++) {
for (int xx = -standoff.deltaX; xx <= standoff.deltaX; xx++) {
Point tile = position + Displacement { xx, yy };
if (!RndLocOk(tile.x, tile.y))
return false;
}
}
return true;
}
std::optional<Point> GetRandomObjectPosition(Displacement standoff)
{
for (int i = 0; i <= 20000; i++) {
Point position = Point { GenerateRnd(80), GenerateRnd(80) } + Displacement { 16, 16 };
if (CanPlaceRandomObject(position, standoff))
return position;
}
return {};
}
void InitRndLocObj5x5(int min, int max, _object_id objtype)
{
int numobjs = min + GenerateRnd(max - min);
for (int i = 0; i < numobjs; i++) {
int xp;
int yp;
int cnt = 0;
bool exit = false;
while (!exit) {
exit = true;
xp = GenerateRnd(80) + 16;
yp = GenerateRnd(80) + 16;
for (int n = -2; n <= 2; n++) {
for (int m = -2; m <= 2; m++) {
if (!RndLocOk(xp + m, yp + n))
exit = false;
}
}
if (!exit) {
cnt++;
if (cnt > 20000)
return;
}
}
AddObject(objtype, { xp, yp });
std::optional<Point> position = GetRandomObjectPosition({ 2, 2 });
if (!position)
return;
AddObject(objtype, *position);
}
}
@ -450,34 +455,19 @@ void AddCandles()
*/
void AddBookLever(Rectangle affectedArea, _speech_id msg)
{
int cnt = 0;
Point position;
bool exit = false;
while (!exit) {
exit = true;
position = Point { GenerateRnd(80), GenerateRnd(80) } + Displacement { 16, 16 };
for (int n = -2; n <= 2; n++) {
for (int m = -2; m <= 2; m++) {
if (!RndLocOk(position.x + m, position.y + n))
exit = false;
}
}
if (!exit) {
cnt++;
if (cnt > 20000)
return;
}
}
std::optional<Point> position = GetRandomObjectPosition({ 2, 2 });
if (!position)
return;
if (Quests[Q_BLIND].IsAvailable())
AddObject(OBJ_BLINDBOOK, position);
AddObject(OBJ_BLINDBOOK, *position);
if (Quests[Q_WARLORD].IsAvailable())
AddObject(OBJ_STEELTOME, position);
AddObject(OBJ_STEELTOME, *position);
if (Quests[Q_BLOOD].IsAvailable()) {
position = SetPiece.position.megaToWorld() + Displacement { 9, 24 };
AddObject(OBJ_BLOODBOOK, position);
AddObject(OBJ_BLOODBOOK, *position);
}
ObjectAtPosition(position)->InitializeQuestBook(affectedArea, leverid, msg);
ObjectAtPosition(*position)->InitializeQuestBook(affectedArea, leverid, msg);
leverid++;
}
@ -804,7 +794,7 @@ void SetupObject(Object &object, Point position, _object_id ot)
object._oDoorFlag = false;
}
void AddCryptBook(_object_id ot, int v2, int ox, int oy)
void AddCryptBook(_object_id ot, int v2, Point position)
{
if (ActiveObjectCount >= MAXOBJECTS)
return;
@ -812,47 +802,30 @@ void AddCryptBook(_object_id ot, int v2, int ox, int oy)
int oi = AvailableObjects[0];
AvailableObjects[0] = AvailableObjects[MAXOBJECTS - 1 - ActiveObjectCount];
ActiveObjects[ActiveObjectCount] = oi;
dObject[ox][oy] = oi + 1;
dObject[position.x][position.y] = oi + 1;
Object &object = Objects[oi];
SetupObject(object, { ox, oy }, ot);
SetupObject(object, position, ot);
AddCryptObject(object, v2);
ActiveObjectCount++;
}
void AddCryptStoryBook(int s)
{
int cnt = 0;
int xp;
int yp;
bool exit = false;
while (!exit) {
exit = true;
xp = GenerateRnd(80) + 16;
yp = GenerateRnd(80) + 16;
for (int n = -2; n <= 2; n++) {
for (int m = -3; m <= 3; m++) {
if (!RndLocOk(xp + m, yp + n))
exit = false;
}
}
if (!exit) {
cnt++;
if (cnt > 20000)
return;
}
}
AddCryptBook(OBJ_L5BOOKS, s, xp, yp);
AddObject(OBJ_L5CANDLE, { xp - 2, yp + 1 });
AddObject(OBJ_L5CANDLE, { xp - 2, yp });
AddObject(OBJ_L5CANDLE, { xp - 1, yp - 1 });
AddObject(OBJ_L5CANDLE, { xp + 1, yp - 1 });
AddObject(OBJ_L5CANDLE, { xp + 2, yp });
AddObject(OBJ_L5CANDLE, { xp + 2, yp + 1 });
std::optional<Point> position = GetRandomObjectPosition({ 3, 2 });
if (!position)
return;
AddCryptBook(OBJ_L5BOOKS, s, *position);
AddObject(OBJ_L5CANDLE, *position + Displacement { -2, 1 });
AddObject(OBJ_L5CANDLE, *position + Displacement { -2, 0 });
AddObject(OBJ_L5CANDLE, *position + Displacement { -1, -1 });
AddObject(OBJ_L5CANDLE, *position + Displacement { 1, -1 });
AddObject(OBJ_L5CANDLE, *position + Displacement { 2, 0 });
AddObject(OBJ_L5CANDLE, *position + Displacement { 2, 1 });
}
void AddNakrulBook(int a1, int a2, int a3)
void AddNakrulBook(int a1, Point position)
{
AddCryptBook(OBJ_L5BOOKS, a1, a2, a3);
AddCryptBook(OBJ_L5BOOKS, a1, position);
}
void AddNakrulGate()
@ -860,58 +833,41 @@ void AddNakrulGate()
AddNakrulLeaver();
switch (GenerateRnd(6)) {
case 0:
AddNakrulBook(6, UberRow + 3, UberCol);
AddNakrulBook(7, UberRow + 2, UberCol - 3);
AddNakrulBook(8, UberRow + 2, UberCol + 2);
AddNakrulBook(6, { UberRow + 3, UberCol });
AddNakrulBook(7, { UberRow + 2, UberCol - 3 });
AddNakrulBook(8, { UberRow + 2, UberCol + 2 });
break;
case 1:
AddNakrulBook(6, UberRow + 3, UberCol);
AddNakrulBook(8, UberRow + 2, UberCol - 3);
AddNakrulBook(7, UberRow + 2, UberCol + 2);
AddNakrulBook(6, { UberRow + 3, UberCol });
AddNakrulBook(8, { UberRow + 2, UberCol - 3 });
AddNakrulBook(7, { UberRow + 2, UberCol + 2 });
break;
case 2:
AddNakrulBook(7, UberRow + 3, UberCol);
AddNakrulBook(6, UberRow + 2, UberCol - 3);
AddNakrulBook(8, UberRow + 2, UberCol + 2);
AddNakrulBook(7, { UberRow + 3, UberCol });
AddNakrulBook(6, { UberRow + 2, UberCol - 3 });
AddNakrulBook(8, { UberRow + 2, UberCol + 2 });
break;
case 3:
AddNakrulBook(7, UberRow + 3, UberCol);
AddNakrulBook(8, UberRow + 2, UberCol - 3);
AddNakrulBook(6, UberRow + 2, UberCol + 2);
AddNakrulBook(7, { UberRow + 3, UberCol });
AddNakrulBook(8, { UberRow + 2, UberCol - 3 });
AddNakrulBook(6, { UberRow + 2, UberCol + 2 });
break;
case 4:
AddNakrulBook(8, UberRow + 3, UberCol);
AddNakrulBook(7, UberRow + 2, UberCol - 3);
AddNakrulBook(6, UberRow + 2, UberCol + 2);
AddNakrulBook(8, { UberRow + 3, UberCol });
AddNakrulBook(7, { UberRow + 2, UberCol - 3 });
AddNakrulBook(6, { UberRow + 2, UberCol + 2 });
break;
case 5:
AddNakrulBook(8, UberRow + 3, UberCol);
AddNakrulBook(6, UberRow + 2, UberCol - 3);
AddNakrulBook(7, UberRow + 2, UberCol + 2);
AddNakrulBook(8, { UberRow + 3, UberCol });
AddNakrulBook(6, { UberRow + 2, UberCol - 3 });
AddNakrulBook(7, { UberRow + 2, UberCol + 2 });
break;
}
}
bool CanPlaceStoryBook(Point position)
{
for (int yy = -2; yy <= 2; yy++) {
for (int xx = -3; xx <= 3; xx++) {
Point tile = position + Displacement { xx, yy };
if (!RndLocOk(tile.x, tile.y))
return false;
}
}
return true;
}
void AddStoryBooks()
{
std::optional<Point> position;
for (int i = 0; i <= 20000 && !position; i++) {
position = { GenerateRnd(80) + 16, GenerateRnd(80) + 16 };
if (!CanPlaceStoryBook(*position))
position = {};
}
std::optional<Point> position = GetRandomObjectPosition({ 3, 2 });
if (!position)
return;

Loading…
Cancel
Save