Show a red overlay over training/construction... icons that cannot be afforded.

This was SVN commit r12404.
This commit is contained in:
wraitii 2012-08-13 16:47:10 +00:00
parent 9e35243976
commit 902fc4a541
5 changed files with 140 additions and 12 deletions

View File

@ -603,6 +603,7 @@
<repeat count="4">
<object name="unitBarterSellButton[n]" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottomBold">
<object name="unitBarterSellIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitBarterSellUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 60"/>
<object name="unitBarterSellAmount[n]" ghost="true" style="resourceText" type="text" size="0 0 100% 50%"/>
<object name="unitBarterSellSelection[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="stretched:session/icons/corners.png"/>
</object>
@ -612,6 +613,7 @@
<repeat count="4">
<object name="unitBarterBuyButton[n]" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottomBold">
<object name="unitBarterBuyIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitBarterBuyUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 60"/>
<object name="unitBarterBuyAmount[n]" ghost="true" style="resourceText" type="text" size="0 0 100% 50%"/>
</object>
</repeat>
@ -822,6 +824,7 @@
<repeat count="24">
<object name="unitConstructionButton[n]" hidden="true" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottom">
<object name="unitConstructionIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitConstructionUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 127"/>
</object>
</repeat>
</object>
@ -835,6 +838,7 @@
<object name="unitResearchButton[n]" hidden="true" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottom">
<object name="unitResearchIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitResearchSelection[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 127"/>
<object name="unitResearchUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 60"/>
</object>
</repeat>
<repeat count="8">
@ -852,6 +856,7 @@
<repeat count="24">
<object name="unitTrainingButton[n]" hidden="true" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottom">
<object name="unitTrainingIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitTrainingUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 127"/>
</object>
</repeat>
</object>
@ -898,6 +903,7 @@
<object name="unitGateButton[n]" hidden="true" style="iconButton" type="button" size="0 0 46 46" tooltip_style="sessionToolTipBottom">
<object name="unitGateIcon[n]" type="image" ghost="true" size="3 3 43 43"/>
<object name="unitGateSelection[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="stretched:session/icons/corners.png"/>
<object name="unitGateUnaffordable[n]" hidden="true" type="image" ghost="true" size="3 3 43 43" sprite="colour: 255 0 0 127"/>
</object>
</repeat>
</object>

View File

