Move createBasesByPattern() functionality from rmgen2 to rmgen-common

This means deprecate `createBasesByPattern` in rmgen2 and add new
function `playerPlacementByPattern` in common

Differential revision: https://code.wildfiregames.com/D5194
This was SVN commit r27943.
This commit is contained in:
marder 2023-11-19 15:21:26 +00:00
parent 818ed56c0e
commit 56f15f0869
9 changed files with 102 additions and 23 deletions

View File

@ -18,18 +18,17 @@ createArea(
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());
}

View File

@ -17,7 +17,14 @@ Engine.SetProgress(10);
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 == 2)
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([

View File

@ -21,12 +21,15 @@ Engine.SetProgress(20);
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);

View File

@ -25,7 +25,15 @@ const mapSize = g_Map.getSize();
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();

View File

@ -22,7 +22,14 @@ Engine.SetProgress(10);
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();

View File

@ -25,7 +25,14 @@ createArea(
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();

View File

@ -604,6 +604,31 @@ function getTeamsArray()
return teams.filter(team => true);
}
/**
* 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.
*/

View File

@ -148,7 +148,15 @@ function pickSize(sizes)
*/
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)

View File

@ -17,7 +17,15 @@ createArea(
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);