diff --git a/binaries/data/mods/public/maps/random/ambush.js b/binaries/data/mods/public/maps/random/ambush.js index 9775cbcd1b..f8e0b256f0 100644 --- a/binaries/data/mods/public/maps/random/ambush.js +++ b/binaries/data/mods/public/maps/random/ambush.js @@ -20,17 +20,15 @@ function* GenerateMap(mapSettings) yield 10; - const pattern = mapSettings.TeamPlacement || - pickRandom(["line", "radial", "randomGroup", "stronghold"]); const [playerIDs, playerPosition] = createBases( ...playerPlacementByPattern( - pattern, + mapSettings.TeamPlacement, fractionToTiles(randFloat(0.2, 0.35)), fractionToTiles(randFloat(0.08, 0.1)), randomAngle(), undefined), - g_PlayerbaseTypes[pattern].walls); + g_PlayerbaseTypes[mapSettings.TeamPlacement].walls); if (!isNomad()) markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius()); diff --git a/binaries/data/mods/public/maps/random/frontier.js b/binaries/data/mods/public/maps/random/frontier.js index ca42b79183..4594ea800f 100644 --- a/binaries/data/mods/public/maps/random/frontier.js +++ b/binaries/data/mods/public/maps/random/frontier.js @@ -23,17 +23,14 @@ function* GenerateMap(mapSettings) if (!isNomad()) { - // Note: `|| pickRandom(...)` is needed for atlas. - const pattern = mapSettings.TeamPlacement || - pickRandom(["line", "radial", "randomGroup", "stronghold"]); createBases( ...playerPlacementByPattern( - pattern, + mapSettings.TeamPlacement, fractionToTiles(randFloat(0.2, 0.35)), fractionToTiles(randFloat(0.08, 0.1)), randomAngle(), undefined), - g_PlayerbaseTypes[pattern].walls); + g_PlayerbaseTypes[mapSettings.TeamPlacement].walls); } yield 40; diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp index 74b6e88f87..7977574892 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp @@ -708,6 +708,19 @@ void MapSidebar::OnRandomGenerate(wxCommandEvent& WXUNUSED(evt)) settings.setInt("Seed", wxAtoi(wxDynamicCast(FindWindow(ID_RandomSeed), wxTextCtrl)->GetValue())); + std::default_random_engine rngEngine{std::random_device{}()}; + + std::vector playerPlacements; + for (AtIter it{settings["TeamPlacements"]["item"]}; it.defined(); ++it) + { + playerPlacements.push_back(static_cast(*it)); + } + if (!playerPlacements.empty()) + { + std::uniform_int_distribution distrib{static_cast(0), playerPlacements.size() - 1}; + settings.set("TeamPlacement", playerPlacements[distrib(rngEngine)].c_str()); + } + std::string json = AtlasObject::SaveToJSON(settings); wxBusyInfo busy(_("Generating map"));