From 0c96ef790610979ae4ec338c41bfce8ebb90dd18 Mon Sep 17 00:00:00 2001 From: phosit Date: Fri, 18 Jul 2025 19:58:04 +0200 Subject: [PATCH] Add stronghold placement to Cantabrian Highlands With stronghold each team is placed on a hill. With stronghold placement the hills are bigger. On tiny maps the ramps might overlap and enemies might not be reachable. To prevent that the ramps are shortened and the angle is changed to point more towards the center of the map. Refs: #7717 --- .../maps/random/cantabrian_highlands.js | 22 ++++++++++--------- .../maps/random/cantabrian_highlands.json | 6 ++++- .../public/maps/random/rmgen-common/player.js | 11 +++++++++- 3 files changed, 27 insertions(+), 12 deletions(-) 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 }; }