Skip to content

Commit e59a1a9

Browse files
Merge pull request #859 from WALLOFJUSTICE/dev-23-q3-2
* breakable selection use vector and rngs instead of priority queue f…
2 parents 5b60af7 + df76065 commit e59a1a9

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/maps.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4482,17 +4482,13 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
44824482
int dir;
44834483
int id = -1;
44844484
};
4485-
auto compFuncBreakable = [](BreakableNode_t& lhs, BreakableNode_t& rhs)
4486-
{
4487-
return lhs.walls < rhs.walls;
4488-
};
44894485
auto findBreakables = EditorEntityData_t::colliderRandomGenPool.find(map.name);
44904486
if ( findBreakables == EditorEntityData_t::colliderRandomGenPool.end() )
44914487
{
44924488
numBreakables = 0;
44934489
}
44944490
int numOpenAreaBreakables = 0;
4495-
std::priority_queue<BreakableNode_t, std::vector<BreakableNode_t>, decltype(compFuncBreakable)> breakableLocations(compFuncBreakable);
4491+
std::vector<BreakableNode_t> breakableLocations;
44964492
if ( findBreakables->first == "Underworld" )
44974493
{
44984494
numOpenAreaBreakables = 10;
@@ -4544,7 +4540,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
45444540

45454541
if ( obstacles == 0 )
45464542
{
4547-
breakableLocations.push(BreakableNode_t(1, x, y, map_rng.rand() % 4,
4543+
breakableLocations.push_back(BreakableNode_t(1, x, y, map_rng.rand() % 4,
45484544
map_rng.rand() % 2 ? 14 : 40)); // random dir, hanging cage ids
45494545
--numOpenAreaBreakables;
45504546

@@ -4801,7 +4797,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
48014797
}
48024798
}
48034799
int picked = dirs[map_rng.rand() % dirs.size()];
4804-
breakableLocations.push(BreakableNode_t(walls.size(), x, y, picked));
4800+
breakableLocations.push_back(BreakableNode_t(walls.size(), x, y, picked));
48054801
foundSpace = true;
48064802
break;
48074803
}
@@ -4835,7 +4831,21 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
48354831
Monster lastMonsterEvent = NOTHING;
48364832
while ( !breakableLocations.empty() )
48374833
{
4838-
auto& top = breakableLocations.top();
4834+
int maxNumWalls = 0;
4835+
for ( auto& b : breakableLocations )
4836+
{
4837+
maxNumWalls = std::max(b.walls, maxNumWalls);
4838+
}
4839+
std::vector<unsigned int> posChances;
4840+
int pickedPos = 0;
4841+
for ( auto& b : breakableLocations )
4842+
{
4843+
posChances.push_back(b.walls == maxNumWalls ? 1 : 0);
4844+
}
4845+
4846+
pickedPos = map_rng.discrete(posChances.data(), posChances.size());
4847+
4848+
auto& top = breakableLocations.at(pickedPos);
48394849
int x = top.x;
48404850
int y = top.y;
48414851

@@ -5008,7 +5018,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
50085018
ent->z = 24.0;
50095019
ent->flags[PASSABLE] = true;
50105020
}
5011-
breakableLocations.pop();
5021+
breakableLocations.erase(breakableLocations.begin() + pickedPos);
50125022
}
50135023
}
50145024

0 commit comments

Comments
 (0)