Skip to content

Commit b66c2f1

Browse files
author
Portponky
committed
Implement fixed random seed mode for consistent decorations, etc.
1 parent e4a93f0 commit b66c2f1

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

src/BetterTerrainPP.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "BetterTerrainPP.hpp"
22
#include <godot_cpp/core/class_db.hpp>
33
#include <godot_cpp/variant/utility_functions.hpp>
4+
#include <godot_cpp/templates/hashfuncs.hpp>
45

56
#include <godot_cpp/classes/tile_set_atlas_source.hpp>
67
#include <set>
@@ -189,7 +190,7 @@ BetterTerrainPP::Placement BetterTerrainPP::empty_placement{-1, godot::Vector2i(
189190

190191
void BetterTerrainPP::_bind_methods()
191192
{
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));
193194
godot::ClassDB::bind_method(godot::D_METHOD("get_cell", "layer", "coord"), &BetterTerrainPP::get_cell);
194195
godot::ClassDB::bind_method(godot::D_METHOD("set_cells", "layer", "coords", "type"), &BetterTerrainPP::set_cells);
195196
godot::ClassDB::bind_method(godot::D_METHOD("set_cell", "layer", "coord", "type"), &BetterTerrainPP::set_cell);
@@ -198,7 +199,7 @@ void BetterTerrainPP::_bind_methods()
198199
godot::ClassDB::bind_method(godot::D_METHOD("update_terrain_area", "layer", "area", "and_surrounding_cells"), &BetterTerrainPP::update_terrain_area, DEFVAL(true));
199200
}
200201

201-
bool BetterTerrainPP::init(godot::TileMap* map)
202+
bool BetterTerrainPP::init(godot::TileMap* map, bool fixed_random_seed)
202203
{
203204
if (!map)
204205
return false;
@@ -286,6 +287,7 @@ bool BetterTerrainPP::init(godot::TileMap* map)
286287
}
287288
}
288289

290+
m_fixed_random_seed = fixed_random_seed;
289291
m_rng.randomize();
290292
return true;
291293
}
@@ -526,7 +528,7 @@ const BetterTerrainPP::Placement* BetterTerrainPP::update_tile_tiles(godot::Vect
526528
if (best.empty())
527529
return nullptr;
528530

529-
return weighted_selection(best, apply_empty_probability);
531+
return weighted_selection(best, coord, apply_empty_probability);
530532
}
531533

532534
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
563565
if (best.empty())
564566
return nullptr;
565567

566-
return weighted_selection(best, false);
568+
return weighted_selection(best, coord, false);
567569
}
568570

569571
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
586588
return *std::min_element(targets.begin(), targets.end());
587589
}
588590

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
590592
{
591593
if (choices.empty())
592594
return nullptr;
593595

596+
if (m_fixed_random_seed)
597+
m_rng.set_seed(godot::HashMapHasherDefault::hash(coord));
598+
594599
if (apply_empty_probability)
595600
{
596601
double best = 0.0;

src/BetterTerrainPP.hpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ class BetterTerrainPP : public godot::Object
3333
std::map<int, std::vector<Placement>> m_cache;
3434
std::vector<int> m_terrain_types;
3535

36+
bool m_fixed_random_seed{false};
3637
mutable godot::RandomNumberGenerator m_rng;
3738

3839
protected:
3940
static void _bind_methods();
4041

4142
public:
42-
bool init(godot::TileMap* map);
43+
bool init(godot::TileMap* map, bool fixed_random_seed = false);
4344

4445
int get_cell(int layer, godot::Vector2i coord) const;
4546
bool set_cell(int layer, godot::Vector2i coord, int type);
@@ -57,6 +58,6 @@ class BetterTerrainPP : public godot::Object
5758
const Placement* update_tile_tiles(godot::Vector2i coord, const std::map<godot::Vector2i, int>& types, bool apply_empty_probability) const;
5859
const Placement* update_tile_vertices(godot::Vector2i coord, const std::map<godot::Vector2i, int>& types) const;
5960
int probe(godot::Vector2i coord, int peering, int type, const std::map<godot::Vector2i, int>& types) const;
60-
const Placement* weighted_selection(const std::vector<const Placement*>& choices, bool apply_empty_probability) const;
61+
const Placement* weighted_selection(const std::vector<const Placement*>& choices, const godot::Vector2i& coord, bool apply_empty_probability) const;
6162
};
6263

0 commit comments

Comments
 (0)