UPD: Consider ResourceTypes

This commit is contained in:
sebastian 2026-02-14 18:27:03 +01:00
parent 762550fccf
commit e7094dd7de
3 changed files with 31 additions and 7 deletions

View File

@ -3,3 +3,7 @@
// //
#include "Random.h" #include "Random.h"
std::mt19937 Random::getEngine() {
return gen;
}

View File

@ -29,6 +29,8 @@ public:
return dist(gen); return dist(gen);
} }
std::mt19937 getEngine();
private: private:
std::mt19937 gen; std::mt19937 gen;
}; };

View File

@ -78,21 +78,42 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) {
Random random; Random random;
std::vector<TileInfo> woodTiles;
std::vector<TileInfo> stoneTiles;
std::vector<TileInfo> noneTiles;
std::vector<TileInfo> allTiles; std::vector<TileInfo> allTiles;
for (EntityID id: entityManager.getAllEntities()) { for (EntityID id: entityManager.getAllEntities()) {
if (auto tileComponent = entityManager.getComponent<TileGameplayComponent>(id)) { if (auto tileComponent = entityManager.getComponent<TileGameplayComponent>(id)) {
allTiles.push_back({tileComponent->q, tileComponent->r, id}); allTiles.push_back({tileComponent->q, tileComponent->r, id});
switch (tileComponent->ressourceType) {
case RessourceType::WOOD: woodTiles.push_back({tileComponent->q, tileComponent->r, id}); break;
case RessourceType::STONE: stoneTiles.push_back({tileComponent->q, tileComponent->r, id}); break;
default: noneTiles.push_back({tileComponent->q, tileComponent->r, id}); break;
} }
} }
int maxTilesPerPlayer = static_cast<int>(allTiles.size() / numPlayers * (1.f / numPlayers)); // z.B. 60% der Map }
int maxTilesPerPlayer = static_cast<int>((woodTiles.size() + stoneTiles.size() + noneTiles.size()) / numPlayers * (1.f / numPlayers)); // z.B. 60% der Map
std::unordered_set<EntityID> assigned; std::unordered_set<EntityID> assigned;
std::shuffle(woodTiles.begin(), woodTiles.end(), random.getEngine());
std::shuffle(stoneTiles.begin(), stoneTiles.end(), random.getEngine());
//1 Seets pro Spieler //1 Seets pro Spieler
std::vector<EntityID> seeds; std::vector<EntityID> seeds;
for (int player = 0; player < numPlayers; ++player) { for (int player = 0; player < numPlayers; ++player) {
EntityID seed = allTiles[random.randomInt(0, static_cast<int>(allTiles.size()))].id; if (!woodTiles.empty()) {
seeds.push_back(seed); TileInfo woodSeed = woodTiles.back(); woodTiles.pop_back();
entityManager.addComponent(seed, std::make_shared<OwnerComponent>(player-1)); entityManager.addComponent(woodSeed.id, std::make_shared<OwnerComponent>(player));
seeds.push_back(woodSeed.id);
}
if (!stoneTiles.empty()) {
TileInfo stoneSeed = stoneTiles.back(); stoneTiles.pop_back();
entityManager.addComponent(stoneSeed.id, std::make_shared<OwnerComponent>(player));
seeds.push_back(stoneSeed.id);
}
} }
// 2. Expansion // 2. Expansion
@ -100,8 +121,6 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) {
while (changed) { while (changed) {
changed = false; changed = false;
for (PlayerID player = 0; player < static_cast<uint32_t>(numPlayers); ++player) { for (PlayerID player = 0; player < static_cast<uint32_t>(numPlayers); ++player) {
// Finde alle Tiles des Spielers // Finde alle Tiles des Spielers
int ownedCount = 0; int ownedCount = 0;
for (TileInfo& tile : allTiles) { for (TileInfo& tile : allTiles) {
@ -137,7 +156,6 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) {
} }
} }
} }
} }
bool MapGenerator::areHexNeighbors(int q1, int r1, int q2, int r2) { bool MapGenerator::areHexNeighbors(int q1, int r1, int q2, int r2) {