Index: ps/trunk/binaries/data/mods/public/maps/random/ambush.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/ambush.js +++ ps/trunk/binaries/data/mods/public/maps/random/ambush.js @@ -18,18 +18,17 @@ Engine.SetProgress(10); -var playerIDs; -var playerPosition; if (!isNomad()) { - let pattern = g_MapSettings.TeamPlacement || pickRandom(Object.keys(g_PlayerbaseTypes)); - - [playerIDs, playerPosition] = - createBasesByPattern( - pattern, - g_PlayerbaseTypes[pattern].distance, - g_PlayerbaseTypes[pattern].groupedDistance, - randomAngle()); + var [playerIDs, playerPosition] = + createBases( + ...playerPlacementByPattern( + g_MapSettings.TeamPlacement, + fractionToTiles(randFloat(0.2, 0.35)), + fractionToTiles(randFloat(0.08, 0.1)), + randomAngle(), + undefined), + undefined); markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius()); } Index: ps/trunk/binaries/data/mods/public/maps/random/empire.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/empire.js +++ ps/trunk/binaries/data/mods/public/maps/random/empire.js @@ -17,7 +17,14 @@ const teamsArray = getTeamsArray(); const startAngle = randomAngle(); -createBasesByPattern("stronghold", fractionToTiles(0.37), fractionToTiles(0.04), startAngle); +createBases( + ...playerPlacementByPattern( + "stronghold", + fractionToTiles(0.37), + fractionToTiles(0.04), + startAngle, + undefined), + undefined); Engine.SetProgress(20); // Change the starting angle and add the players again @@ -29,7 +36,14 @@ if (teamsArray.length == 4) rotation = 5/4 * Math.PI; -createBasesByPattern("stronghold", fractionToTiles(0.15), fractionToTiles(0.04), startAngle + rotation); +createBases( + ...playerPlacementByPattern( + "stronghold", + fractionToTiles(0.15), + fractionToTiles(0.04), + startAngle + rotation, + undefined), + undefined); Engine.SetProgress(40); addElements(shuffleArray([ Index: ps/trunk/binaries/data/mods/public/maps/random/frontier.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/frontier.js +++ ps/trunk/binaries/data/mods/public/maps/random/frontier.js @@ -21,12 +21,15 @@ if (!isNomad()) { - let pattern = g_MapSettings.TeamPlacement || pickRandom(Object.keys(g_PlayerbaseTypes)); - createBasesByPattern( - pattern, - g_PlayerbaseTypes[pattern].distance, - g_PlayerbaseTypes[pattern].groupedDistance, - randomAngle()); + let pattern = g_MapSettings.TeamPlacement; + createBases( + ...playerPlacementByPattern( + pattern, + fractionToTiles(randFloat(0.2, 0.35)), + fractionToTiles(randFloat(0.08, 0.1)), + randomAngle(), + undefined), + undefined); } Engine.SetProgress(40); Index: ps/trunk/binaries/data/mods/public/maps/random/harbor.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/harbor.js +++ ps/trunk/binaries/data/mods/public/maps/random/harbor.js @@ -25,7 +25,15 @@ const mapCenter = g_Map.getCenter(); const startAngle = randomAngle(); -const [playerIDs, playerPosition] = createBasesByPattern("radial", fractionToTiles(0.38), fractionToTiles(0.05), startAngle); +const [playerIDs, playerPosition] = + createBases( + ...playerPlacementByPattern( + "radial", + fractionToTiles(0.38), + fractionToTiles(0.05), + startAngle, + undefined), + undefined); Engine.SetProgress(20); addCenterLake(); Index: ps/trunk/binaries/data/mods/public/maps/random/hells_pass.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/hells_pass.js +++ ps/trunk/binaries/data/mods/public/maps/random/hells_pass.js @@ -22,7 +22,14 @@ const teamsArray = getTeamsArray(); const startAngle = randomAngle(); -createBasesByPattern("line", fractionToTiles(0.2), fractionToTiles(0.08), startAngle); +createBases( + ...playerPlacementByPattern( + "line", + fractionToTiles(0.2), + fractionToTiles(0.08), + startAngle, + undefined), + undefined); Engine.SetProgress(20); placeBarriers(); Index: ps/trunk/binaries/data/mods/public/maps/random/lions_den.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/lions_den.js +++ ps/trunk/binaries/data/mods/public/maps/random/lions_den.js @@ -25,7 +25,14 @@ Engine.SetProgress(10); -createBasesByPattern("radial", fractionToTiles(0.4), fractionToTiles(randFloat(0.05, 0.1)), startAngle); +createBases( + ...playerPlacementByPattern( + "radial", + fractionToTiles(0.4), + fractionToTiles(randFloat(0.05, 0.1)), + startAngle, + undefined), + undefined); Engine.SetProgress(20); createSunkenTerrain(); Index: ps/trunk/binaries/data/mods/public/maps/random/rmgen-common/player.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmgen-common/player.js +++ ps/trunk/binaries/data/mods/public/maps/random/rmgen-common/player.js @@ -605,6 +605,31 @@ } /** + * Determine player starting positions based on the specified pattern. + */ +function playerPlacementByPattern(patternName, distance = undefined, groupedDistance = undefined, angle = undefined, center = undefined) +{ + if (patternName === undefined) + patternName = g_MapSettings.TeamPlacement; + + switch (patternName) + { + case "radial": + return playerPlacementCircle(distance, angle, center); + case "river": + return playerPlacementRiver(angle, distance, center); + case "line": + return placeLine(getTeamsArray(), distance, groupedDistance, angle); + case "stronghold": + return placeStronghold(getTeamsArray(), distance, groupedDistance, angle); + case "randomGroup": + return playerPlacementRandom(sortAllPlayers(), undefined); + default: + throw new Error("Unknown placement pattern: " + patternName); + } +} + +/** * Determine player starting positions on a circular pattern. */ function playerPlacementCircle(radius, startingAngle = undefined, center = undefined) Index: ps/trunk/binaries/data/mods/public/maps/random/rmgen2/setup.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmgen2/setup.js +++ ps/trunk/binaries/data/mods/public/maps/random/rmgen2/setup.js @@ -148,7 +148,15 @@ */ function createBasesByPattern(type, distance, groupedDistance, startAngle) { - return createBases(...g_PlayerbaseTypes[type].getPosition(distance, groupedDistance, startAngle), g_PlayerbaseTypes[type].walls); + error("createBasesByPattern() has been deprecated. Use playerPlacementByPattern() instead."); + return createBases( + ...playerPlacementByPattern( + type, // patternName + distance, // distance + groupedDistance, + startAngle, // angle + undefined), // center + undefined); // walls } function createBases(playerIDs, playerPosition, walls) Index: ps/trunk/binaries/data/mods/public/maps/random/stronghold.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/stronghold.js +++ ps/trunk/binaries/data/mods/public/maps/random/stronghold.js @@ -17,7 +17,15 @@ Engine.SetProgress(20); -const [playerIDs, playerPosition] = createBasesByPattern("stronghold", fractionToTiles(randFloat(0.2, 0.35)), fractionToTiles(randFloat(0.05, 0.1)), randomAngle()); +const [playerIDs, playerPosition] = + createBases( + ...playerPlacementByPattern( + "stronghold", + fractionToTiles(randFloat(0.2, 0.35)), + fractionToTiles(randFloat(0.05, 0.1)), + randomAngle(), + undefined), + undefined); markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius()); Engine.SetProgress(30);