1
0
forked from 0ad/0ad

Fix problem with sprintf errors being thrown when the AI places structures on the wrong places, make the code more uniform. Fixes #2485

This was SVN commit r15090.
This commit is contained in:
sanderd17 2014-05-02 10:09:53 +00:00
parent a36a0bbd87
commit ace3269768
4 changed files with 28 additions and 11 deletions

View File

@ -129,9 +129,13 @@ function updateBuildingPlacementPreview()
{
if (result.message && result.parameters)
{
// translate the message parameters
translateObjectKeys(result.parameters, Object.keys(result.parameters), true)
placementSupport.tooltipMessage = sprintf(translate(result.message), result.parameters);
var message = result.message;
if (result.translateMessage)
message = translate(message);
var parameters = result.parameters;
if (result.translateParameters)
translateObjectKeys(parameters, result.translateParameters);
placementSupport.tooltipMessage = sprintf(message, parameters);
}
return false;
}

View File

@ -64,9 +64,11 @@ BuildRestrictions.prototype.Init = function()
*
* Returns result object:
* {
* "success": true iff the placement is valid, else false
* "message": message to display in UI for invalid placement, else ""
* "parameters": parameters to use in the GUI message
* "success": true iff the placement is valid, else false
* "message": message to display in UI for invalid placement, else ""
* "parameters": parameters to use in the GUI message
* "translateMessage": always true
* "translateParameters": list of parameters to translate
* }
*
* Note: The entity which is used to check this should be a preview entity
@ -83,7 +85,9 @@ BuildRestrictions.prototype.CheckPlacement = function()
"message": markForTranslation("%(name)s cannot be built due to unknown error"),
"parameters": {
"name": name,
}
},
"translateMessage": true,
"translateParameters": ["name"],
};
// TODO: AI has no visibility info
@ -193,6 +197,8 @@ BuildRestrictions.prototype.CheckPlacement = function()
if (territoryFail)
{
result.message = markForTranslation("%(name)s cannot be built in %(territoryType)s territory. Valid territories: %(validTerritories)s");
result.translateParameters.push("territoryType");
result.translateParameters.push("validTerritories");
result.parameters.territoryType = {"context": "Territory type", "message": territoryType};
// gui code will join this array to a string
result.parameters.validTerritories = {"context": "Territory type list", "list": this.GetTerritories()};
@ -255,6 +261,7 @@ BuildRestrictions.prototype.CheckPlacement = function()
{
result.message = markForTranslation("%(name)s too close to a %(category)s, must be at least %(distance)s meters away");
result.parameters.category = cat;
result.translateParameters.push("category");
result.parameters.distance = this.template.Distance.MinDistance;
return result; // Fail
}
@ -267,6 +274,7 @@ BuildRestrictions.prototype.CheckPlacement = function()
{
result.message = markForTranslation("%(name)s too far from a %(category)s, must be within %(distance)s meters");
result.parameters.category = cat;
result.translateParameters.push("category");
result.parameters.distance = this.template.Distance.MinDistance;
return result; // Fail
}

View File

@ -1018,9 +1018,11 @@ GuiInterface.prototype.DisplayRallyPoint = function(player, cmd)
*
* Returns result object from CheckPlacement:
* {
* "success": true iff the placement is valid, else false
* "message": message to display in UI for invalid placement, else ""
"parameters": parameters to use in the message
* "success": true iff the placement is valid, else false
* "message": message to display in UI for invalid placement, else ""
* "parameters": parameters to use in the message
* "translateMessage": localisation info
* "translateParameters": localisation info
* }
*/
GuiInterface.prototype.SetBuildingPlacementPreview = function(player, cmd)
@ -1029,6 +1031,8 @@ GuiInterface.prototype.SetBuildingPlacementPreview = function(player, cmd)
"success": false,
"message": "",
"parameters": {},
"translateMessage": false,
"translateParameters": [],
}
// See if we're changing template

View File

@ -805,7 +805,8 @@ function TryConstructBuilding(player, cmpPlayer, controlAllUnits, cmd)
}
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
cmpGuiInterface.PushNotification({ "player": player, "message": ret.message });
ret.player = player;
cmpGuiInterface.PushNotification(ret);
// Remove the foundation because the construction was aborted
// move it out of world because it's not destroyed immediately.