@ -332,7 +332,20 @@ function setupUnitPanel(guiName, usedPanels, unitEntState, items, callback)
case GATE:
var tooltip = item.tooltip;
if (item.template)
tooltip += "\n" + getEntityCostTooltip(GetTemplateData(item.template));
{
var template = GetTemplateData(item.template);
tooltip += "\n" + getEntityCostTooltip(template);
var affordableMask = getGUIObjectByName("unitGateUnaffordable["+i+"]");
affordableMask.hidden = true;
var neededResources = Engine.GuiInterfaceCall("GetNeededResources", template.cost);
if (neededResources)
{
affordableMask.hidden = false;
tooltip += getNeededResourcesTooltip(neededResources);
}
}
break;
case STANCE:
@ -416,6 +429,8 @@ function setupUnitPanel(guiName, usedPanels, unitEntState, items, callback)
// Button
var button = getGUIObjectByName("unit"+guiName+"Button["+i+"]");
var button1 = getGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]");
var affordableMask = getGUIObjectByName("unit"+guiName+"Unaffordable["+i+"]");
var affordableMask1 = getGUIObjectByName("unit"+guiName+"Unaffordable["+(i+rowLength)+"]");
var icon = getGUIObjectByName("unit"+guiName+"Icon["+i+"]");
var selection = getGUIObjectByName("unit"+guiName+"Selection["+i+"]");
var pair = getGUIObjectByName("unit"+guiName+"Pair["+i+"]");
@ -553,23 +568,85 @@ function setupUnitPanel(guiName, usedPanels, unitEntState, items, callback)
if (guiName == RESEARCH)
{
// Check resource requirements for first button
affordableMask.hidden = true;
var neededResources = Engine.GuiInterfaceCall("GetNeededResources", template.cost);
if (neededResources)
{
if (button.enabled !== false)
{
button.enabled = false;
affordableMask.hidden = false;
}
button.tooltip += getNeededResourcesTooltip(neededResources);
}
if (item.pair)
{
grayscale = "";
button1.enabled = true;
if (guiName == RESEARCH && !Engine.GuiInterfaceCall("CheckTechnologyRequirements", entType1))
if (!Engine.GuiInterfaceCall("CheckTechnologyRequirements", entType1))
{
button1.enabled = false;
button1.tooltip += "\n" + GetTechnologyData(entType1).requirementsTooltip;
grayscale = "grayscale:";
}
icon1.sprite = "stretched:" + grayscale + "session/portraits/" +template1.icon;
// Check resource requirements for second button
affordableMask1.hidden = true;
neededResources = Engine.GuiInterfaceCall("GetNeededResources", template.cost);
if (neededResources)
{
if (button1.enabled !== false)
{
button1.enabled = false;
affordableMask1.hidden = false;
}
button1.tooltip += getNeededResourcesTooltip(neededResources);
}
}
else
{
pair.hidden = true;
button1.hidden = true;
affordableMask1.hidden = true;
}
}
else if (guiName == CONSTRUCTION || guiName == TRAINING)
{
affordableMask.hidden = true;
var totalCosts = {};
var trainNum = 1;
if (Engine.HotkeyIsPressed("session.batchtrain") && guiName == TRAINING)
{
var [batchSize, batchIncrement] = getTrainingBatchStatus(unitEntState.id, entType);
trainNum = batchSize + batchIncrement;
}
// Walls have no cost defined.
if (template.cost !== undefined)
for (var r in template.cost)
totalCosts[r] = Math.floor(template.cost[r] * trainNum);
var neededResources = Engine.GuiInterfaceCall("GetNeededResources", totalCosts);
if (neededResources)
{
var totalCost = 0;
if (button.enabled !== false)
{
for each (var resource in neededResources)
totalCost += resource;
button.enabled = false;
affordableMask.hidden = false;
var alpha = 75 + totalCost/6;
alpha = alpha > 150 ? 150 : alpha;
affordableMask.sprite = "colour: 255 0 0 " + (alpha);
}
button.tooltip += getNeededResourcesTooltip(neededResources);
}
}
}
else
@ -718,12 +795,28 @@ function setupUnitBarterPanel(unitEntState)
var buyPrice = unitEntState.barterMarket.prices["buy"][resource];
amountToBuy = "+" + Math.round(sellPrice / buyPrice * amountToSell);
}
var amount;
if (j == 0)
{
button.onpress = (function(i){ return function() { g_barterSell = i; } })(i);
amount = (i == g_barterSell) ? "-" + amountToSell : "";
}
if (i == g_barterSell)
{
amount = "-" + amountToSell;
var neededRes = {};
neededRes[resource] = amountToSell;
var neededResources = Engine.GuiInterfaceCall("GetNeededResources", neededRes);
var hidden = neededResources ? false : true;
for (var ii = 0; ii < BARTER_RESOURCES.length; ii++)
{
var affordableMask = getGUIObjectByName("unitBarterBuyUnaffordable["+ii+"]");
affordableMask.hidden = hidden;
}
}
else
amount = "";
}
else
{
var exchangeResourcesParameters = { "sell": BARTER_RESOURCES[g_barterSell], "buy": BARTER_RESOURCES[i], "amount": amountToSell };

View File

@ -318,6 +318,18 @@ function getPopulationBonusTooltip(template)
return popBonus;
}
/**
* Returns a message with the amount of each resource needed to create an entity.
*/
function getNeededResourcesTooltip(resources)
{
var formatted = [];
for (var resource in resources)
formatted.push(resources[resource] + " [font=\"serif-12\"]" + getCostComponentDisplayName(resource) + "[/font]");
return "\n\n[font=\"serif-bold-13\"][color=\"red\"]Insufficient resources:[/color][/font]\n" + formatted.join(", ");
}
function getEntitySpeed(template)
{
var speed = "";

View File

@ -567,6 +567,14 @@ GuiInterface.prototype.GetStartedResearch = function(player)
return ret;
}
// Used to show a red square over GUI elements you can't yet afford.
GuiInterface.prototype.GetNeededResources = function(player, amounts)
{
var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
return cmpPlayer.GetNeededResources(amounts);
};
GuiInterface.prototype.PushNotification = function(notification)
{
this.notifications.push(notification);
@ -1617,6 +1625,7 @@ var exposedFunctions = {
"IsTechnologyResearched": 1,
"CheckTechnologyRequirements": 1,
"GetStartedResearch": 1,
"GetNeededResources": 1,
"GetNextNotification": 1,
"GetAvailableFormations": 1,

View File

@ -160,22 +160,30 @@ Player.prototype.AddResources = function(amounts)
}
};
Player.prototype.TrySubtractResources = function(amounts)
Player.prototype.GetNeededResources = function(amounts)
{
// Check if we can afford it all
var amountsNeeded = {};
for (var type in amounts)
if (amounts[type] > this.resourceCount[type])
if (this.resourceCount[type] != undefined && 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 (Object.keys(amountsNeeded).length == 0)
return undefined;
return amountsNeeded;
};
Player.prototype.TrySubtractResources = function(amounts)
{
var amountsNeeded = this.GetNeededResources(amounts);
// If we don't have enough resources, send a notification to the player
if (formattedAmountsNeeded.length)
if (amountsNeeded)
{
var notification = {"player": this.playerID, "message": "Insufficient resources - " + formattedAmountsNeeded.join(", ")};
var formatted = [];
for (var type in amountsNeeded)
formatted.push(amountsNeeded[type] + " " + type[0].toUpperCase() + type.substr(1) );
var notification = {"player": this.playerID, "message": "Insufficient resources - " + formatted.join(", ")};
var cmpGUIInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
cmpGUIInterface.PushNotification(notification);
return false;