2010-01-09 20:20:14 +01:00
|
|
|
function GuiInterface() {}
|
|
|
|
|
2010-01-24 18:24:35 +01:00
|
|
|
GuiInterface.prototype.Init = function()
|
|
|
|
{
|
|
|
|
// TODO: need to not serialise this value
|
|
|
|
this.placementEntity = undefined; // = undefined or [templateName, entityID]
|
|
|
|
};
|
2010-01-09 20:20:14 +01:00
|
|
|
|
|
|
|
GuiInterface.prototype.GetSimulationState = function(player)
|
|
|
|
{
|
2010-01-24 18:24:35 +01:00
|
|
|
var ret = {
|
2010-01-26 00:43:58 +01:00
|
|
|
"players": []
|
2010-01-24 18:24:35 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
|
|
|
var n = cmpPlayerMan.GetNumPlayers();
|
|
|
|
for (var i = 0; i < n; ++i)
|
|
|
|
{
|
|
|
|
var playerEnt = cmpPlayerMan.GetPlayerByID(i);
|
|
|
|
var cmpPlayer = Engine.QueryInterface(playerEnt, IID_Player);
|
|
|
|
var player = {
|
2010-01-26 00:43:58 +01:00
|
|
|
"popCount": cmpPlayer.GetPopulationCount(),
|
|
|
|
"popLimit": cmpPlayer.GetPopulationLimit()
|
2010-01-24 18:24:35 +01:00
|
|
|
};
|
|
|
|
ret.players.push(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
2010-01-09 20:20:14 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
GuiInterface.prototype.GetEntityState = function(player, ent)
|
|
|
|
{
|
2010-01-26 00:43:58 +01:00
|
|
|
var cmpTempMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|
2010-01-09 20:20:14 +01:00
|
|
|
var cmpPosition = Engine.QueryInterface(ent, IID_Position);
|
|
|
|
|
|
|
|
var ret = {
|
2010-01-26 00:43:58 +01:00
|
|
|
"template": cmpTempMan.GetCurrentTemplateName(ent),
|
|
|
|
"position": cmpPosition.GetPosition()
|
2010-01-09 20:20:14 +01:00
|
|
|
};
|
2010-01-24 18:24:35 +01:00
|
|
|
|
2010-02-05 23:00:39 +01:00
|
|
|
var cmpHealth = Engine.QueryInterface(ent, IID_Health);
|
|
|
|
if (cmpHealth)
|
|
|
|
{
|
|
|
|
ret.hitpoints = cmpHealth.GetHitpoints();
|
|
|
|
}
|
|
|
|
|
|
|
|
var cmpAttack = Engine.QueryInterface(ent, IID_Attack);
|
|
|
|
if (cmpAttack)
|
|
|
|
{
|
|
|
|
ret.attack = cmpAttack.GetAttackStrengths();
|
|
|
|
}
|
|
|
|
|
2010-01-24 18:24:35 +01:00
|
|
|
var cmpBuilder = Engine.QueryInterface(ent, IID_Builder);
|
|
|
|
if (cmpBuilder)
|
|
|
|
{
|
|
|
|
ret.buildEntities = cmpBuilder.GetEntitiesList();
|
|
|
|
}
|
|
|
|
|
2010-02-05 23:00:39 +01:00
|
|
|
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
|
|
|
if (cmpOwnership)
|
|
|
|
{
|
|
|
|
ret.player = cmpOwnership.GetOwner();
|
|
|
|
}
|
|
|
|
|
2010-01-09 20:20:14 +01:00
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
|
2010-01-26 00:43:58 +01:00
|
|
|
GuiInterface.prototype.GetTemplateData = function(player, name)
|
|
|
|
{
|
|
|
|
var cmpTempMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|
|
|
|
var template = cmpTempMan.GetTemplate(name);
|
|
|
|
|
|
|
|
var ret = {};
|
|
|
|
|
|
|
|
if (template.Identity)
|
|
|
|
{
|
|
|
|
ret.name = {
|
|
|
|
"specific": template.Identity.SpecificName,
|
2010-01-27 20:20:34 +01:00
|
|
|
"generic": template.Identity.GenericName,
|
|
|
|
"icon_cell": template.Identity.IconCell
|
2010-01-26 00:43:58 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
|
2010-01-25 23:31:43 +01:00
|
|
|
GuiInterface.prototype.SetSelectionHighlight = function(player, cmd)
|
2010-01-09 20:20:14 +01:00
|
|
|
{
|
2010-01-25 23:31:43 +01:00
|
|
|
var cmpSelectable = Engine.QueryInterface(cmd.entity, IID_Selectable);
|
|
|
|
cmpSelectable.SetSelectionHighlight(cmd.colour);
|
2010-01-09 20:20:14 +01:00
|
|
|
};
|
|
|
|
|
2010-01-25 23:31:43 +01:00
|
|
|
GuiInterface.prototype.SetBuildingPlacementPreview = function(player, cmd)
|
2010-01-24 18:24:35 +01:00
|
|
|
{
|
|
|
|
if (!this.placementEntity || this.placementEntity[0] != cmd.template)
|
|
|
|
{
|
|
|
|
if (cmd.template == "")
|
|
|
|
{
|
|
|
|
if (this.placementEntity)
|
|
|
|
Engine.DestroyEntity(this.placementEntity[1]);
|
|
|
|
this.placementEntity = undefined;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this.placementEntity = [cmd.template, Engine.AddLocalEntity("preview|" + cmd.template)];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.placementEntity)
|
|
|
|
{
|
|
|
|
var pos = Engine.QueryInterface(this.placementEntity[1], IID_Position);
|
|
|
|
if (pos)
|
|
|
|
{
|
|
|
|
pos.JumpTo(cmd.x, cmd.z);
|
|
|
|
pos.SetYRotation(cmd.angle);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-01-25 23:31:43 +01:00
|
|
|
// List the GuiInterface functions that can be safely called by GUI scripts.
|
|
|
|
// (GUI scripts are non-deterministic and untrusted, so these functions must be
|
|
|
|
// appropriately careful. They are called with a first argument "player", which is
|
|
|
|
// trusted and indicates the player associated with the current client; no data should
|
|
|
|
// be returned unless this player is meant to be able to see it.)
|
|
|
|
var exposedFunctions = {
|
|
|
|
"GetSimulationState": 1,
|
|
|
|
"GetEntityState": 1,
|
2010-01-26 00:43:58 +01:00
|
|
|
"GetTemplateData": 1,
|
2010-01-25 23:31:43 +01:00
|
|
|
"SetSelectionHighlight": 1,
|
|
|
|
"SetBuildingPlacementPreview": 1
|
|
|
|
};
|
|
|
|
|
|
|
|
GuiInterface.prototype.ScriptCall = function(player, name, args)
|
2010-01-24 18:24:35 +01:00
|
|
|
{
|
2010-01-25 23:31:43 +01:00
|
|
|
if (exposedFunctions[name])
|
|
|
|
return this[name](player, args);
|
2010-01-24 18:24:35 +01:00
|
|
|
else
|
|
|
|
throw new Error("Invalid GuiInterface Call name \""+name+"\"");
|
|
|
|
};
|
|
|
|
|
2010-01-09 20:20:14 +01:00
|
|
|
Engine.RegisterComponentType(IID_GuiInterface, "GuiInterface", GuiInterface);
|