diff --git a/src/engine/toolbox/Random.cpp b/src/engine/toolbox/Random.cpp index f46e530..5c145fd 100644 --- a/src/engine/toolbox/Random.cpp +++ b/src/engine/toolbox/Random.cpp @@ -3,3 +3,7 @@ // #include "Random.h" + +std::mt19937 Random::getEngine() { + return gen; +} diff --git a/src/engine/toolbox/Random.h b/src/engine/toolbox/Random.h index 51355fa..452e041 100644 --- a/src/engine/toolbox/Random.h +++ b/src/engine/toolbox/Random.h @@ -29,6 +29,8 @@ public: return dist(gen); } + std::mt19937 getEngine(); + private: std::mt19937 gen; }; diff --git a/src/game/hexWorld/MapGenerator.cpp b/src/game/hexWorld/MapGenerator.cpp index 03a2d60..b2793c5 100644 --- a/src/game/hexWorld/MapGenerator.cpp +++ b/src/game/hexWorld/MapGenerator.cpp @@ -78,21 +78,42 @@ void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) { Random random; + std::vector woodTiles; + std::vector stoneTiles; + std::vector noneTiles; std::vector allTiles; for (EntityID id: entityManager.getAllEntities()) { if (auto tileComponent = entityManager.getComponent(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(allTiles.size() / numPlayers * (1.f / numPlayers)); // z.B. 60% der Map + + + int maxTilesPerPlayer = static_cast((woodTiles.size() + stoneTiles.size() + noneTiles.size()) / numPlayers * (1.f / numPlayers)); // z.B. 60% der Map std::unordered_set assigned; + std::shuffle(woodTiles.begin(), woodTiles.end(), random.getEngine()); + std::shuffle(stoneTiles.begin(), stoneTiles.end(), random.getEngine()); + //1 Seets pro Spieler std::vector seeds; for (int player = 0; player < numPlayers; ++player) { - EntityID seed = allTiles[random.randomInt(0, static_cast(allTiles.size()))].id; - seeds.push_back(seed); - entityManager.addComponent(seed, std::make_shared(player-1)); + if (!woodTiles.empty()) { + TileInfo woodSeed = woodTiles.back(); woodTiles.pop_back(); + entityManager.addComponent(woodSeed.id, std::make_shared(player)); + seeds.push_back(woodSeed.id); + } + + if (!stoneTiles.empty()) { + TileInfo stoneSeed = stoneTiles.back(); stoneTiles.pop_back(); + entityManager.addComponent(stoneSeed.id, std::make_shared(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(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) {