@@ -4482,17 +4482,13 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
4482
4482
int dir;
4483
4483
int id = -1 ;
4484
4484
};
4485
- auto compFuncBreakable = [](BreakableNode_t& lhs, BreakableNode_t& rhs)
4486
- {
4487
- return lhs.walls < rhs.walls ;
4488
- };
4489
4485
auto findBreakables = EditorEntityData_t::colliderRandomGenPool.find (map.name );
4490
4486
if ( findBreakables == EditorEntityData_t::colliderRandomGenPool.end () )
4491
4487
{
4492
4488
numBreakables = 0 ;
4493
4489
}
4494
4490
int numOpenAreaBreakables = 0 ;
4495
- std::priority_queue<BreakableNode_t, std:: vector<BreakableNode_t>, decltype (compFuncBreakable)> breakableLocations (compFuncBreakable) ;
4491
+ std::vector<BreakableNode_t> breakableLocations;
4496
4492
if ( findBreakables->first == " Underworld" )
4497
4493
{
4498
4494
numOpenAreaBreakables = 10 ;
@@ -4544,7 +4540,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
4544
4540
4545
4541
if ( obstacles == 0 )
4546
4542
{
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 ,
4548
4544
map_rng.rand () % 2 ? 14 : 40 )); // random dir, hanging cage ids
4549
4545
--numOpenAreaBreakables;
4550
4546
@@ -4801,7 +4797,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
4801
4797
}
4802
4798
}
4803
4799
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));
4805
4801
foundSpace = true ;
4806
4802
break ;
4807
4803
}
@@ -4835,7 +4831,21 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
4835
4831
Monster lastMonsterEvent = NOTHING;
4836
4832
while ( !breakableLocations.empty () )
4837
4833
{
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);
4839
4849
int x = top.x ;
4840
4850
int y = top.y ;
4841
4851
@@ -5008,7 +5018,7 @@ int generateDungeon(char* levelset, Uint32 seed, std::tuple<int, int, int, int>
5008
5018
ent->z = 24.0 ;
5009
5019
ent->flags [PASSABLE] = true ;
5010
5020
}
5011
- breakableLocations.pop ( );
5021
+ breakableLocations.erase (breakableLocations. begin () + pickedPos );
5012
5022
}
5013
5023
}
5014
5024
0 commit comments