Randomizes player starting positions on random maps.

This was SVN commit r10417.
This commit is contained in:
historic_bruno 2011-10-21 01:15:02 +00:00
parent d966c5e10b
commit 5acf38c095
6 changed files with 81 additions and 19 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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)