diff --git a/binaries/data/mods/public/gui/page_session.xml b/binaries/data/mods/public/gui/page_session.xml index be0c721f78..34c0bef7d5 100644 --- a/binaries/data/mods/public/gui/page_session.xml +++ b/binaries/data/mods/public/gui/page_session.xml @@ -8,6 +8,10 @@ common/common_sprites.xml common/common_styles.xml + common/modern/styles.xml + common/modern/sprites.xml + common/modern/setup.xml + session/sprites.xml session/setup.xml session/styles.xml diff --git a/binaries/data/mods/public/gui/session/input.js b/binaries/data/mods/public/gui/session/input.js index b31c2bc6ca..ccd984e448 100644 --- a/binaries/data/mods/public/gui/session/input.js +++ b/binaries/data/mods/public/gui/session/input.js @@ -290,9 +290,9 @@ function getActionInfo(action, target) cursor = "action-setup-trade-route"; tooltip = "Right-click to establish a default route for new traders."; if (trader) - tooltip += "\nGain (metal): " + getTradingTooltip(gain); + tooltip += "\nGain: " + getTradingTooltip(gain); else // Foundation or cannot produce traders - tooltip += "\nExpected gain (metal): " + getTradingTooltip(gain); + tooltip += "\nExpected gain: " + getTradingTooltip(gain); } } @@ -363,18 +363,18 @@ function getActionInfo(action, target) case "is first": tooltip = "Origin trade market."; if (tradingDetails.hasBothMarkets) - tooltip += "\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain); + tooltip += "\nGain: " + getTradingTooltip(tradingDetails.gain); else tooltip += "\nRight-click on another market to set it as a destination trade market." break; case "is second": - tooltip = "Destination trade market.\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain); + tooltip = "Destination trade market.\nGain: " + getTradingTooltip(tradingDetails.gain); break; case "set first": tooltip = "Right-click to set as origin trade market"; break; case "set second": - tooltip = "Right-click to set as destination trade market.\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain); + tooltip = "Right-click to set as destination trade market.\nGain: " + getTradingTooltip(tradingDetails.gain); break; } return {"possible": true, "tooltip": tooltip}; @@ -1572,10 +1572,10 @@ function startBuildingPlacement(buildTemplate, playerState) } } -// Called by GUI when user changes preferred trading goods -function selectTradingPreferredGoods(data) +// Called by GUI when user changes required trading goods +function selectRequiredGoods(data) { - Engine.PostNetworkCommand({"type": "select-trading-goods", "entities": data.entities, "preferredGoods": data.preferredGoods}); + Engine.PostNetworkCommand({"type": "select-required-goods", "entities": data.entities, "requiredGoods": data.requiredGoods}); } // Called by GUI when user clicks exchange resources button @@ -1914,6 +1914,9 @@ function performCommand(entity, commandName) case "alert-end": endOfAlert(); break; + case "select-trading-goods": + toggleTrade(); + break; default: break; } diff --git a/binaries/data/mods/public/gui/session/menu.js b/binaries/data/mods/public/gui/session/menu.js index 7b745b1f72..113e5a3310 100644 --- a/binaries/data/mods/public/gui/session/menu.js +++ b/binaries/data/mods/public/gui/session/menu.js @@ -29,10 +29,15 @@ const INITIAL_MENU_POSITION = "100%-164 " + MENU_TOP + " 100% " + MENU_BOTTOM; // Number of pixels per millisecond to move const MENU_SPEED = 1.2; +// Trade menu: available resources and step for probability changes +const RESOURCES = ["food", "wood", "stone", "metal"]; +const STEP = 5; + var isMenuOpen = false; var menu; var isDiplomacyOpen = false; +var isTradeOpen = false; // Redefined every time someone makes a tribute (so we can save some data in a closure). Called in input.js handleInputBeforeGui. var flushTributing = function() {}; @@ -238,6 +243,8 @@ function tributeResource(data) function openDiplomacy() { + if (isTradeOpen) + closeTrade(); isDiplomacyOpen = true; var we = Engine.GetPlayerID(); @@ -369,6 +376,145 @@ function toggleDiplomacy() openDiplomacy(); }; +function openTrade() +{ + if (isDiplomacyOpen) + closeDiplomacy(); + isTradeOpen = true; + + var updateButtons = function() + { + for (var res in button) + { + button[res].label.caption = proba[res] + "%"; + if (res == selec) + { + button[res].res.enabled = false; + button[res].sel.hidden = false; + button[res].up.hidden = true; + button[res].dn.hidden = true; + } + else + { + button[res].res.enabled = true; + button[res].sel.hidden = true; + button[res].up.hidden = (proba[res] == 100 || proba[selec] == 0); + button[res].dn.hidden = (proba[res] == 0 || proba[selec] == 100); + } + } + } + + var proba = Engine.GuiInterfaceCall("GetTradingGoods"); + var button = {}; + var selec = RESOURCES[0]; + for (var i = 0; i < RESOURCES.length; ++i) + { + var buttonResource = getGUIObjectByName("tradeResource["+i+"]"); + if (i > 0) + { + var size = getGUIObjectByName("tradeResource["+(i-1)+"]").size; + var width = size.right - size.left; + size.left += width; + size.right += width; + getGUIObjectByName("tradeResource["+i+"]").size = size; + } + var resource = RESOURCES[i]; + proba[resource] = (proba[resource] ? proba[resource] : 0); + var buttonResource = getGUIObjectByName("tradeResourceButton["+i+"]"); + var icon = getGUIObjectByName("tradeResourceIcon["+i+"]"); + icon.sprite = "stretched:session/icons/resources/" + resource + ".png"; + var label = getGUIObjectByName("tradeResourceText["+i+"]"); + var buttonUp = getGUIObjectByName("tradeArrowUp["+i+"]"); + var buttonDn = getGUIObjectByName("tradeArrowDn["+i+"]"); + var iconSel = getGUIObjectByName("tradeResourceSelection["+i+"]"); + button[resource] = { "res": buttonResource, "up": buttonUp, "dn": buttonDn, "label": label, "sel": iconSel }; + + buttonResource.onpress = (function(resource){ + return function() { + if (selec == resource) + return; + selec = resource; + updateButtons(); + } + })(resource); + + buttonUp.onpress = (function(resource){ + return function() { + proba[resource] += Math.min(STEP, proba[selec]); + proba[selec] -= Math.min(STEP, proba[selec]); + Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba}); + updateButtons(); + } + })(resource); + + buttonDn.onpress = (function(resource){ + return function() { + proba[selec] += Math.min(STEP, proba[resource]); + proba[resource] -= Math.min(STEP, proba[resource]); + Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba}); + updateButtons(); + } + })(resource); + } + updateButtons(); + + var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber"); + var caption = ""; + var comma = ""; + if (traderNumber.landTrader.total == 0) + caption += "0"; + else + { + if (traderNumber.landTrader.trading > 0) + { + caption += traderNumber.landTrader.trading + " trading" + comma = ", "; + } + if (traderNumber.landTrader.garrisoned > 0) + { + caption += comma + traderNumber.landTrader.garrisoned + " garrisoned inside ships"; + comma = ", "; + } + var inactive = traderNumber.landTrader.total - traderNumber.landTrader.trading - traderNumber.landTrader.garrisoned; + if (inactive > 0) + caption += comma + "[color=\"orange\"]" + inactive + " inactive[/color]"; + } + getGUIObjectByName("landTraders").caption = caption; + + caption = ""; + comma = ""; + if (traderNumber.shipTrader.total == 0) + caption += "0"; + else + { + if (traderNumber.shipTrader.trading > 0) + { + caption += traderNumber.shipTrader.trading + " trading" + comma = ", "; + } + var inactive = traderNumber.shipTrader.total - traderNumber.shipTrader.trading; + if (inactive > 0) + caption += comma + "[color=\"orange\"]" + inactive + " inactive[/color]"; + } + getGUIObjectByName("shipTraders").caption = caption; + + getGUIObjectByName("tradeDialogPanel").hidden = false; +} + +function closeTrade() +{ + isTradeOpen = false; + getGUIObjectByName("tradeDialogPanel").hidden = true; +} + +function toggleTrade() +{ + if (isTradeOpen) + closeTrade(); + else + openTrade(); +}; + function toggleGameSpeed() { var gameSpeed = getGUIObjectByName("gameSpeed"); @@ -436,6 +582,7 @@ function closeOpenDialogs() closeMenu(); closeChat(); closeDiplomacy(); + closeTrade(); closeSettings(false); } diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index d504fc1a1c..3047067080 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -54,9 +54,7 @@ var g_AdditionalHighlight = []; function GetSimState() { if (!g_SimState) - { g_SimState = Engine.GuiInterfaceCall("GetSimulationState"); - } return g_SimState; } diff --git a/binaries/data/mods/public/gui/session/session.xml b/binaries/data/mods/public/gui/session/session.xml index b3c6939aa1..4487acf0b1 100644 --- a/binaries/data/mods/public/gui/session/session.xml +++ b/binaries/data/mods/public/gui/session/session.xml @@ -434,6 +434,56 @@ + + + +