forked from 0ad/0ad
wraitii
25293ce0cc
Adds -autostart-aidiff to set the difficulty from the command line from testing. This was SVN commit r13278.
320 lines
9.4 KiB
JavaScript
320 lines
9.4 KiB
JavaScript
|
|
/**
|
|
* Used to create player entities prior to reading the rest of a map,
|
|
* all other initialization must be done after loading map (terrain/entities).
|
|
* DO NOT use other components here, as they may fail unpredictably.
|
|
* settings is the object containing settings for this map.
|
|
* newPlayers if true will remove any old player entities and add new ones
|
|
* (used when loading a map or when Atlas changes the number of players).
|
|
*/
|
|
function LoadPlayerSettings(settings, newPlayers)
|
|
{
|
|
// Default settings
|
|
if (!settings)
|
|
settings = {};
|
|
|
|
// Get default player data
|
|
var rawData = Engine.ReadJSONFile("player_defaults.json");
|
|
if (!(rawData && rawData.PlayerData))
|
|
throw("Player.js: Error reading player_defaults.json");
|
|
|
|
var playerDefaults = rawData.PlayerData;
|
|
|
|
// default number of players
|
|
var numPlayers = 8;
|
|
|
|
// Get player manager
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
// Remove existing players and add new ones
|
|
if (newPlayers)
|
|
{
|
|
cmpPlayerManager.RemoveAllPlayers();
|
|
|
|
if (settings.PlayerData)
|
|
{
|
|
// Get number of players including gaia
|
|
numPlayers = settings.PlayerData.length + 1;
|
|
}
|
|
else
|
|
{
|
|
warn("Player.js: Setup has no player data - using defaults");
|
|
}
|
|
|
|
for (var i = 0; i < numPlayers; ++i)
|
|
{
|
|
// Add player entity to engine
|
|
// TODO: Get player template name from civ data
|
|
var entID = Engine.AddEntity("special/player");
|
|
var cmpPlayer = Engine.QueryInterface(entID, IID_Player);
|
|
if (!cmpPlayer)
|
|
throw("Player.js: Error creating player entity "+i);
|
|
|
|
cmpPlayer.SetPlayerID(i);
|
|
|
|
// Add player to player manager
|
|
cmpPlayerManager.AddPlayer(entID);
|
|
}
|
|
}
|
|
|
|
numPlayers = cmpPlayerManager.GetNumPlayers();
|
|
|
|
// Initialize the player data
|
|
for (var i = 0; i < numPlayers; ++i)
|
|
{
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player);
|
|
var pDefs = playerDefaults ? playerDefaults[i] : {};
|
|
|
|
// Skip gaia
|
|
if (i > 0)
|
|
{
|
|
var pData = settings.PlayerData ? settings.PlayerData[i-1] : {};
|
|
|
|
cmpPlayer.SetName(getSetting(pData, pDefs, "Name"));
|
|
cmpPlayer.SetCiv(getSetting(pData, pDefs, "Civ"));
|
|
var colour = getSetting(pData, pDefs, "Colour");
|
|
cmpPlayer.SetColour(colour.r, colour.g, colour.b);
|
|
|
|
// Note: this is not yet implemented but I leave it commented to highlight it's easy
|
|
// If anyone ever adds handicap.
|
|
//if (getSetting(pData, pDefs, "GatherRateMultiplier") !== undefined)
|
|
// cmpPlayer.SetGatherRateMultiplier(getSetting(pData, pDefs, "GatherRateMultiplier"));
|
|
|
|
if (getSetting(pData, pDefs, "PopulationLimit") !== undefined)
|
|
cmpPlayer.SetMaxPopulation(getSetting(pData, pDefs, "PopulationLimit"));
|
|
|
|
if (getSetting(pData, pDefs, "Resources") !== undefined)
|
|
cmpPlayer.SetResourceCounts(getSetting(pData, pDefs, "Resources"));
|
|
|
|
// If diplomacy explicitly defined, use that; otherwise use teams
|
|
if (getSetting(pData, pDefs, "Diplomacy") !== undefined)
|
|
cmpPlayer.SetDiplomacy(getSetting(pData, pDefs, "Diplomacy"));
|
|
else
|
|
{
|
|
// Init diplomacy
|
|
cmpPlayer.SetDiplomacy(new Array(numPlayers));
|
|
var myTeam = getSetting(pData, pDefs, "Team");
|
|
|
|
// Set all but self as enemies as SetTeam takes care of allies
|
|
for (var j = 0; j < numPlayers; ++j)
|
|
{
|
|
if (i == j)
|
|
cmpPlayer.SetAlly(j);
|
|
else
|
|
cmpPlayer.SetEnemy(j);
|
|
}
|
|
cmpPlayer.SetTeam((myTeam !== undefined) ? myTeam : -1);
|
|
}
|
|
|
|
// If formations explicitly defined, use that; otherwise use civ defaults
|
|
var formations = getSetting(pData, pDefs, "Formations");
|
|
if (formations !== undefined)
|
|
cmpPlayer.SetFormations(formations);
|
|
else
|
|
{
|
|
var rawFormations = Engine.ReadCivJSONFile(cmpPlayer.GetCiv()+".json");
|
|
if (!(rawFormations && rawFormations.Formations))
|
|
throw("Player.js: Error reading "+cmpPlayer.GetCiv()+".json");
|
|
|
|
cmpPlayer.SetFormations(rawFormations.Formations);
|
|
}
|
|
|
|
var startCam = getSetting(pData, pDefs, "StartingCamera");
|
|
if (startCam !== undefined)
|
|
cmpPlayer.SetStartingCamera(startCam.Position, startCam.Rotation);
|
|
}
|
|
else
|
|
{
|
|
// Copy gaia data from defaults
|
|
cmpPlayer.SetName(pDefs.Name);
|
|
cmpPlayer.SetCiv(pDefs.Civ);
|
|
cmpPlayer.SetColour(pDefs.Colour.r, pDefs.Colour.g, pDefs.Colour.b);
|
|
|
|
// Gaia should be its own ally.
|
|
cmpPlayer.SetAlly(0);
|
|
|
|
// Gaia is everyone's enemy
|
|
for (var j = 1; j < numPlayers; ++j)
|
|
cmpPlayer.SetEnemy(j);
|
|
}
|
|
}
|
|
|
|
// NOTE: We need to do the team locking here, as otherwise
|
|
// SetTeam can't ally the players.
|
|
if (settings.LockTeams)
|
|
for (var i = 0; i < numPlayers; ++i)
|
|
{
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player);
|
|
cmpPlayer.SetLockTeams(true);
|
|
}
|
|
}
|
|
|
|
// Get a setting if it exists or return default
|
|
function getSetting(settings, defaults, property)
|
|
{
|
|
if (settings && (property in settings))
|
|
return settings[property];
|
|
|
|
// Use defaults
|
|
if (defaults && (property in defaults))
|
|
return defaults[property];
|
|
|
|
return undefined;
|
|
}
|
|
|
|
/**
|
|
* Similar to Engine.QueryInterface but applies to the player entity
|
|
* that owns the given entity.
|
|
* iid is typically IID_Player.
|
|
*/
|
|
function QueryOwnerInterface(ent, iid)
|
|
{
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
|
if (!cmpOwnership)
|
|
return null;
|
|
|
|
var owner = cmpOwnership.GetOwner();
|
|
if (owner == -1)
|
|
return null;
|
|
|
|
var playerEnt = cmpPlayerManager.GetPlayerByID(owner);
|
|
if (!playerEnt)
|
|
return null;
|
|
|
|
return Engine.QueryInterface(playerEnt, iid);
|
|
}
|
|
|
|
/**
|
|
* Similar to Engine.QueryInterface but applies to the player entity
|
|
* with the given ID number.
|
|
* iid is typically IID_Player.
|
|
*/
|
|
function QueryPlayerIDInterface(id, iid)
|
|
{
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
var playerEnt = cmpPlayerManager.GetPlayerByID(id);
|
|
if (!playerEnt)
|
|
return null;
|
|
|
|
return Engine.QueryInterface(playerEnt, iid);
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by an ally of
|
|
* the owner of 'entity'.
|
|
*/
|
|
function IsOwnedByAllyOfEntity(entity, target)
|
|
{
|
|
// Figure out which player controls us
|
|
var owner = 0;
|
|
var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership);
|
|
if (cmpOwnership)
|
|
owner = cmpOwnership.GetOwner();
|
|
|
|
// Figure out which player controls the foundation being built
|
|
var targetOwner = 0;
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
if (cmpOwnershipTarget)
|
|
targetOwner = cmpOwnershipTarget.GetOwner();
|
|
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(owner), IID_Player);
|
|
|
|
// Check for allied diplomacy status
|
|
if (cmpPlayer.IsAlly(targetOwner))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by player
|
|
*/
|
|
function IsOwnedByPlayer(player, target)
|
|
{
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
return (cmpOwnershipTarget && player == cmpOwnershipTarget.GetOwner());
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by gaia (player 0)
|
|
*/
|
|
function IsOwnedByGaia(target)
|
|
{
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
return (cmpOwnershipTarget && cmpOwnershipTarget.GetOwner() == 0);
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by an ally of player
|
|
*/
|
|
function IsOwnedByAllyOfPlayer(player, target)
|
|
{
|
|
var targetOwner = 0;
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
if (cmpOwnershipTarget)
|
|
targetOwner = cmpOwnershipTarget.GetOwner();
|
|
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(player), IID_Player);
|
|
|
|
// Check for allied diplomacy status
|
|
if (cmpPlayer.IsAlly(targetOwner))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by someone neutral to player
|
|
*/
|
|
function IsOwnedByNeutralOfPlayer(player,target)
|
|
{
|
|
var targetOwner = 0;
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
if (cmpOwnershipTarget)
|
|
targetOwner = cmpOwnershipTarget.GetOwner();
|
|
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(player), IID_Player);
|
|
|
|
// Check for neutral diplomacy status
|
|
if (cmpPlayer.IsNeutral(targetOwner))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the entity 'target' is owned by an enemy of player
|
|
*/
|
|
function IsOwnedByEnemyOfPlayer(player, target)
|
|
{
|
|
var targetOwner = 0;
|
|
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
|
|
if (cmpOwnershipTarget)
|
|
targetOwner = cmpOwnershipTarget.GetOwner();
|
|
|
|
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(player), IID_Player);
|
|
|
|
// Check for enemy diplomacy status
|
|
if (cmpPlayer.IsEnemy(targetOwner))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
Engine.RegisterGlobal("LoadPlayerSettings", LoadPlayerSettings);
|
|
Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface);
|
|
Engine.RegisterGlobal("QueryPlayerIDInterface", QueryPlayerIDInterface);
|
|
Engine.RegisterGlobal("IsOwnedByAllyOfEntity", IsOwnedByAllyOfEntity);
|
|
Engine.RegisterGlobal("IsOwnedByPlayer", IsOwnedByPlayer);
|
|
Engine.RegisterGlobal("IsOwnedByGaia", IsOwnedByGaia);
|
|
Engine.RegisterGlobal("IsOwnedByAllyOfPlayer", IsOwnedByAllyOfPlayer);
|
|
Engine.RegisterGlobal("IsOwnedByNeutralOfPlayer", IsOwnedByNeutralOfPlayer);
|
|
Engine.RegisterGlobal("IsOwnedByEnemyOfPlayer", IsOwnedByEnemyOfPlayer);
|