2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
function LoadPlayerSettings(settings)
|
|
|
|
{
|
|
|
|
// Default settings
|
|
|
|
if (!settings)
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
2010-10-30 06:02:42 +02:00
|
|
|
settings = {};
|
2011-05-02 22:34:48 +02:00
|
|
|
}
|
2011-01-12 13:29:00 +01:00
|
|
|
|
2010-10-30 06:02:42 +02:00
|
|
|
// Get default player data
|
|
|
|
var rawData = Engine.ReadJSONFile("player_defaults.json");
|
|
|
|
if (!(rawData && rawData.PlayerData))
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
|
|
|
throw("Player.js: Error reading player default data (player_defaults.json)");
|
|
|
|
}
|
2011-01-12 13:29:00 +01:00
|
|
|
|
2010-10-30 06:02:42 +02:00
|
|
|
var playerDefaults = rawData.PlayerData;
|
|
|
|
|
|
|
|
// default number of players
|
2010-11-13 03:36:53 +01:00
|
|
|
var numPlayers = 8;
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
if (settings.PlayerData)
|
|
|
|
{ //Get number of players including gaia
|
|
|
|
numPlayers = settings.PlayerData.length + 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-05-02 22:34:48 +02:00
|
|
|
warn("Player.js: Setup has no player data - using defaults");
|
2010-10-30 06:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get player manager
|
|
|
|
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
|
|
|
|
var teams = [];
|
|
|
|
var diplomacy = [];
|
|
|
|
|
|
|
|
// Build team + diplomacy data
|
|
|
|
for (var i = 0; i < (numPlayers - 1); ++i)
|
|
|
|
{
|
|
|
|
diplomacy[i] = cmpPlayerMan.Diplomacy.ENEMY;
|
|
|
|
|
|
|
|
var pData = settings.PlayerData ? settings.PlayerData[i] : {};
|
2010-11-13 03:36:53 +01:00
|
|
|
var pDefs = playerDefaults ? playerDefaults[i+1] : {};
|
|
|
|
var team = getSetting(pData, pDefs, "Team");
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
// If team defined, add player to the team
|
2010-11-21 01:35:08 +01:00
|
|
|
if (team !== undefined && team != -1)
|
2010-11-13 03:36:53 +01:00
|
|
|
{
|
|
|
|
if (!teams[team])
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
2010-11-13 03:36:53 +01:00
|
|
|
teams[team] = [i];
|
2011-05-02 22:34:48 +02:00
|
|
|
}
|
2010-11-13 03:36:53 +01:00
|
|
|
else
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
2010-11-13 03:36:53 +01:00
|
|
|
teams[team].push(i);
|
2011-05-02 22:34:48 +02:00
|
|
|
}
|
2010-11-13 03:36:53 +01:00
|
|
|
}
|
2010-10-30 06:02:42 +02:00
|
|
|
}
|
2011-02-27 14:34:22 +01:00
|
|
|
|
2010-10-30 06:02:42 +02:00
|
|
|
for (var i = 0; i < numPlayers; ++i)
|
|
|
|
{
|
|
|
|
// Add player entity to engine
|
|
|
|
var entID = Engine.AddEntity("special/player");
|
|
|
|
|
|
|
|
// Retrieve entity
|
|
|
|
var player = Engine.QueryInterface(entID, IID_Player);
|
|
|
|
if (!player)
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
|
|
|
throw("Player.js: Error creating player entity "+i);
|
|
|
|
}
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
player.SetPlayerID(i);
|
|
|
|
|
|
|
|
var pDefs = playerDefaults ? playerDefaults[i] : {};
|
|
|
|
|
|
|
|
// Use real player data if available
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
var pData = settings.PlayerData ? settings.PlayerData[i-1] : {};
|
|
|
|
|
|
|
|
// Copy player data if not gaia
|
|
|
|
player.SetName(getSetting(pData, pDefs, "Name"));
|
|
|
|
player.SetCiv(getSetting(pData, pDefs, "Civ"));
|
|
|
|
|
|
|
|
var colour = getSetting(pData, pDefs, "Colour");
|
|
|
|
player.SetColour(colour.r, colour.g, colour.b);
|
|
|
|
|
|
|
|
if (getSetting(pData, pDefs, "PopulationLimit") !== undefined)
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
2010-10-30 06:02:42 +02:00
|
|
|
player.SetPopulationLimit(getSetting(pData, pDefs, "PopulationLimit"));
|
2011-05-02 22:34:48 +02:00
|
|
|
}
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
if (getSetting(pData, pDefs, "Resources") !== undefined)
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
2010-10-30 06:02:42 +02:00
|
|
|
player.SetResourceCounts(getSetting(pData, pDefs, "Resources"));
|
2011-05-02 22:34:48 +02:00
|
|
|
}
|
2010-10-30 06:02:42 +02:00
|
|
|
|
2010-11-13 03:36:53 +01:00
|
|
|
var team = getSetting(pData, pDefs, "Team");
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
//If diplomacy array exists use that, otherwise use team data or default diplomacy
|
|
|
|
if (getSetting(pData, pDefs, "Diplomacy") !== undefined)
|
|
|
|
{
|
|
|
|
player.SetDiplomacy(getSetting(pData, pDefs, "Diplomacy"));
|
|
|
|
}
|
|
|
|
else if (team !== undefined && team != -1)
|
2011-05-02 22:34:48 +02:00
|
|
|
{
|
|
|
|
//Team exists, copy default diplomacy
|
|
|
|
var teamDiplomacy = [];
|
|
|
|
for (var p in diplomacy)
|
|
|
|
{
|
|
|
|
teamDiplomacy[p] = diplomacy[p];
|
|
|
|
}
|
|
|
|
// Set teammates to allies
|
|
|
|
var myTeam = teams[team];
|
|
|
|
for (var n in myTeam)
|
|
|
|
{
|
|
|
|
teamDiplomacy[myTeam[n]] = cmpPlayerMan.Diplomacy.ALLY; //Set ally
|
|
|
|
}
|
2010-10-30 06:02:42 +02:00
|
|
|
|
|
|
|
player.SetDiplomacy(teamDiplomacy);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ //Set default
|
|
|
|
player.SetDiplomacy(diplomacy);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ // Copy gaia data from defaults
|
|
|
|
player.SetName(pDefs.Name);
|
|
|
|
player.SetCiv(pDefs.Civ);
|
|
|
|
player.SetColour(pDefs.Colour.r, pDefs.Colour.g, pDefs.Colour.b);
|
2011-02-27 14:34:22 +01:00
|
|
|
player.SetDiplomacy(diplomacy);
|
2010-10-30 06:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add player to player manager
|
|
|
|
cmpPlayerMan.AddPlayer(entID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
|
2010-08-21 22:43:55 +02:00
|
|
|
/**
|
|
|
|
* 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 cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
|
|
|
|
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
|
|
|
if (!cmpOwnership)
|
|
|
|
return null;
|
|
|
|
|
|
|
|
var playerEnt = cmpPlayerMan.GetPlayerByID(cmpOwnership.GetOwner());
|
|
|
|
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 cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
|
|
|
|
var playerEnt = cmpPlayerMan.GetPlayerByID(id);
|
|
|
|
if (!playerEnt)
|
|
|
|
return null;
|
|
|
|
|
|
|
|
return Engine.QueryInterface(playerEnt, iid);
|
|
|
|
}
|
|
|
|
|
2010-10-30 06:02:42 +02:00
|
|
|
Engine.RegisterGlobal("LoadPlayerSettings", LoadPlayerSettings);
|
2010-08-21 22:43:55 +02:00
|
|
|
Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface);
|
|
|
|
Engine.RegisterGlobal("QueryPlayerIDInterface", QueryPlayerIDInterface);
|