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"
std::mt19937 Random::getEngine() {
return gen;
}

View File

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

View File

@ -78,21 +78,42 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) {
Random random;
std::vector<TileInfo> woodTiles;
std::vector<TileInfo> stoneTiles;
std::vector<TileInfo> noneTiles;
std::vector<TileInfo> allTiles;
for (EntityID id: entityManager.getAllEntities()) {
if (auto tileComponent = entityManager.getComponent<TileGameplayComponent>(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::shuffle(woodTiles.begin(), woodTiles.end(), random.getEngine());
std::shuffle(stoneTiles.begin(), stoneTiles.end(), random.getEngine());
//1 Seets pro Spieler
std::vector<EntityID> seeds;
for (int player = 0; player < numPlayers; ++player) {
EntityID seed = allTiles[random.randomInt(0, static_cast<int>(allTiles.size()))].id;
seeds.push_back(seed);
entityManager.addComponent(seed, std::make_shared<OwnerComponent>(player-1));
if (!woodTiles.empty()) {
TileInfo woodSeed = woodTiles.back(); woodTiles.pop_back();
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
@ -100,8 +121,6 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) {
while (changed) {
changed = false;
for (PlayerID player = 0; player < static_cast<uint32_t>(numPlayers); ++player) {
// Finde alle Tiles des Spielers
int ownedCount = 0;
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) {