diff --git a/binaries/data/mods/public/maps/random/lorraine_plain.js b/binaries/data/mods/public/maps/random/lorraine_plain.js index 30cc3f35a9..2324e22e69 100644 --- a/binaries/data/mods/public/maps/random/lorraine_plain.js +++ b/binaries/data/mods/public/maps/random/lorraine_plain.js @@ -38,6 +38,7 @@ const pForestR = [tGrassDForest + TERRAIN_SEPARATOR + oBeech, tGrassDForest, tGr InitMap(); const numPlayers = getNumPlayers(); +const mapSize = getMapSize(); var clPlayer = createTileClass(); var clHill = createTileClass(); @@ -51,6 +52,8 @@ var clBaseResource = createTileClass(); var clShallow = createTileClass(); var waterHeight = -4; +var shallowHeight = -2; +var shallowWidth = scaleByMapSize(8, 12); var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.5); @@ -133,6 +136,7 @@ for (var i = 0; i < numPlayers; i++) ); createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); } +Engine.SetProgress(20); log("Creating the main river..."); var river1 = [1, fractionToTiles(0.5)]; @@ -141,6 +145,7 @@ createArea( new PathPlacer(...river1, ...river2, scaleByMapSize(10, 20), 0.5, 3 * scaleByMapSize(1, 4), 0.1, 0.01), new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), avoidClasses(clPlayer, 4)); +Engine.SetProgress(25); log("Creating small puddles at the map border to ensure players being separated..."); for (let [fx, fz] of [river1, river2]) @@ -148,24 +153,25 @@ for (let [fx, fz] of [river1, river2]) new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(5, 10))), 0.95, 0.6, 10, fx, fz), new SmoothElevationPainter(ELEVATION_SET, waterHeight, 2), avoidClasses(clPlayer, 8)); +Engine.SetProgress(30); log("Creating the shallows of the main river..."); for (let i = 0; i <= randIntInclusive(3, scaleByMapSize(4, 6)); ++i) { - let cLocation = Math.floor(fractionToTiles(randFloat(0.15, 0.85))); - createShallowsPassage( - cLocation, - Math.floor(fractionToTiles(0.35)), - cLocation, - Math.floor(fractionToTiles(0.65)), - scaleByMapSize(4, 8), - -2, - -2, - 2, - clShallow, - undefined, - waterHeight); + let location = randFloat(0.15, 0.85); + createPassage({ + "start": new Vector2D(location, 0).mult(mapSize), + "end": new Vector2D(location, 1).mult(mapSize), + "startWidth": shallowWidth, + "endWidth": shallowWidth, + "smoothWidth": 2, + "startHeight": shallowHeight, + "endHeight": shallowHeight, + "maxHeight": shallowHeight, + "tileClass": clShallow + }); } +Engine.SetProgress(35); createTributaryRivers( true, @@ -178,6 +184,8 @@ createTributaryRivers( clShallow, avoidClasses(clPlayer, 3, clBaseResource, 4)); +Engine.SetProgress(40); + paintTerrainBasedOnHeight(-5, 1, 1, tWater); paintTerrainBasedOnHeight(1, 2, 1, pForestR); paintTileClassBasedOnHeight(-6, 0.5, 1, clWater); diff --git a/binaries/data/mods/public/maps/random/rmgen/gaia_terrain.js b/binaries/data/mods/public/maps/random/rmgen/gaia_terrain.js index 5c9fc74d09..48275377b1 100644 --- a/binaries/data/mods/public/maps/random/rmgen/gaia_terrain.js +++ b/binaries/data/mods/public/maps/random/rmgen/gaia_terrain.js @@ -466,6 +466,7 @@ function createTributaryRivers(horizontal, riverCount, riverWidth, waterHeight, let smoothness = scaleByMapSize(3, 12); let offset = 0.1; let tapering = 0.05; + let shallowHeight = -2; let riverAngle = horizontal ? 0 : Math.PI / 2; let mapSize = getMapSize(); @@ -521,65 +522,17 @@ function createTributaryRivers(horizontal, riverCount, riverWidth, waterHeight, // Create shallows if (shallowTileClass) for (let z of [0.25, 0.75]) - { - let m1 = [Math.round(fractionToTiles(0.2)), Math.round(fractionToTiles(z))]; - let m2 = [Math.round(fractionToTiles(0.8)), Math.round(fractionToTiles(z))]; - - if (!horizontal) - { - m1.reverse(); - m2.reverse(); - } - - createShallowsPassage(...m1, ...m2, scaleByMapSize(4, 8), -2, -2, 2, shallowTileClass, undefined, waterHeight); - } -} - -/** - * Create shallow water between (x1, z1) and (x2, z2) of tiles below maxHeight. - */ -function createShallowsPassage(x1, z1, x2, z2, width, maxHeight, shallowHeight, smooth, tileClass, terrain, riverHeight) -{ - let a = z1 - z2; - let b = x2 - x1; - - let distance = Math.euclidDistance2D(x1, z1, x2, z2); - let mapSize = getMapSize(); - - for (let ix = 0; ix < mapSize; ++ix) - for (let iz = 0; iz < mapSize; ++iz) - { - let c = a * (ix - x1) + b * (iz - z1); - let my = iz - b * c / Math.square(distance); - let inline = 0; - - let dis; - if (b == 0) - { - dis = Math.abs(ix - x1); - if (iz >= Math.min(z1, z2) && iz <= Math.max(z1, z2)) - inline = 1; - } - else if (my >= Math.min(z1, z2) && my <= Math.max(z1, z2)) - { - dis = Math.abs(c) / distance; - inline = 1; - } - - if (dis > width || !inline || getHeight(ix, iz) > maxHeight) - continue; - - if (dis > width - smooth) - setHeight(ix, iz, ((width - dis) * shallowHeight + riverHeight * (smooth - width + dis)) / smooth); - else if (dis <= width - smooth) - setHeight(ix, iz, shallowHeight); - - if (tileClass !== undefined) - addToClass(ix, iz, tileClass); - - if (terrain !== undefined) - placeTerrain(ix, iz, terrain); - } + createPassage({ + "start": new Vector2D(0, z).mult(mapSize).rotateAround(riverAngle, mapCenter), + "end": new Vector2D(1, z).mult(mapSize).rotateAround(riverAngle, mapCenter), + "startWidth": scaleByMapSize(8, 12), + "endWidth": scaleByMapSize(8, 12), + "smoothWidth": 2, + "startHeight": shallowHeight, + "endHeight": shallowHeight, + "maxHeight": shallowHeight, + "tileClass": shallowTileClass + }); } /** @@ -592,6 +545,7 @@ function createShallowsPassage(x1, z1, x2, z2, width, maxHeight, shallowHeight, * @property {number} endWidth * @property {number} [startHeight] - Fixed height to be used if the height at the location shouldn't be used. * @property {number} [endHeight] + * @property {number} [maxHeight] - If given, do not touch any terrain above this height. * @property {number} smoothWidth - Number of tiles at the passage border to apply height interpolation. * @property {number} [tileClass] - Marks the passage with this tile class. * @property {string} [terrain] - Texture to be painted on the passage area. @@ -618,7 +572,8 @@ function createPassage(args) { let location = Vector2D.add(locationLength, Vector2D.mult(widthDirection, stepWidth)).round(); - if (!g_Map.inMapBounds(location.x, location.y)) + if (!g_Map.inMapBounds(location.x, location.y) || + args.maxHeight !== undefined && getHeight(location.x, location.y) > args.maxHeight) continue; let smoothDistance = args.smoothWidth + Math.abs(stepWidth) - halfPassageWidth; diff --git a/binaries/data/mods/public/maps/random/sahel_watering_holes.js b/binaries/data/mods/public/maps/random/sahel_watering_holes.js index b80ae9d545..416a15e3a1 100644 --- a/binaries/data/mods/public/maps/random/sahel_watering_holes.js +++ b/binaries/data/mods/public/maps/random/sahel_watering_holes.js @@ -38,6 +38,7 @@ const pForest = [tForestFloor + TERRAIN_SEPARATOR + oBaobab, tForestFloor + TERR InitMap(); const numPlayers = getNumPlayers(); +const mapSize = getMapSize(); const mapCenter = getMapCenter(); var clPlayer = createTileClass(); @@ -53,6 +54,9 @@ var clShallows = createTileClass(); var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(); +var waterHeight = -4; +var shallowHeight = -2; + for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; @@ -143,7 +147,7 @@ for (let i = 0; i < numPlayers; ++i) createArea( new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(10, 50)) / 3), 0.95, 0.6, 10, riverStart[0][i], riverStart[1][i]), [ - new SmoothElevationPainter(ELEVATION_SET, -4, 4), + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), paintClass(clWater) ], avoidClasses(clPlayer, 5)); @@ -153,7 +157,7 @@ for (let i = 0; i < numPlayers; ++i) new PathPlacer(riverStart[0][i], riverStart[1][i], riverEnd[0][i], riverEnd[1][i], scaleByMapSize(10, 50), 0.2, 3 * scaleByMapSize(1, 4), 0.2, 0.05), [ new LayeredPainter([tShore, tWater, tWater], [1, 3]), - new SmoothElevationPainter(ELEVATION_SET, -4, 4), + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), paintClass(clWater) ], avoidClasses(clPlayer, 5)); @@ -162,24 +166,23 @@ for (let i = 0; i < numPlayers; ++i) createArea( new ClumpPlacer(Math.floor(diskArea(scaleByMapSize(10, 50)) / 5), 0.95, 0.6, 10, riverEnd[0][i], riverEnd[1][i]), [ - new SmoothElevationPainter(ELEVATION_SET, -4, 4), + new SmoothElevationPainter(ELEVATION_SET, waterHeight, 4), paintClass(clWater) ], avoidClasses(clPlayer, 5)); log("Creating shallows between neighbors..."); - createShallowsPassage( - Math.round(fractionToTiles(playerX[i])), - Math.round(fractionToTiles(playerZ[i])), - Math.round(fractionToTiles(playerX[neighborID])), - Math.round(fractionToTiles(playerZ[neighborID])), - 6, - -2, - -2, - 4, - clShallows, - undefined, - -4); + createPassage({ + "start": new Vector2D(playerX[i], playerZ[i]).mult(mapSize).round(), + "end": new Vector2D(playerX[neighborID], playerZ[neighborID]).mult(mapSize).round(), + "startWidth": 10, + "endWidth": 10, + "smoothWidth": 4, + "startHeight": shallowHeight, + "endHeight": shallowHeight, + "maxHeight": shallowHeight, + "tileClass": clShallows + }); log("Creating animals in shallows..."); let objects = [ diff --git a/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js b/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js index 8cd0c1d7eb..32402aef60 100644 --- a/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js +++ b/binaries/data/mods/public/maps/random/the_unknown/unknown_common.js @@ -354,10 +354,11 @@ function unknownCentralSea() function unknownCentralRiver() { let waterHeight = -4; - + let shallowHeight = -2; initHeight(landHeight); let horizontal = randBool(); + let riverAngle = horizontal ? 0 : Math.PI / 2; if (g_PlayerBases) { @@ -384,15 +385,18 @@ function unknownCentralRiver() log("Creating the shallows of the main river..."); for (let i = 0; i <= randIntInclusive(1, scaleByMapSize(4, 8)); ++i) { - let cLocation = randFloat(0.15, 0.85); - let x1 = [fractionToTiles(cLocation), fractionToTiles(0.35)]; - let x2 = [fractionToTiles(cLocation), fractionToTiles(0.65)]; - if (!horizontal) - { - x1.reverse(); - x2.reverse(); - } - createShallowsPassage(...x1, ...x2, scaleByMapSize(4, 8), -2, -2, 2, clShallow, undefined, waterHeight); + let location = randFloat(0.15, 0.85); + createPassage({ + "start": new Vector2D(location, 0).mult(mapSize).rotateAround(riverAngle, mapCenter), + "end": new Vector2D(location, 1).mult(mapSize).rotateAround(riverAngle, mapCenter), + "startWidth": scaleByMapSize(8, 12), + "endWidth": scaleByMapSize(8, 12), + "smoothWidth": 2, + "startHeight": shallowHeight, + "endHeight": shallowHeight, + "maxHeight": shallowHeight, + "tileClass": clShallow + }); } }