1
0
forked from 0ad/0ad
0ad/binaries/data/mods/public/simulation/components/Player.js
Ykkrosh b38e032c7e # Population limits.
Fix #531 (Enforce Population Limit), based on patch from evans.
Empty training queue and refund resources when buildings are destroyed
or captured.
Specify Cost defaults in XML instead of JS, to simplify some code.

This was SVN commit r8014.
2010-08-21 20:43:55 +00:00

159 lines
3.3 KiB
JavaScript

function Player() {}
Player.prototype.Schema =
"<a:component type='system'/><empty/>";
Player.prototype.Init = function()
{
this.playerID = undefined;
this.name = "Unknown";
this.civ = "gaia";
this.colour = { "r": 0.0, "g": 0.0, "b": 0.0, "a": 1.0 };
this.popUsed = 0; // population of units owned by this player
this.popReserved = 0; // population of units currently being trained
this.popLimit = 50; // maximum population
this.resourceCount = {
"food": 2000,
"wood": 1500,
"metal": 500,
"stone": 1000
};
};
Player.prototype.SetPlayerID = function(id)
{
this.playerID = id;
};
Player.prototype.GetPlayerID = function()
{
return this.playerID;
};
Player.prototype.SetName = function(name)
{
this.name = name;
};
Player.prototype.GetName = function()
{
return this.name;
};
Player.prototype.SetCiv = function(civcode)
{
this.civ = civcode;
};
Player.prototype.GetCiv = function()
{
return this.civ;
};
Player.prototype.SetColour = function(r, g, b)
{
this.colour = { "r": r/255.0, "g": g/255.0, "b": b/255.0, "a": 1.0 };
};
Player.prototype.GetColour = function()
{
return this.colour;
};
Player.prototype.TryReservePopulationSlots = function(num)
{
if (num > this.GetPopulationLimit() - this.GetPopulationCount())
return false;
this.popReserved += num;
return true;
};
Player.prototype.UnReservePopulationSlots = function(num)
{
this.popReserved -= num;
};
Player.prototype.GetPopulationCount = function()
{
return this.popUsed + this.popReserved;
};
Player.prototype.GetPopulationLimit = function()
{
return this.popLimit;
};
Player.prototype.GetResourceCounts = function()
{
return this.resourceCount;
};
Player.prototype.AddResource = function(type, amount)
{
this.resourceCount[type] += (+amount);
};
Player.prototype.AddResources = function(amounts)
{
for (var type in amounts)
this.resourceCount[type] += (+amounts[type]);
};
Player.prototype.TrySubtractResources = function(amounts)
{
// Check if we can afford it all
var amountsNeeded = {};
for (var type in amounts)
if (amounts[type] > this.resourceCount[type])
amountsNeeded[type] = amounts[type] - this.resourceCount[type];
var formattedAmountsNeeded = [];
for (var type in amountsNeeded)
formattedAmountsNeeded.push(type + ": " + amountsNeeded[type]);
// If we don't have enough resources, send a notification to the player
if (formattedAmountsNeeded.length)
{
var notification = {"player": this.playerID, "message": "Insufficient resources - " + formattedAmountsNeeded.join(", ")};
var cmpGUIInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
cmpGUIInterface.PushNotification(notification);
return false;
}
else
{
// Subtract the resources
for (var type in amounts)
this.resourceCount[type] -= amounts[type];
}
return true;
};
// Keep track of population effects of all entities that
// become owned or unowned by this player
Player.prototype.OnGlobalOwnershipChanged = function(msg)
{
if (msg.from == this.playerID)
{
var cost = Engine.QueryInterface(msg.entity, IID_Cost);
if (cost)
{
this.popUsed -= cost.GetPopCost();
this.popLimit -= cost.GetPopBonus();
}
}
if (msg.to == this.playerID)
{
var cost = Engine.QueryInterface(msg.entity, IID_Cost);
if (cost)
{
this.popUsed += cost.GetPopCost();
this.popLimit += cost.GetPopBonus();
}
}
};
Engine.RegisterComponentType(IID_Player, "Player", Player);