diff --git a/binaries/data/mods/public/maps/random/cantabrian_highlands.js b/binaries/data/mods/public/maps/random/cantabrian_highlands.js index 5bfa0aba45..d1ad3c4a45 100644 --- a/binaries/data/mods/public/maps/random/cantabrian_highlands.js +++ b/binaries/data/mods/public/maps/random/cantabrian_highlands.js @@ -78,25 +78,27 @@ export function* generateMap(mapSettings) const playerHillRadius = defaultPlayerBaseRadius() / (mapSettings.Nomad ? 1.5 : 1); - const { playerIDs, playerPosition, playerAngle } = playerPlacementCircle(fractionToTiles(0.35)); + const startingPlacement = playerPlacementByPattern(mapSettings.PlayerPlacement, + fractionToTiles(0.35), fractionToTiles(0.02) + 7, 0); g_Map.log("Creating player hills and ramps"); - for (let i = 0; i < numPlayers; ++i) + const hillPositions = startingPlacement.teamPosition ?? startingPlacement.playerPosition; + const hillAngles = startingPlacement.teamAngle ?? startingPlacement.playerAngle; + for (let i = 0; i < hillPositions.length; ++i) { - createArea( - new ClumpPlacer(diskArea(playerHillRadius), 0.95, 0.6, Infinity, playerPosition[i]), + const hillRadius = (startingPlacement.strongholdRadius?.[i] ?? 0) + playerHillRadius; + createArea(new ClumpPlacer(diskArea(hillRadius), 0.95, 0.6, Infinity, hillPositions[i]), [ new LayeredPainter([tCliff, tHill], [2]), new SmoothElevationPainter(ELEVATION_SET, heightHill, 2), new TileClassPainter(clPlayer) ]); - const angle = playerAngle[i] + Math.PI * (1 + randFloat(-1, 1) / 8); + const angle = hillAngles[i] + Math.PI * (1 + randFloat(-1, 1) * fractionToTiles(0.005) / 8); createPassage({ - "start": Vector2D.add(playerPosition[i], new Vector2D(playerHillRadius + 15, 0) - .rotate(-angle)), - "end": Vector2D.add(playerPosition[i], new Vector2D(playerHillRadius - 3, 0) - .rotate(-angle)), + "start": Vector2D.add(hillPositions[i], + new Vector2D(hillRadius + 5 + fractionToTiles(0.02), 0).rotate(-angle)), + "end": Vector2D.add(hillPositions[i], new Vector2D(hillRadius - 3, 0).rotate(-angle)), "startWidth": 10, "endWidth": 10, "smoothWidth": 2, @@ -107,7 +109,7 @@ export function* generateMap(mapSettings) } placePlayerBases({ - "PlayerPlacement": [playerIDs, playerPosition], + "PlayerPlacement": startingPlacement, "PlayerTileClass": clPlayer, "BaseResourceClass": clBaseResource, "Walls": false, diff --git a/binaries/data/mods/public/maps/random/cantabrian_highlands.json b/binaries/data/mods/public/maps/random/cantabrian_highlands.json index 3668d7d632..e4dbc3d439 100644 --- a/binaries/data/mods/public/maps/random/cantabrian_highlands.json +++ b/binaries/data/mods/public/maps/random/cantabrian_highlands.json @@ -6,6 +6,10 @@ "SupportedBiomes": "generic/", "Keywords": ["multiplayer"], "Preview" : "cantabrian_highlands.png", - "CircularMap" : true + "CircularMap" : true, + "PlayerPlacements": [ + "circle", + "stronghold" + ] } } diff --git a/binaries/data/mods/public/maps/random/rmgen-common/player.js b/binaries/data/mods/public/maps/random/rmgen-common/player.js index c7f804048f..e83e203c03 100644 --- a/binaries/data/mods/public/maps/random/rmgen-common/player.js +++ b/binaries/data/mods/public/maps/random/rmgen-common/player.js @@ -804,6 +804,9 @@ function placeStronghold(teamsArray, distance, groupedDistance, startAngle) const playerIDs = []; const playerPosition = []; + const teamPositions = []; + const teamAngles = []; + const strongholdRadius = []; for (let i = 0; i < teamsArray.length; ++i) { @@ -828,11 +831,17 @@ function placeStronghold(teamsArray, distance, groupedDistance, startAngle) playerIDs.push(teamsArray[i][p]); playerPosition.push(Vector2D.add(teamPosition, new Vector2D(teamGroupDistance, 0).rotate(-angle)).round()); } + teamPositions.push(teamPosition); + teamAngles.push(teamAngle); + strongholdRadius.push(teamGroupDistance); } return { "playerIDs": playerIDs, - "playerPosition": playerPosition + "playerPosition": playerPosition, + "teamPosition": teamPositions, + "teamAngle": teamAngles, + "strongholdRadius": strongholdRadius }; }