2010-01-09 20:20:14 +01:00
|
|
|
function GuiInterface() {}
|
|
|
|
|
2010-04-23 18:09:03 +02:00
|
|
|
GuiInterface.prototype.Schema =
|
|
|
|
"<a:component type='system'/><empty/>";
|
|
|
|
|
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
|
|
|
};
|
2010-03-12 22:41:40 +01:00
|
|
|
|
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);
|
2010-03-12 22:41:40 +01:00
|
|
|
var playerData = {
|
2010-01-26 00:43:58 +01:00
|
|
|
"popCount": cmpPlayer.GetPopulationCount(),
|
2010-02-12 23:46:53 +01:00
|
|
|
"popLimit": cmpPlayer.GetPopulationLimit(),
|
|
|
|
"resourceCounts": cmpPlayer.GetResourceCounts()
|
2010-01-24 18:24:35 +01:00
|
|
|
};
|
2010-03-12 22:41:40 +01:00
|
|
|
ret.players.push(playerData);
|
2010-01-24 18:24:35 +01:00
|
|
|
}
|
2010-03-12 22:41:40 +01:00
|
|
|
|
2010-01-24 18:24:35 +01:00
|
|
|
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-03-07 21:14:30 +01:00
|
|
|
|
|
|
|
// All units must have a template; if not then it's a nonexistent entity id
|
|
|
|
var template = cmpTempMan.GetCurrentTemplateName(ent);
|
|
|
|
if (!template)
|
|
|
|
return null;
|
|
|
|
|
2010-01-09 20:20:14 +01:00
|
|
|
var ret = {
|
2010-04-19 21:47:23 +02:00
|
|
|
"id": ent,
|
|
|
|
"template": template
|
2010-03-07 21:14:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var cmpPosition = Engine.QueryInterface(ent, IID_Position);
|
|
|
|
if (cmpPosition)
|
|
|
|
{
|
|
|
|
ret.position = cmpPosition.GetPosition();
|
|
|
|
}
|
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();
|
2010-02-28 22:45:09 +01:00
|
|
|
ret.maxHitpoints = cmpHealth.GetMaxHitpoints();
|
2010-02-05 23:00:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var cmpAttack = Engine.QueryInterface(ent, IID_Attack);
|
|
|
|
if (cmpAttack)
|
|
|
|
{
|
|
|
|
ret.attack = cmpAttack.GetAttackStrengths();
|
|
|
|
}
|
|
|
|
|
2010-02-28 22:45:09 +01:00
|
|
|
var cmpArmour = Engine.QueryInterface(ent, IID_DamageReceiver);
|
|
|
|
if (cmpArmour)
|
|
|
|
{
|
|
|
|
ret.armour = cmpArmour.GetArmourStrengths();
|
|
|
|
}
|
|
|
|
|
2010-01-24 18:24:35 +01:00
|
|
|
var cmpBuilder = Engine.QueryInterface(ent, IID_Builder);
|
|
|
|
if (cmpBuilder)
|
|
|
|
{
|
|
|
|
ret.buildEntities = cmpBuilder.GetEntitiesList();
|
|
|
|
}
|
|
|
|
|
2010-04-19 21:47:23 +02:00
|
|
|
var cmpTrainingQueue = Engine.QueryInterface(ent, IID_TrainingQueue);
|
|
|
|
if (cmpTrainingQueue)
|
|
|
|
{
|
|
|
|
ret.training = {
|
|
|
|
"entities": cmpTrainingQueue.GetEntitiesList(),
|
|
|
|
"queue": cmpTrainingQueue.GetQueue(),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2010-03-12 22:41:40 +01:00
|
|
|
var cmpFoundation = Engine.QueryInterface(ent, IID_Foundation);
|
|
|
|
if (cmpFoundation)
|
|
|
|
{
|
|
|
|
ret.foundation = {
|
|
|
|
"progress": cmpFoundation.GetBuildPercentage()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2010-02-05 23:00:39 +01:00
|
|
|
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
|
|
|
if (cmpOwnership)
|
|
|
|
{
|
|
|
|
ret.player = cmpOwnership.GetOwner();
|
|
|
|
}
|
|
|
|
|
2010-02-12 23:46:53 +01:00
|
|
|
var cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply);
|
|
|
|
if (cmpResourceSupply)
|
|
|
|
{
|
|
|
|
ret.resourceSupply = {
|
|
|
|
"max": cmpResourceSupply.GetMaxAmount(),
|
|
|
|
"amount": cmpResourceSupply.GetCurrentAmount(),
|
|
|
|
"type": cmpResourceSupply.GetType()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
var cmpResourceGatherer = Engine.QueryInterface(ent, IID_ResourceGatherer);
|
|
|
|
if (cmpResourceGatherer)
|
|
|
|
{
|
|
|
|
ret.resourceGatherRates = cmpResourceGatherer.GetGatherRates();
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
2010-04-19 21:47:23 +02:00
|
|
|
if (!template)
|
|
|
|
return null;
|
|
|
|
|
2010-01-26 00:43:58 +01:00
|
|
|
var ret = {};
|
|
|
|
|
|
|
|
if (template.Identity)
|
|
|
|
{
|
|
|
|
ret.name = {
|
2010-02-28 22:45:09 +01:00
|
|
|
"specific": (template.Identity.SpecificName || template.Identity.GenericName),
|
|
|
|
"generic": template.Identity.GenericName
|
2010-01-26 00:43:58 +01:00
|
|
|
};
|
2010-02-28 22:45:09 +01:00
|
|
|
ret.icon_cell = template.Identity.IconCell;
|
2010-01-26 00:43:58 +01:00
|
|
|
}
|
|
|
|
|
2010-03-12 22:41:40 +01:00
|
|
|
if (template.Cost)
|
|
|
|
{
|
|
|
|
ret.cost = {};
|
2010-04-19 21:47:23 +02:00
|
|
|
if (template.Cost.Resources.food) ret.cost.food = +template.Cost.Resources.food;
|
|
|
|
if (template.Cost.Resources.wood) ret.cost.wood = +template.Cost.Resources.wood;
|
|
|
|
if (template.Cost.Resources.stone) ret.cost.stone = +template.Cost.Resources.stone;
|
|
|
|
if (template.Cost.Resources.metal) ret.cost.metal = +template.Cost.Resources.metal;
|
2010-03-12 22:41:40 +01:00
|
|
|
}
|
|
|
|
|
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-03-11 21:01:16 +01:00
|
|
|
for each (var ent in cmd.entities)
|
|
|
|
{
|
|
|
|
var cmpSelectable = Engine.QueryInterface(ent, IID_Selectable);
|
|
|
|
if (cmpSelectable)
|
|
|
|
cmpSelectable.SetSelectionHighlight(cmd.colour);
|
|
|
|
}
|
2010-01-09 20:20:14 +01:00
|
|
|
};
|
|
|
|
|
2010-03-18 00:16:04 +01:00
|
|
|
/**
|
|
|
|
* Display the building placement preview.
|
|
|
|
* cmd.template is the name of the entity template, or "" to disable the preview.
|
|
|
|
* cmd.x, cmd.z, cmd.angle give the location.
|
|
|
|
* Returns true if the placement is okay (everything is valid and the entity is not obstructed by others).
|
|
|
|
*/
|
2010-01-25 23:31:43 +01:00
|
|
|
GuiInterface.prototype.SetBuildingPlacementPreview = function(player, cmd)
|
2010-01-24 18:24:35 +01:00
|
|
|
{
|
2010-02-28 22:45:09 +01:00
|
|
|
// See if we're changing template
|
2010-01-24 18:24:35 +01:00
|
|
|
if (!this.placementEntity || this.placementEntity[0] != cmd.template)
|
|
|
|
{
|
2010-02-28 22:45:09 +01:00
|
|
|
// Destroy the old preview if there was one
|
|
|
|
if (this.placementEntity)
|
|
|
|
Engine.DestroyEntity(this.placementEntity[1]);
|
|
|
|
|
|
|
|
// Load the new template
|
2010-01-24 18:24:35 +01:00
|
|
|
if (cmd.template == "")
|
|
|
|
{
|
|
|
|
this.placementEntity = undefined;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this.placementEntity = [cmd.template, Engine.AddLocalEntity("preview|" + cmd.template)];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.placementEntity)
|
|
|
|
{
|
2010-03-18 00:16:04 +01:00
|
|
|
// Move the preview into the right location
|
2010-01-24 18:24:35 +01:00
|
|
|
var pos = Engine.QueryInterface(this.placementEntity[1], IID_Position);
|
|
|
|
if (pos)
|
|
|
|
{
|
|
|
|
pos.JumpTo(cmd.x, cmd.z);
|
|
|
|
pos.SetYRotation(cmd.angle);
|
|
|
|
}
|
2010-03-18 00:16:04 +01:00
|
|
|
|
|
|
|
// Check whether it's obstructed by other entities
|
|
|
|
var cmpObstruction = Engine.QueryInterface(this.placementEntity[1], IID_Obstruction);
|
|
|
|
var colliding = (cmpObstruction && cmpObstruction.CheckCollisions());
|
|
|
|
|
|
|
|
// Set it to a red shade if this is an obstructed location
|
|
|
|
var cmpVisual = Engine.QueryInterface(this.placementEntity[1], IID_Visual);
|
|
|
|
if (cmpVisual)
|
|
|
|
{
|
|
|
|
if (colliding)
|
|
|
|
cmpVisual.SetShadingColour(1.4, 0.4, 0.4, 1);
|
|
|
|
else
|
|
|
|
cmpVisual.SetShadingColour(1, 1, 1, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!colliding)
|
|
|
|
return true;
|
2010-01-24 18:24:35 +01:00
|
|
|
}
|
2010-03-18 00:16:04 +01:00
|
|
|
|
|
|
|
return false;
|
2010-01-24 18:24:35 +01:00
|
|
|
};
|
|
|
|
|
2010-03-20 20:18:01 +01:00
|
|
|
GuiInterface.prototype.SetPathfinderDebugOverlay = function(player, enabled)
|
|
|
|
{
|
|
|
|
var cmpPathfinder = Engine.QueryInterface(SYSTEM_ENTITY, IID_Pathfinder);
|
|
|
|
cmpPathfinder.SetDebugOverlay(enabled);
|
|
|
|
};
|
|
|
|
|
|
|
|
GuiInterface.prototype.SetObstructionDebugOverlay = function(player, enabled)
|
|
|
|
{
|
|
|
|
var cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager);
|
|
|
|
cmpObstructionManager.SetDebugOverlay(enabled);
|
|
|
|
};
|
|
|
|
|
2010-04-30 01:36:05 +02:00
|
|
|
GuiInterface.prototype.SetMotionDebugOverlay = function(player, data)
|
|
|
|
{
|
|
|
|
for each (var ent in data.entities)
|
|
|
|
{
|
|
|
|
var cmpUnitMotion = Engine.QueryInterface(ent, IID_UnitMotion);
|
|
|
|
if (cmpUnitMotion)
|
|
|
|
cmpUnitMotion.SetDebugOverlay(data.enabled);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
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,
|
2010-03-20 20:18:01 +01:00
|
|
|
"SetBuildingPlacementPreview": 1,
|
|
|
|
"SetPathfinderDebugOverlay": 1,
|
2010-04-30 01:36:05 +02:00
|
|
|
"SetObstructionDebugOverlay": 1,
|
|
|
|
"SetMotionDebugOverlay": 1,
|
2010-01-25 23:31:43 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
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);
|