forked from 0ad/0ad
Randomizes player starting positions on random maps.
This was SVN commit r10417.
This commit is contained in:
parent
d966c5e10b
commit
5acf38c095
@ -71,6 +71,14 @@ var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
var clSettlement = createTileClass();
|
||||
|
||||
// randomize player order
|
||||
var playerIDs = [];
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs.push(i+1);
|
||||
}
|
||||
playerIDs = shuffleArray(playerIDs);
|
||||
|
||||
// place players
|
||||
|
||||
var playerX = new Array(numPlayers);
|
||||
@ -87,7 +95,8 @@ for (var i = 0; i < numPlayers; i++)
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
log("Creating base for player " + (i + 1) + "...");
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// some constants
|
||||
var radius = scaleByMapSize(15,25);
|
||||
@ -135,14 +144,14 @@ for (var i = 0; i < numPlayers; i++)
|
||||
createArea(placer, painter, null);
|
||||
|
||||
// get civ specific starting entities
|
||||
var civEntities = getStartingEntities(i);
|
||||
var civEntities = getStartingEntities(id-1);
|
||||
|
||||
// create the TC
|
||||
var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle)
|
||||
[new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
|
||||
true, null, ix, iz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
|
||||
// create starting units
|
||||
var uDist = 8;
|
||||
@ -156,7 +165,7 @@ for (var i = 0; i < numPlayers; i++)
|
||||
[new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
|
||||
true, null, ux, uz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
uAngle += PI/4;
|
||||
}
|
||||
|
||||
|
@ -96,6 +96,14 @@ var clMetal = createTileClass();
|
||||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
// randomize player order
|
||||
var playerIDs = [];
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs.push(i+1);
|
||||
}
|
||||
playerIDs = shuffleArray(playerIDs);
|
||||
|
||||
//array holding starting islands based on number of players
|
||||
var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]];
|
||||
|
||||
@ -256,6 +264,8 @@ for(var i=0;i<numIslands;i++)
|
||||
{
|
||||
if((numPlayers>=6)||(i==startingPlaces[numPlayers-1][nPlayer])){
|
||||
|
||||
var id = playerIDs[nPlayer];
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(islandX[i]);
|
||||
var fz = fractionToTiles(islandZ[i]);
|
||||
@ -270,14 +280,14 @@ if((numPlayers>=6)||(i==startingPlaces[numPlayers-1][nPlayer])){
|
||||
|
||||
|
||||
// get civ specific starting entities
|
||||
var civEntities = getStartingEntities(nPlayer);
|
||||
var civEntities = getStartingEntities(id-1);
|
||||
|
||||
// create the TC
|
||||
var group = new SimpleGroup( // elements (type, min/max count, min/max distance)
|
||||
[new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
|
||||
true, null, ix, iz
|
||||
);
|
||||
createObjectGroup(group, nPlayer+1);
|
||||
createObjectGroup(group, id);
|
||||
|
||||
// create starting units
|
||||
var uDist = 8;
|
||||
@ -291,7 +301,7 @@ if((numPlayers>=6)||(i==startingPlaces[numPlayers-1][nPlayer])){
|
||||
[new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
|
||||
true, null, ux, uz
|
||||
);
|
||||
createObjectGroup(group, nPlayer+1);
|
||||
createObjectGroup(group, id);
|
||||
uAngle += PI/4;
|
||||
}
|
||||
|
||||
|
@ -87,6 +87,14 @@ var clPlayer = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
var clSettlement = createTileClass();
|
||||
|
||||
// randomize player order
|
||||
var playerIDs = [];
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs.push(i+1);
|
||||
}
|
||||
playerIDs = shuffleArray(playerIDs);
|
||||
|
||||
// Place players
|
||||
|
||||
log("Creating players...");
|
||||
@ -395,7 +403,8 @@ RMS.SetProgress(30);
|
||||
|
||||
for (var i = 1; i <= numPlayers; i++)
|
||||
{
|
||||
log("Creating base for player " + i + "...");
|
||||
var id = playerIDs[i-1];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get fractional locations in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
@ -416,14 +425,14 @@ for (var i = 1; i <= numPlayers; i++)
|
||||
createArea(placer, [painter, elevationPainter], null);
|
||||
|
||||
// get civ specific starting entities
|
||||
var civEntities = getStartingEntities(i-1);
|
||||
var civEntities = getStartingEntities(id-1);
|
||||
|
||||
// create the TC
|
||||
var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle)
|
||||
[new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
|
||||
true, null, ix, iz
|
||||
);
|
||||
createObjectGroup(group, i);
|
||||
createObjectGroup(group, id);
|
||||
|
||||
// create starting units
|
||||
var uDist = 8;
|
||||
@ -437,7 +446,7 @@ for (var i = 1; i <= numPlayers; i++)
|
||||
[new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
|
||||
true, null, ux, uz
|
||||
);
|
||||
createObjectGroup(group, i);
|
||||
createObjectGroup(group, id);
|
||||
uAngle += PI/4;
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,14 @@ var clMetal = createTileClass();
|
||||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
// randomize player order
|
||||
var playerIDs = [];
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs.push(i+1);
|
||||
}
|
||||
playerIDs = shuffleArray(playerIDs);
|
||||
|
||||
// place players
|
||||
|
||||
var playerX = new Array(numPlayers);
|
||||
@ -85,7 +93,8 @@ for (var i = 0; i < numPlayers; i++)
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
log("Creating base for player " + (i + 1) + "...");
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// scale radius of player area by map size
|
||||
var radius = scaleByMapSize(15,25);
|
||||
@ -110,14 +119,14 @@ for (var i = 0; i < numPlayers; i++)
|
||||
createArea(placer, painter, null);
|
||||
|
||||
// get civ specific starting entities
|
||||
var civEntities = getStartingEntities(i);
|
||||
var civEntities = getStartingEntities(id-1);
|
||||
|
||||
// create the TC
|
||||
var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle)
|
||||
[new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
|
||||
true, null, ix, iz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
|
||||
// create starting units
|
||||
var uDist = 8;
|
||||
@ -131,7 +140,7 @@ for (var i = 0; i < numPlayers; i++)
|
||||
[new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
|
||||
true, null, ux, uz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
uAngle += PI/4;
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,14 @@ var clRock = createTileClass();
|
||||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
// randomize player order
|
||||
var playerIDs = [];
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs.push(i+1);
|
||||
}
|
||||
playerIDs = shuffleArray(playerIDs);
|
||||
|
||||
// place players
|
||||
|
||||
var playerX = new Array(numPlayers);
|
||||
@ -38,7 +46,8 @@ for (var i=0; i < numPlayers; i++)
|
||||
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
log("Creating base for player " + (i + 1) + "...");
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
@ -47,14 +56,14 @@ for (var i=0; i < numPlayers; i++)
|
||||
var iz = round(fz);
|
||||
|
||||
// get civ specific starting entities
|
||||
var civEntities = getStartingEntities(i);
|
||||
var civEntities = getStartingEntities(id-1);
|
||||
|
||||
// create the TC
|
||||
var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle)
|
||||
[new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
|
||||
true, null, ix, iz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
|
||||
// create starting units
|
||||
var uDist = 8;
|
||||
@ -68,7 +77,7 @@ for (var i=0; i < numPlayers; i++)
|
||||
[new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
|
||||
true, null, ux, uz
|
||||
);
|
||||
createObjectGroup(group, i+1);
|
||||
createObjectGroup(group, id);
|
||||
uAngle += PI/4;
|
||||
}
|
||||
}
|
||||
|
@ -129,6 +129,22 @@ function chooseRand()
|
||||
return ar[randInt(ar.length)];
|
||||
}
|
||||
|
||||
// "Inside-out" implementation of Fisher-Yates shuffle
|
||||
function shuffleArray(source)
|
||||
{
|
||||
if (!source.length)
|
||||
return [];
|
||||
|
||||
var result = [source[0]];
|
||||
for (var i = 1; i < source.length; i++)
|
||||
{
|
||||
var j = randInt(0, i);
|
||||
result[i] = result[j];
|
||||
result[j] = source[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function createAreas(centeredPlacer, painter, constraint, num, retryFactor)
|
||||
{
|
||||
if (retryFactor === undefined)
|
||||
|
Loading…
Reference in New Issue
Block a user