Ticket #2311: trade.diff

File trade.diff, 23.5 KB (added by mimo, 10 years ago)
  • binaries/data/mods/public/gui/page_session.xml

     
    88    <include>common/common_sprites.xml</include>
    99    <include>common/common_styles.xml</include>
    1010
     11    <include>common/modern/styles.xml</include>
     12    <include>common/modern/sprites.xml</include>
     13    <include>common/modern/setup.xml</include>
     14
    1115    <include>session/sprites.xml</include>
    1216    <include>session/setup.xml</include>
    1317    <include>session/styles.xml</include>
  • binaries/data/mods/public/gui/session/input.js

     
    290290                cursor = "action-setup-trade-route";
    291291                tooltip = "Right-click to establish a default route for new traders.";
    292292                if (trader)
    293                     tooltip += "\nGain (metal): " + getTradingTooltip(gain);
     293                    tooltip += "\nGain: " + getTradingTooltip(gain);
    294294                else // Foundation or cannot produce traders
    295                     tooltip += "\nExpected gain (metal): " + getTradingTooltip(gain);
     295                    tooltip += "\nExpected gain: " + getTradingTooltip(gain);
    296296            }
    297297        }
    298298
     
    363363                case "is first":
    364364                    tooltip = "Origin trade market.";
    365365                    if (tradingDetails.hasBothMarkets)
    366                         tooltip += "\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain);
     366                        tooltip += "\nGain: " + getTradingTooltip(tradingDetails.gain);
    367367                    else
    368368                        tooltip += "\nRight-click on another market to set it as a destination trade market."
    369369                    break;
    370370                case "is second":
    371                     tooltip = "Destination trade market.\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain);
     371                    tooltip = "Destination trade market.\nGain: " + getTradingTooltip(tradingDetails.gain);
    372372                    break;
    373373                case "set first":
    374374                    tooltip = "Right-click to set as origin trade market";
    375375                    break;
    376376                case "set second":
    377                     tooltip = "Right-click to set as destination trade market.\nGain (" + tradingDetails.goods + "): " + getTradingTooltip(tradingDetails.gain);
     377                    tooltip = "Right-click to set as destination trade market.\nGain: " + getTradingTooltip(tradingDetails.gain);
    378378                    break;
    379379                }
    380380                return {"possible": true, "tooltip": tooltip};
     
    15721572    }
    15731573}
    15741574
    1575 // Called by GUI when user changes preferred trading goods
    1576 function selectTradingPreferredGoods(data)
    1577 {
    1578     Engine.PostNetworkCommand({"type": "select-trading-goods", "entities": data.entities, "preferredGoods": data.preferredGoods});
    1579 }
    1580 
    15811575// Called by GUI when user clicks exchange resources button
    15821576function exchangeResources(command)
    15831577{
     
    19061900            case "back-to-work":
    19071901                backToWork();
    19081902                break;
     1903            case "select-trading-goods":
     1904                toggleTrade();
     1905                break;
    19091906            default:
    19101907                break;
    19111908            }
  • binaries/data/mods/public/gui/session/menu.js

     
    2929// Number of pixels per millisecond to move
    3030const MENU_SPEED = 1.2;
    3131
     32// Trade menu: available resources and step for probability changes
     33const RESOURCES = ["food", "wood", "stone", "metal"];
     34const STEP = 10;
     35
    3236var isMenuOpen = false;
    3337var menu;
    3438
    3539var isDiplomacyOpen = false;
     40var isTradeOpen = false;
    3641
    3742// Redefined every time someone makes a tribute (so we can save some data in a closure). Called in input.js handleInputBeforeGui.
    3843var flushTributing = function() {};
     
    116121    openChat();
    117122}
    118123
    119 function diplomacyMenuButton()
    120 {
    121     closeMenu();
    122     closeOpenDialogs();
    123     openDiplomacy();
    124 }
    125 
    126124function pauseMenuButton()
    127125{
    128126    togglePause();
     
    369367        openDiplomacy();
    370368};
    371369
     370function openTrade()
     371{
     372    isTradeOpen = true;
     373
     374    var updateButtons = function()
     375    {
     376        for (var res in button)
     377        {
     378            button[res].label.caption = proba[res] + "%";
     379            if (res == selec)
     380            {
     381                button[res].sel.hidden = false;
     382                button[res].up.hidden = true;
     383                button[res].dn.hidden = true;
     384            }
     385            else
     386            {
     387                button[res].sel.hidden = true;
     388                button[res].up.hidden = (proba[res] == 100 || proba[selec] == 0);
     389                button[res].dn.hidden = (proba[res] == 0 || proba[selec] == 100);
     390            }
     391        }
     392    }
     393
     394    var proba = Engine.GuiInterfaceCall("GetTradingGoods");
     395    var button = {};
     396    var selec = RESOURCES[0];
     397    for (var i = 0; i < RESOURCES.length; ++i)
     398    {
     399        if (i > 0)
     400        {
     401            var size = getGUIObjectByName("tradeResource["+(i-1)+"]").size;
     402            var width = size.right - size.left;
     403            size.left += width;
     404            size.right += width;
     405            getGUIObjectByName("tradeResource["+i+"]").size = size;
     406        }
     407        var resource = RESOURCES[i];
     408        proba[resource] = (proba[resource] ? proba[resource] : 0);
     409        var buttonSel = getGUIObjectByName("tradeResourceButton["+i+"]");
     410        var icon = getGUIObjectByName("tradeResourceIcon["+i+"]");
     411        icon.sprite = "stretched:session/icons/resources/" + resource + ".png";
     412        var label = getGUIObjectByName("tradeResourceText["+i+"]");
     413        var buttonUp = getGUIObjectByName("tradeArrowUp["+i+"]");
     414        var buttonDn = getGUIObjectByName("tradeArrowDn["+i+"]");
     415        var iconSel = getGUIObjectByName("tradeResourceSelection["+i+"]");
     416        button[resource] = { "up": buttonUp, "dn": buttonDn, "label": label, "sel": iconSel };
     417
     418        buttonSel.onpress = (function(resource){
     419            return function() {
     420                if (selec == resource)
     421                    return;
     422                selec = resource;
     423                updateButtons();
     424            }
     425        })(resource);
     426
     427        buttonUp.onpress = (function(resource){
     428            return function() {
     429                proba[resource] += Math.min(STEP, proba[selec]);
     430                proba[selec]    -= Math.min(STEP, proba[selec]);
     431                Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba});
     432                updateButtons();
     433            }
     434        })(resource);
     435
     436        buttonDn.onpress = (function(resource){
     437            return function() {
     438                proba[selec]    += Math.min(STEP, proba[resource]);
     439                proba[resource] -= Math.min(STEP, proba[resource]);
     440                Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba});
     441                updateButtons();
     442            }
     443        })(resource);
     444    }
     445    updateButtons();
     446
     447    var traderNumber = Engine.GuiInterfaceCall("GetTraderNumber");
     448    var caption = "";
     449    var comma = "";
     450    if (traderNumber.landTrader.total == 0)
     451        caption += "0";
     452    else
     453    {
     454        if (traderNumber.landTrader.trading > 0)
     455        {
     456            caption += traderNumber.landTrader.trading + " trading"
     457            comma = ", ";
     458        }
     459        if (traderNumber.landTrader.garrisoned > 0)
     460        {
     461            caption += comma + traderNumber.landTrader.garrisoned + " garrisoned inside ships";
     462            comma = ", ";
     463        }
     464        var inactive = traderNumber.landTrader.total - traderNumber.landTrader.trading - traderNumber.landTrader.garrisoned;
     465        if (inactive > 0)
     466            caption += comma + "[color=\"orange\"]" + inactive + " inactive[/color]";
     467    }
     468    getGUIObjectByName("landTraders").caption = caption;
     469
     470    caption = "";
     471    comma = "";
     472    if (traderNumber.shipTrader.total == 0)
     473        caption += "0";
     474    else
     475    {
     476        if (traderNumber.shipTrader.trading > 0)
     477        {
     478            caption += traderNumber.shipTrader.trading + " trading"
     479            comma = ", ";
     480        }
     481        var inactive = traderNumber.shipTrader.total - traderNumber.shipTrader.trading;
     482        if (inactive > 0)
     483            caption += comma + "[color=\"orange\"]" + inactive + " inactive[/color]";
     484    }
     485    getGUIObjectByName("shipTraders").caption = caption;
     486
     487    getGUIObjectByName("tradeDialogPanel").hidden = false;
     488}
     489
     490function closeTrade()
     491{
     492    isTradeOpen = false;
     493    getGUIObjectByName("tradeDialogPanel").hidden = true;
     494}
     495
     496function toggleTrade()
     497{
     498    if (isTradeOpen)
     499        closeTrade();
     500    else
     501        openTrade();
     502};
     503
    372504function toggleGameSpeed()
    373505{
    374506    var gameSpeed = getGUIObjectByName("gameSpeed");
     
    436568    closeMenu();
    437569    closeChat();
    438570    closeDiplomacy();
     571    closeTrade();
    439572    closeSettings(false);
    440573}
    441574
  • binaries/data/mods/public/gui/session/session.js

     
    5454function GetSimState()
    5555{
    5656    if (!g_SimState)
    57     {
    5857        g_SimState = Engine.GuiInterfaceCall("GetSimulationState");
    59     }
    6058
    6159    return g_SimState;
    6260}
  • binaries/data/mods/public/gui/session/session.xml

     
    435435    </object>
    436436
    437437    <!-- ================================  ================================ -->
     438    <!-- Trade Window -->
     439    <!-- ================================  ================================ -->
     440    <object name="tradeDialogPanel"
     441        size="50%-250 50%-130 50%+250 50%+100"
     442        type="image"
     443        hidden="true"
     444        sprite="ModernDialog"
     445    >
     446        <object type="text" style="TitleText" size="50%-96 -16 50%+96 16">Trade</object>
     447
     448        <!-- Trading goods -->
     449        <object name="tradeGoods" size="20 50 100%-20 114">
     450            <object name="tradeHeader" size="0 0 180 100%" type="text" style="chatPanel" ghost="true" caption="Trading goods selection:"/>
     451
     452            <object size="180 0 100% 32">
     453                <repeat count="4">
     454                    <object name="tradeResource[n]" size="0 0 56 32">
     455                        <object name="tradeResourceButton[n]" size="4 0 36 100%" type="button" style="StoneButton">
     456                            <object name="tradeResourceIcon[n]" type="image" ghost="true"/>
     457                            <object name="tradeResourceSelection[n]" type="image" sprite="stretched:session/icons/corners.png" ghost="true"/>
     458                            <object name="tradeResourceText[n]" type="text" style="ModernCenteredLabelText" ghost="true"/>
     459                        </object>
     460                        <object name="tradeArrowUp[n]" size="36 0 52 50%" type="button" style="iconButton">
     461                            <object type="image" ghost="true" sprite="wheatArrowUp"/>
     462                        </object>
     463                        <object name="tradeArrowDn[n]" size="36 50% 52 100%" type="button" style="iconButton">
     464                            <object type="image" ghost="true" sprite="wheatArrowDn"/>
     465                        </object>
     466                    </object>
     467                </repeat>
     468                <object name="tradeHelp" size="100%-24 4 100% 28" enabled="false" type="button" style="StoneButton" tooltip_style="sessionToolTipBold" tooltip="Select one goods as origin of the changes, \nthen use the arrows of the target goods to make the changes.">
     469                    <object size="20% 15% 80% 75%" type="image" ghost="true" sprite="iconInfoWhite"/>
     470                </object>
     471            </object>
     472        </object>
     473
     474        <object name="tradeStatistics" size="20 120 100%-20 168">
     475            <object                    size="0   0   130   50%" type="text" style="chatPanel" ghost="true" caption="Traders:"/>
     476            <object name="landTraders" size="130 0   100%  50%" type="text" style="chatPanel" ghost="true" />
     477            <object                    size="0   50% 130  100%" type="text" style="chatPanel" ghost="true" caption = "Merchant ships:"/>
     478            <object name="shipTraders" size="130 50% 100% 100%" type="text" style="chatPanel" ghost="true" />
     479        </object>
     480
     481        <object size="50%-64 100%-50 50%+64 100%-22" type="button" style="StoneButton">
     482            Close
     483            <action on="Press">closeTrade();</action>
     484        </object>
     485    </object>
     486
     487    <!-- ================================  ================================ -->
    438488    <!-- Settings Window -->
    439489    <!-- ================================  ================================ -->
    440490        <object name="settingsDialogPanel"
     
    635685        <!-- ================================  ================================ -->
    636686        <object type="button"
    637687        name="gameSpeedButton"
    638         size="100%-226 4 100%-198 32"
     688        size="100%-258 4 100%-230 32"
    639689        style="iconButton"
    640690        tooltip_style="sessionToolTip"
    641691        tooltip="Game speed"
     
    646696            </action>
    647697        </object>
    648698
    649         <object size="100%-348 40 100%-198 65" name="gameSpeed" type="dropdown" buffer_zone="5" style="StoneDropDown" hidden="true" tooltip="Choose game speed" tooltip_style="sessionToolTip"/>
     699        <object size="100%-380 40 100%-230 65" name="gameSpeed" type="dropdown" buffer_zone="5" style="StoneDropDown" hidden="true" tooltip="Choose game speed" tooltip_style="sessionToolTip"/>
    650700       
    651701        <!-- ================================  ================================ -->
    652702        <!-- Diplomacy Button -->
    653703        <!-- ================================  ================================ -->
    654704        <object type="button"
    655705        name="diplomacyButton1"
    656         size="100%-194 4 100%-166 32"
     706        size="100%-226 4 100%-198 32"
    657707        style="iconButton"
    658708        tooltip_style="sessionToolTip"
    659709        tooltip="Diplomacy"
     
    666716        </object>
    667717
    668718        <!-- ================================  ================================ -->
     719        <!-- Trade Button -->
     720        <!-- ================================  ================================ -->
     721        <object type="button"
     722        name="tradeButton1"
     723        size="100%-194 4 100%-166 32"
     724        style="iconButton"
     725        tooltip_style="sessionToolTip"
     726        tooltip="Trade"
     727        >
     728        <!-- TODO make the button less ugly -->
     729        <object size="0 0 100% 100%" name="tradeButtonImage" type="image" sprite="stretched:session/icons/economics.png" ghost="true"/>
     730        <action on="Press">
     731            toggleTrade();
     732        </action>
     733        </object>
     734
     735        <!-- ================================  ================================ -->
    669736        <!-- Menu Button -->
    670737        <!-- ================================  ================================ -->
    671738        <object type="button"
  • binaries/data/mods/public/gui/session/unit_commands.js

     
    1717const UNIT_PANEL_BASE = -52; // QUEUE: The offset above the main panel (will often be negative)
    1818const UNIT_PANEL_HEIGHT = 44; // QUEUE: The height needed for a row of buttons
    1919
    20 // Trading constants
    21 const TRADING_RESOURCES = ["food", "wood", "stone", "metal"];
    22 
    2320// Barter constants
    2421const BARTER_RESOURCE_AMOUNT_TO_SELL = 100;
    2522const BARTER_BUNCH_MULTIPLIER = 5;
     
    898895function setupUnitTradingPanel(usedPanels, unitEntState, selection)
    899896{
    900897    usedPanels[TRADING] = 1;
    901 
    902     for (var i = 0; i < TRADING_RESOURCES.length; i++)
    903     {
    904         var resource = TRADING_RESOURCES[i];
    905         var button = getGUIObjectByName("unitTradingButton["+i+"]");
    906         button.size = (i * 46) + " 0 " + ((i + 1) * 46) + " 46";
    907         var selectTradingPreferredGoodsData = { "entities": selection, "preferredGoods": resource };
    908         button.onpress = (function(e){ return function() { selectTradingPreferredGoods(e); } })(selectTradingPreferredGoodsData);
    909         button.enabled = true;
    910         button.tooltip = "Set " + resource + " as trading goods";
    911         var icon = getGUIObjectByName("unitTradingIcon["+i+"]");
    912         var preferredGoods = unitEntState.trader.preferredGoods;
    913         var selected = getGUIObjectByName("unitTradingSelection["+i+"]");
    914         selected.hidden = !(resource == preferredGoods);
    915         var grayscale = (resource != preferredGoods) ? "grayscale:" : "";
    916         icon.sprite = "stretched:"+grayscale+"session/icons/resources/" + resource + ".png";
    917     }
    918898}
    919899
    920900// Sets up "unit barter panel" - special case for setupUnitPanel
     
    10781058        else if (entState.production && entState.production.entities)
    10791059            setupUnitPanel(TRAINING, usedPanels, entState, playerState, trainableEnts,
    10801060                function (trainEntType) { addTrainingToQueue(selection, trainEntType, playerState); } );
    1081         else if (entState.trader)
    1082             setupUnitTradingPanel(usedPanels, entState, selection);
     1061//      else if (entState.trader)
     1062//          setupUnitTradingPanel(usedPanels, entState, selection);
    10831063        else if (!entState.foundation && entState.gate || hasClass(entState, "LongWall"))
    10841064        {
    10851065            // Allow long wall pieces to be converted to gates
  • binaries/data/mods/public/gui/session/utility_functions.js

     
    321321        });
    322322    }
    323323
     324    if (hasClass(entState, "Market"))
     325    {
     326        commands.push({
     327            "name": "select-trading-goods",
     328            "tooltip": "Select trading goods",
     329            "icon": "economics.png"
     330        });
     331    }
     332
    324333    return commands;
    325334}
    326335
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    217217    if (cmpTrader)
    218218    {
    219219        ret.trader = {
    220             "goods": cmpTrader.GetGoods(),
    221             "preferredGoods": cmpTrader.GetPreferredGoods()
     220            "goods": cmpTrader.GetGoods()
    222221        };
    223222    }
    224223
     
    17091708    {
    17101709        result = {
    17111710            "type": "is first",
    1712             "goods": cmpEntityTrader.GetPreferredGoods(),
    17131711            "hasBothMarkets": cmpEntityTrader.HasBothMarkets()
    17141712        };
    17151713        if (cmpEntityTrader.HasBothMarkets())
     
    17201718        result = {
    17211719            "type": "is second",
    17221720            "gain": cmpEntityTrader.GetGain(),
    1723             "goods": cmpEntityTrader.GetPreferredGoods()
    17241721        };
    17251722    }
    17261723    else if (!firstMarket)
     
    17321729        result = {
    17331730            "type": "set second",
    17341731            "gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
    1735             "goods": cmpEntityTrader.GetPreferredGoods()
    17361732        };
    17371733    }
    17381734    else
     
    17981794    cmpRangeManager.SetDebugOverlay(enabled);
    17991795};
    18001796
     1797GuiInterface.prototype.GetTraderNumber = function(player)
     1798{
     1799    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     1800    var traders = cmpRangeManager.GetEntitiesByPlayer(player).filter( function(e) {
     1801        return Engine.QueryInterface(e, IID_Trader);
     1802    });
     1803
     1804    var landTrader = { "total": 0, "trading": 0, "garrisoned": 0 };
     1805    var shipTrader = { "total": 0, "trading": 0 };
     1806    for each (var ent in traders)
     1807    {
     1808        var cmpIdentity =  Engine.QueryInterface(ent, IID_Identity);
     1809        var cmpUnitAI =  Engine.QueryInterface(ent, IID_UnitAI);
     1810        if (!cmpIdentity || !cmpUnitAI)
     1811            continue;
     1812        if (cmpIdentity.HasClass("Ship"))
     1813        {
     1814            ++shipTrader.total;
     1815            if (cmpUnitAI.order && cmpUnitAI.order.type == "Trade")
     1816                ++shipTrader.trading;
     1817        }
     1818        else
     1819        {
     1820            ++landTrader.total;
     1821            if (cmpUnitAI.order && cmpUnitAI.order.type == "Trade")
     1822                ++landTrader.trading;
     1823            if (cmpUnitAI.order && cmpUnitAI.order.type == "Garrison")
     1824            {
     1825                var holder = cmpUnitAI.order.data.target;
     1826                var cmpHolderUnitAI = Engine.QueryInterface(holder, IID_UnitAI);
     1827                if (cmpHolderUnitAI && cmpHolderUnitAI.order && cmpHolderUnitAI.order.type == "Trade")
     1828                    ++landTrader.garrisoned;
     1829            }
     1830        }
     1831    }
     1832
     1833    return { "landTrader": landTrader, "shipTrader": shipTrader };
     1834};
     1835
     1836GuiInterface.prototype.GetTradingGoods = function(player, tradingGoods)
     1837{
     1838    var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
     1839    return cmpPlayer.GetTradingGoods();
     1840};
     1841
    18011842GuiInterface.prototype.OnGlobalEntityRenamed = function(msg)
    18021843{
    18031844    this.renamedEntities.push(msg);
     
    18521893    "SetObstructionDebugOverlay": 1,
    18531894    "SetMotionDebugOverlay": 1,
    18541895    "SetRangeDebugOverlay": 1,
     1896
     1897    "GetTraderNumber": 1,
     1898    "GetTradingGoods": 1,
    18551899};
    18561900
    18571901GuiInterface.prototype.ScriptCall = function(player, name, args)
  • binaries/data/mods/public/simulation/components/Player.js

     
    1919        "metal": 300,
    2020        "stone": 300
    2121    };
    22    
     22    this.tradingGoods = [                      // goods for next trade-route and its proba in % (the sum of probas must be 100)
     23        { "goods": "stone", "proba": 50 },
     24        { "goods": "metal", "proba": 50 } ];
    2325    this.team = -1; // team number of the player, players on the same team will always have ally diplomatic status - also this is useful for team emblems, scoring, etc.
    2426    this.teamsLocked = false;
    2527    this.state = "active"; // game state - one of "active", "defeated", "won"
     
    234236    return true;
    235237};
    236238
     239Player.prototype.GetNextTradingGoods = function()
     240{
     241    var value = 100*Math.random();
     242    var last = this.tradingGoods.length - 1;
     243    var sumProba = 0;
     244    for (var i = 0; i < last; ++i)
     245    {
     246        sumProba += this.tradingGoods[i].proba;
     247        if (value < sumProba)
     248            return this.tradingGoods[i].goods;
     249    }
     250    return this.tradingGoods[last].goods;
     251};
     252
     253Player.prototype.GetTradingGoods = function()
     254{
     255    var tradingGoods = {};
     256    for each (var resource in this.tradingGoods)
     257        tradingGoods[resource.goods] = resource.proba;
     258
     259    return tradingGoods;
     260};
     261
     262Player.prototype.SetTradingGoods = function(tradingGoods)
     263{
     264    var sumProba = 0;
     265    for (var resource in tradingGoods)
     266        sumProba += tradingGoods[resource];
     267    if (sumProba != 100)    // consistency check
     268    {
     269        error("Player.js SetTradingGoods: " + uneval(tradingGoods));
     270        tradingGoods = { "food": 20, "wood":20, "stone":30, "metal":30 };
     271    }
     272
     273    this.tradingGoods = [];
     274    for (var resource in tradingGoods)
     275        this.tradingGoods.push( {"goods": resource, "proba": tradingGoods[resource]} );
     276};
     277
    237278Player.prototype.GetState = function()
    238279{
    239280    return this.state;
  • binaries/data/mods/public/simulation/components/Trader.js

     
    2828    this.secondMarket = INVALID_ENTITY;
    2929    // Gain from one pass between markets
    3030    this.gain = null;
    31     // Selected resource for trading
    32     this.preferredGoods = "metal";
    3331    // Currently carried goods
    3432    this.goods = { "type": null, "amount": null, "origin": null };
    3533};
     
    145143    return this.firstMarket && this.secondMarket;
    146144};
    147145
    148 Trader.prototype.GetPreferredGoods = function()
    149 {
    150     return this.preferredGoods;
    151 };
    152 
    153 Trader.prototype.SetPreferredGoods = function(preferredGoods)
    154 {
    155     // Check that argument is a correct resource name
    156     if (RESOURCES.indexOf(preferredGoods) == -1)
    157         return;
    158     this.preferredGoods = preferredGoods;
    159 };
    160 
    161146Trader.prototype.CanTrade = function(target)
    162147{
    163148    var cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity);
     
    218203                cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.market2Gain);
    219204        }
    220205    }
    221     this.goods.type = this.preferredGoods;
     206
     207    var nextGoods = undefined;
     208    var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
     209    if (cmpPlayer)
     210        nextGoods = cmpPlayer.GetNextTradingGoods();
     211
     212    if (!nextGoods || RESOURCES.indexOf(nextGoods) == -1)
     213        nextGoods = "metal";
     214
     215    this.goods.type = nextGoods;
    222216    this.goods.amount = this.gain;
    223217    this.goods.origin = currentMarket;
    224218};
  • binaries/data/mods/public/simulation/helpers/Commands.js

     
    481481        }
    482482        break;
    483483
    484     case "select-trading-goods":
    485         for each (var ent in entities)
    486         {
    487             var cmpTrader = Engine.QueryInterface(ent, IID_Trader);
    488             if (cmpTrader)
    489                 cmpTrader.SetPreferredGoods(cmd.preferredGoods);
    490         }
     484    case "set-trading-goods":
     485        cmpPlayer.SetTradingGoods(cmd.tradingGoods);
    491486        break;
    492487
    493488    case "barter":