diff --git a/binaries/data/mods/public/maps/random/aegean_sea.js b/binaries/data/mods/public/maps/random/aegean_sea.js index 50ea4e1e10..0953ced1ea 100644 --- a/binaries/data/mods/public/maps/random/aegean_sea.js +++ b/binaries/data/mods/public/maps/random/aegean_sea.js @@ -62,17 +62,7 @@ var clHill = createTileClass(); var clIsland = createTileClass(); var clCorals = createTileClass(); -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); - -var playerX = []; -var playerZ = []; - -for (var i = 0; i < numPlayers; i++) -{ - playerZ[i] = playerPos[i]; - playerX[i] = 0.2 + 0.6*(i%2); -} +var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6); for (var i = 0; i < numPlayers; i++) { diff --git a/binaries/data/mods/public/maps/random/corinthian_isthmus.js b/binaries/data/mods/public/maps/random/corinthian_isthmus.js index 8f8a204013..a21588ecba 100644 --- a/binaries/data/mods/public/maps/random/corinthian_isthmus.js +++ b/binaries/data/mods/public/maps/random/corinthian_isthmus.js @@ -62,8 +62,8 @@ var landHeight = getMapBaseHeight(); var waterHeight = -4; log("Creating the main river"); +var riverAngle = randFloat(0, Math.PI); var riverWidth = scaleByMapSize(15, 70); -var riverAngle = -Math.PI / 4; var riverStart = new Vector2D(mapCenter.x, 0).rotateAround(riverAngle, mapCenter); var riverEnd = new Vector2D(mapCenter.x, mapSize).rotateAround(riverAngle, mapCenter); @@ -102,17 +102,7 @@ paintTerrainBasedOnHeight(2, 5, 1, tGrass); paintTileClassBasedOnHeight(-6, 0.5, 1, clWater); -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); - -var playerX = []; -var playerZ = []; - -for (var i = 0; i < numPlayers; i++) -{ - playerZ[i] = Math.sqrt(0.5)*(0.6*(i%2) - 0.8 + playerPos[i]) + 0.5; - playerX[i] = Math.sqrt(0.5)*(0.6*(i%2) + 0.2 - playerPos[i]) + 0.5; -} +var [playerIDs, playerX, playerZ] = playerPlacementRiver(riverAngle + Math.PI / 2, 0.6); for (var i = 0; i < numPlayers; i++) { diff --git a/binaries/data/mods/public/maps/random/danubius.js b/binaries/data/mods/public/maps/random/danubius.js index d9a687569c..68e7a6aff8 100644 --- a/binaries/data/mods/public/maps/random/danubius.js +++ b/binaries/data/mods/public/maps/random/danubius.js @@ -311,17 +311,7 @@ if (gallicCC) } RMS.SetProgress(10); -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); - -var playerX = []; -var playerZ = []; - -for (let i = 0; i < numPlayers; ++i) -{ - playerZ[i] = playerPos[i]; - playerX[i] = 0.2 + 0.6 * (i % 2); -} +var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6); for (let i = 0; i < numPlayers; ++i) { diff --git a/binaries/data/mods/public/maps/random/english_channel.js b/binaries/data/mods/public/maps/random/english_channel.js index 97fd188c64..6f89036067 100644 --- a/binaries/data/mods/public/maps/random/english_channel.js +++ b/binaries/data/mods/public/maps/random/english_channel.js @@ -56,18 +56,7 @@ var clShallow = createTileClass(); var landHeight = 3; var waterHeight = -4; -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); - -var playerX = []; -var playerZ = []; - -for (var i = 0; i < numPlayers; i++) -{ - playerZ[i] = 0.2 + 0.6*(i%2); - playerX[i] = playerPos[i]; -} - +var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.6); for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; diff --git a/binaries/data/mods/public/maps/random/lorraine_plain.js b/binaries/data/mods/public/maps/random/lorraine_plain.js index 7daa298874..5f73a08234 100644 --- a/binaries/data/mods/public/maps/random/lorraine_plain.js +++ b/binaries/data/mods/public/maps/random/lorraine_plain.js @@ -50,18 +50,9 @@ var clFood = createTileClass(); var clBaseResource = createTileClass(); var clShallow = createTileClass(); -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); var waterHeight = -4; -var playerX = []; -var playerZ = []; - -for (var i = 0; i < numPlayers; i++) -{ - playerZ[i] = 0.25 + 0.5*(i%2); - playerX[i] = playerPos[i]; -} +var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.5); for (var i = 0; i < numPlayers; i++) { diff --git a/binaries/data/mods/public/maps/random/rmgen/player.js b/binaries/data/mods/public/maps/random/rmgen/player.js index 55fc011f04..a020f5f1b7 100644 --- a/binaries/data/mods/public/maps/random/rmgen/player.js +++ b/binaries/data/mods/public/maps/random/rmgen/player.js @@ -139,16 +139,19 @@ function radialPlayerPlacement(radius = 0.35, startingAngle = undefined, centerX } /** - * Returns an array of percent numbers indicating the player location on river maps. - * For example [0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8] for a 4v4 or - * [0.25, 0.33, 0.5, 0.67, 0.75] for a 2v3. + * Returns player starting positions located on two parallel lines, typically used by central river maps. + * If there are two teams with an equal number of players, each team will occupy exactly one line. + * Angle 0 means the players are placed in north to south direction, i.e. along the Z axis. */ -function placePlayersRiver() +function playerPlacementRiver(angle, width) { - let playerPos = []; + let positions = []; + let numPlayers = getNumPlayers(); let numPlayersEven = numPlayers % 2 == 0; + let mapCenter = new Vector2D(0.5, 0.5); + for (let i = 0; i < numPlayers; ++i) { let currentPlayerEven = i % 2 == 0; @@ -156,10 +159,12 @@ function placePlayersRiver() let offsetDivident = numPlayersEven || currentPlayerEven ? (i + 1) % 2 : 0; let offsetDivisor = numPlayersEven ? 0 : currentPlayerEven ? +1 : -1; - playerPos[i] = ((i - 1 + offsetDivident) / 2 + 1) / ((numPlayers + offsetDivisor) / 2 + 1); + positions[i] = new Vector2D( + width * (i % 2) + (1 - width) / 2, + ((i - 1 + offsetDivident) / 2 + 1) / ((numPlayers + offsetDivisor) / 2 + 1)).rotateAround(angle, mapCenter); } - return playerPos; + return [primeSortAllPlayers(), positions.map(p => p.x), positions.map(p => p.y)]; } /*** diff --git a/binaries/data/mods/public/maps/random/the_nile.js b/binaries/data/mods/public/maps/random/the_nile.js index 14ffb39ede..0aec27bdfb 100644 --- a/binaries/data/mods/public/maps/random/the_nile.js +++ b/binaries/data/mods/public/maps/random/the_nile.js @@ -61,16 +61,7 @@ var clPond = createTileClass(); var clShore = createTileClass(); var clTreasure = createTileClass(); -var playerIDs = primeSortAllPlayers(); -var playerPos = placePlayersRiver(); -var playerX = []; -var playerZ = []; - -for (var i = 0; i < numPlayers; i++) -{ - playerZ[i] = playerPos[i]; - playerX[i] = 0.30 + 0.4*(i%2); -} +var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.4); for (var i = 0; i < numPlayers; i++) { 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 cb8553e8d7..53d6491804 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 @@ -317,17 +317,7 @@ function unknownCentralSea() if (g_PlayerBases) { - playerIDs = primeSortAllPlayers(); - let playerPos = placePlayersRiver(); - - for (let i = 0; i < numPlayers; ++i) - { - playerX[i] = playerPos[i]; - playerZ[i] = 0.2 + 0.6 * (i % 2); - } - - if (!horizontal) - [playerX, playerZ] = [playerZ, playerX]; + [playerIDs, playerX, playerZ] = playerPlacementRiver(horizontal ? Math.PI / 2 : 0, 0.6); markPlayerArea("small"); } @@ -370,18 +360,7 @@ function unknownCentralRiver() if (g_PlayerBases) { - playerIDs = primeSortAllPlayers(); - let playerPos = placePlayersRiver(); - - for (let i = 0; i < numPlayers; ++i) - { - playerX[i] = playerPos[i]; - playerZ[i] = 0.25 + 0.5*(i%2); - } - - if (!horizontal) - [playerX, playerZ] = [playerZ, playerX]; - + [playerIDs, playerX, playerZ] = playerPlacementRiver(horizontal ? Math.PI / 2 : 0, 0.5); markPlayerArea("large"); }