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); Engine.SetProgress(10);
var playerIDs;
var playerPosition;
if (!isNomad()) if (!isNomad())
{ {
let pattern = g_MapSettings.TeamPlacement || pickRandom(Object.keys(g_PlayerbaseTypes)); var [playerIDs, playerPosition] =
createBases(
[playerIDs, playerPosition] = ...playerPlacementByPattern(
createBasesByPattern( g_MapSettings.TeamPlacement,
pattern, fractionToTiles(randFloat(0.2, 0.35)),
g_PlayerbaseTypes[pattern].distance, fractionToTiles(randFloat(0.08, 0.1)),
g_PlayerbaseTypes[pattern].groupedDistance, randomAngle(),
randomAngle()); undefined),
undefined);
markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius()); markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius());
} }

View File

@ -17,7 +17,14 @@ Engine.SetProgress(10);
const teamsArray = getTeamsArray(); const teamsArray = getTeamsArray();
const startAngle = randomAngle(); 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); Engine.SetProgress(20);
// Change the starting angle and add the players again // Change the starting angle and add the players again
@ -29,7 +36,14 @@ if (teamsArray.length == 2)
if (teamsArray.length == 4) if (teamsArray.length == 4)
rotation = 5/4 * Math.PI; 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); Engine.SetProgress(40);
addElements(shuffleArray([ addElements(shuffleArray([

View File

@ -21,12 +21,15 @@ Engine.SetProgress(20);
if (!isNomad()) if (!isNomad())
{ {
let pattern = g_MapSettings.TeamPlacement || pickRandom(Object.keys(g_PlayerbaseTypes)); let pattern = g_MapSettings.TeamPlacement;
createBasesByPattern( createBases(
pattern, ...playerPlacementByPattern(
g_PlayerbaseTypes[pattern].distance, pattern,
g_PlayerbaseTypes[pattern].groupedDistance, fractionToTiles(randFloat(0.2, 0.35)),
randomAngle()); fractionToTiles(randFloat(0.08, 0.1)),
randomAngle(),
undefined),
undefined);
} }
Engine.SetProgress(40); Engine.SetProgress(40);

View File

@ -25,7 +25,15 @@ const mapSize = g_Map.getSize();
const mapCenter = g_Map.getCenter(); const mapCenter = g_Map.getCenter();
const startAngle = randomAngle(); 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); Engine.SetProgress(20);
addCenterLake(); addCenterLake();

View File

@ -22,7 +22,14 @@ Engine.SetProgress(10);
const teamsArray = getTeamsArray(); const teamsArray = getTeamsArray();
const startAngle = randomAngle(); 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); Engine.SetProgress(20);
placeBarriers(); placeBarriers();

View File

@ -25,7 +25,14 @@ createArea(
Engine.SetProgress(10); 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); Engine.SetProgress(20);
createSunkenTerrain(); createSunkenTerrain();

View File

@ -604,6 +604,31 @@ function getTeamsArray()
return teams.filter(team => true); 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. * Determine player starting positions on a circular pattern.
*/ */

View File

@ -148,7 +148,15 @@ function pickSize(sizes)
*/ */
function createBasesByPattern(type, distance, groupedDistance, startAngle) 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) function createBases(playerIDs, playerPosition, walls)

View File

@ -17,7 +17,15 @@ createArea(
Engine.SetProgress(20); 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()); markPlayerAvoidanceArea(playerPosition, defaultPlayerBaseRadius());
Engine.SetProgress(30); Engine.SetProgress(30);