Browse Source

Clean up PlaceUniqueMonster() position logic

pull/7570/head
Eric Robinson 1 year ago committed by Anders Jenbo
parent
commit
55eba38be6
  1. 119
      Source/monster.cpp

119
Source/monster.cpp

@ -313,15 +313,58 @@ size_t GetMonsterTypeIndex(_monster_id type)
return LevelMonsterTypeCount;
}
void PlaceUniqueMonst(UniqueMonsterType uniqindex, size_t minionType, int bosspacksize)
Point GetUniqueMonstPosition(UniqueMonsterType uniqindex)
{
auto &monster = Monsters[ActiveMonsterCount];
const auto &uniqueMonsterData = UniqueMonstersData[static_cast<size_t>(uniqindex)];
if (setlevel) {
switch (uniqindex) {
case UniqueMonsterType::Lazarus:
return { 32, 46 };
case UniqueMonsterType::RedVex:
return { 40, 45 };
case UniqueMonsterType::BlackJade:
return { 38, 49 };
case UniqueMonsterType::SkeletonKing:
return { 35, 47 };
default:
break;
}
}
switch (uniqindex) {
case UniqueMonsterType::SnotSpill:
return SetPiece.position.megaToWorld() + Displacement { 8, 12 };
case UniqueMonsterType::WarlordOfBlood:
return SetPiece.position.megaToWorld() + Displacement { 6, 7 };
case UniqueMonsterType::Zhar:
for (int i = 0; i < themeCount; i++) {
if (i == zharlib) {
return themeLoc[i].room.position.megaToWorld() + Displacement { 4, 4 };
}
}
break;
case UniqueMonsterType::Lazarus:
return SetPiece.position.megaToWorld() + Displacement { 3, 6 };
case UniqueMonsterType::RedVex:
return SetPiece.position.megaToWorld() + Displacement { 5, 3 };
case UniqueMonsterType::BlackJade:
return SetPiece.position.megaToWorld() + Displacement { 5, 9 };
case UniqueMonsterType::Butcher:
return SetPiece.position.megaToWorld() + Displacement { 4, 4 };
case UniqueMonsterType::NaKrul:
if (UberRow == 0 || UberCol == 0) {
UberDiabloMonsterIndex = -1;
break;
}
UberDiabloMonsterIndex = static_cast<int>(ActiveMonsterCount);
return { UberRow - 2, UberCol };
default:
break;
}
int count = 0;
Point position;
while (true) {
position = Point { GenerateRnd(80), GenerateRnd(80) } + Displacement { 16, 16 };
int count = 0;
do {
Point position = Point { GenerateRnd(80), GenerateRnd(80) } + Displacement { 16, 16 };
int count2 = 0;
for (int x = position.x - 3; x < position.x + 3; x++) {
for (int y = position.y - 3; y < position.y + 3; y++) {
@ -337,66 +380,20 @@ void PlaceUniqueMonst(UniqueMonsterType uniqindex, size_t minionType, int bosspa
continue;
}
}
} while (!CanPlaceMonster(position));
if (CanPlaceMonster(position)) {
break;
}
}
if (uniqindex == UniqueMonsterType::SnotSpill) {
position = SetPiece.position.megaToWorld() + Displacement { 8, 12 };
}
if (uniqindex == UniqueMonsterType::WarlordOfBlood) {
position = SetPiece.position.megaToWorld() + Displacement { 6, 7 };
}
if (uniqindex == UniqueMonsterType::Zhar) {
for (int i = 0; i < themeCount; i++) {
if (i == zharlib) {
position = themeLoc[i].room.position.megaToWorld() + Displacement { 4, 4 };
break;
}
}
}
if (setlevel) {
if (uniqindex == UniqueMonsterType::Lazarus) {
position = { 32, 46 };
}
if (uniqindex == UniqueMonsterType::RedVex) {
position = { 40, 45 };
}
if (uniqindex == UniqueMonsterType::BlackJade) {
position = { 38, 49 };
}
if (uniqindex == UniqueMonsterType::SkeletonKing) {
position = { 35, 47 };
}
} else {
if (uniqindex == UniqueMonsterType::Lazarus) {
position = SetPiece.position.megaToWorld() + Displacement { 3, 6 };
}
if (uniqindex == UniqueMonsterType::RedVex) {
position = SetPiece.position.megaToWorld() + Displacement { 5, 3 };
}
if (uniqindex == UniqueMonsterType::BlackJade) {
position = SetPiece.position.megaToWorld() + Displacement { 5, 9 };
}
}
if (uniqindex == UniqueMonsterType::Butcher) {
position = SetPiece.position.megaToWorld() + Displacement { 4, 4 };
}
return position;
}
if (uniqindex == UniqueMonsterType::NaKrul) {
if (UberRow == 0 || UberCol == 0) {
UberDiabloMonsterIndex = -1;
return;
}
position = { UberRow - 2, UberCol };
UberDiabloMonsterIndex = static_cast<int>(ActiveMonsterCount);
}
void PlaceUniqueMonst(UniqueMonsterType uniqindex, size_t minionType, int bosspacksize)
{
const auto &uniqueMonsterData = UniqueMonstersData[static_cast<size_t>(uniqindex)];
const size_t typeIndex = GetMonsterTypeIndex(uniqueMonsterData.mtype);
const Point position = GetUniqueMonstPosition(uniqindex);
PlaceMonster(ActiveMonsterCount, typeIndex, position);
ActiveMonsterCount++;
Monster &monster = Monsters[ActiveMonsterCount];
ActiveMonsterCount++;
PrepareUniqueMonst(monster, uniqindex, minionType, bosspacksize, uniqueMonsterData);
}

Loading…
Cancel
Save