1
1
#include " BetterTerrainPP.hpp"
2
2
#include < godot_cpp/core/class_db.hpp>
3
3
#include < godot_cpp/variant/utility_functions.hpp>
4
+ #include < godot_cpp/templates/hashfuncs.hpp>
4
5
5
6
#include < godot_cpp/classes/tile_set_atlas_source.hpp>
6
7
#include < set>
@@ -189,7 +190,7 @@ BetterTerrainPP::Placement BetterTerrainPP::empty_placement{-1, godot::Vector2i(
189
190
190
191
void BetterTerrainPP::_bind_methods ()
191
192
{
192
- godot::ClassDB::bind_method (godot::D_METHOD (" init" , " map" ), &BetterTerrainPP::init);
193
+ godot::ClassDB::bind_method (godot::D_METHOD (" init" , " map" , " fixed_random_seed " ), &BetterTerrainPP::init, DEFVAL ( false ) );
193
194
godot::ClassDB::bind_method (godot::D_METHOD (" get_cell" , " layer" , " coord" ), &BetterTerrainPP::get_cell);
194
195
godot::ClassDB::bind_method (godot::D_METHOD (" set_cells" , " layer" , " coords" , " type" ), &BetterTerrainPP::set_cells);
195
196
godot::ClassDB::bind_method (godot::D_METHOD (" set_cell" , " layer" , " coord" , " type" ), &BetterTerrainPP::set_cell);
@@ -198,7 +199,7 @@ void BetterTerrainPP::_bind_methods()
198
199
godot::ClassDB::bind_method (godot::D_METHOD (" update_terrain_area" , " layer" , " area" , " and_surrounding_cells" ), &BetterTerrainPP::update_terrain_area, DEFVAL (true ));
199
200
}
200
201
201
- bool BetterTerrainPP::init (godot::TileMap* map)
202
+ bool BetterTerrainPP::init (godot::TileMap* map, bool fixed_random_seed )
202
203
{
203
204
if (!map)
204
205
return false ;
@@ -286,6 +287,7 @@ bool BetterTerrainPP::init(godot::TileMap* map)
286
287
}
287
288
}
288
289
290
+ m_fixed_random_seed = fixed_random_seed;
289
291
m_rng.randomize ();
290
292
return true ;
291
293
}
@@ -526,7 +528,7 @@ const BetterTerrainPP::Placement* BetterTerrainPP::update_tile_tiles(godot::Vect
526
528
if (best.empty ())
527
529
return nullptr ;
528
530
529
- return weighted_selection (best, apply_empty_probability);
531
+ return weighted_selection (best, coord, apply_empty_probability);
530
532
}
531
533
532
534
const BetterTerrainPP::Placement* BetterTerrainPP::update_tile_vertices (godot::Vector2i coord, const std::map<godot::Vector2i, int >& types) const
@@ -563,7 +565,7 @@ const BetterTerrainPP::Placement* BetterTerrainPP::update_tile_vertices(godot::V
563
565
if (best.empty ())
564
566
return nullptr ;
565
567
566
- return weighted_selection (best, false );
568
+ return weighted_selection (best, coord, false );
567
569
}
568
570
569
571
int BetterTerrainPP::probe (godot::Vector2i coord, int peering, int type, const std::map<godot::Vector2i, int >& types) const
@@ -586,11 +588,14 @@ int BetterTerrainPP::probe(godot::Vector2i coord, int peering, int type, const s
586
588
return *std::min_element (targets.begin (), targets.end ());
587
589
}
588
590
589
- const BetterTerrainPP::Placement* BetterTerrainPP::weighted_selection (const std::vector<const Placement*>& choices, bool apply_empty_probability) const
591
+ const BetterTerrainPP::Placement* BetterTerrainPP::weighted_selection (const std::vector<const Placement*>& choices, const godot::Vector2i& coord, bool apply_empty_probability) const
590
592
{
591
593
if (choices.empty ())
592
594
return nullptr ;
593
595
596
+ if (m_fixed_random_seed)
597
+ m_rng.set_seed (godot::HashMapHasherDefault::hash (coord));
598
+
594
599
if (apply_empty_probability)
595
600
{
596
601
double best = 0.0 ;
0 commit comments