Ticket #3894: marketVisibility-v2.1.patch

File marketVisibility-v2.1.patch, 11.4 KB (added by mimo, 8 years ago)
  • binaries/data/mods/public/simulation/components/Fogging.js

     
    129129    if (cmpResourceSupply)
    130130        cmpMirage.CopyResourceSupply(cmpResourceSupply);
    131131
     132    var cmpMarket = Engine.QueryInterface(this.entity, IID_Market);
     133    if (cmpMarket)
     134        cmpMirage.CopyMarket(cmpMarket);
     135
    132136    // Notify the GUI the entity has been replaced by a mirage, in case it is selected at this moment
    133137    var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
    134138    cmpGuiInterface.AddMiragedEntity(player, this.entity, this.mirages[player]);
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    289289    if (cmpBuilder)
    290290        ret.builder = true;
    291291
    292     let cmpMarket = Engine.QueryInterface(ent, IID_Market);
     292    let cmpMarket = QueryMiragedInterface(ent, IID_Market);
    293293    if (cmpMarket)
    294294        ret.market = {
    295295            "land": cmpMarket.HasType("land"),
  • binaries/data/mods/public/simulation/components/Market.js

     
    4141    return this.tradeType.has(type);
    4242};
    4343
     44Market.prototype.GetType = function()
     45{
     46    return this.tradeType;
     47};
     48
     49Market.prototype.GetTraders = function()
     50{
     51    return this.traders;
     52};
     53
    4454/**
    45  * Check if all traders with a route on this market can still trade
     55 * Check if the traders attached to this market can still trade with it
     56 * Warning traders currently trading with a mirage of this market are dealt with in Mirage.js
    4657 */
     58
    4759Market.prototype.OnDiplomacyChanged = function(msg)
    4860{
    49     for (let ent of this.traders)
     61    for (let trader of this.traders)
    5062    {
    51         let cmpTrader = Engine.QueryInterface(ent, IID_Trader);
     63        let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
    5264        if (!cmpTrader)
    53             this.RemoveTrader(ent);
    54         else if (!cmpTrader.CanTrade(this.entity))
    5565        {
    56             this.RemoveTrader(ent);
    57             cmpTrader.RemoveMarket(this.entity);
     66            this.RemoveTrader(trader);
     67            continue;
    5868        }
     69        if (!cmpTrader.HasMarket(this.entity) || cmpTrader.CanTrade(this.entity))
     70            continue;
     71        // this trader can no more trade  TODO warn UnitAI
     72        this.RemoveTrader(trader);
     73        cmpTrader.RemoveMarket(this.entity);
    5974    }
    6075};
    6176
    6277Market.prototype.OnOwnershipChanged = function(msg)
    6378{
    64     for (let ent of this.traders)
     79    for (let trader of this.traders)
    6580    {
    66         let cmpTrader = Engine.QueryInterface(ent, IID_Trader);
     81        let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
    6782        if (!cmpTrader)
    68             this.RemoveTrader(ent);
    69         else if (msg.to == -1)
    70             cmpTrader.RemoveMarket(this.entity);
    71         else if (!cmpTrader.CanTrade(this.entity))
    7283        {
    73             this.RemoveTrader(ent);
    74             cmpTrader.RemoveMarket(this.entity);
     84            this.RemoveTrader(trader);
     85            continue;
    7586        }
     87        if (!cmpTrader.HasMarket(this.entity) || (msg.to != -1 && cmpTrader.CanTrade(this.entity)))
     88            continue;
     89        // this trader can no more trade  TODO warn UnitAI
     90        this.RemoveTrader(trader);
     91        cmpTrader.RemoveMarket(this.entity);
    7692    }
    7793};
    7894
  • binaries/data/mods/public/simulation/components/Mirage.js

     
    3434    this.killBeforeGather = null;
    3535    this.maxGatherers = null;
    3636    this.numGatherers = null;
     37
     38    this.traders = null;
     39    this.marketType = null;
     40    this.internationalBonus = null;
    3741};
    3842
    3943Mirage.prototype.SetParent = function(ent)
     
    125129Mirage.prototype.GetMaxGatherers = function() { return this.maxGatherers; };
    126130Mirage.prototype.GetNumGatherers = function() { return this.numGatherers; };
    127131
     132// Market data
     133
     134Mirage.prototype.CopyMarket = function(cmpMarket)
     135{
     136    this.miragedIids.add(IID_Market);
     137    this.traders = new Set();
     138    for (let trader of cmpMarket.GetTraders())
     139    {
     140        let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
     141        let cmpOwnership = Engine.QueryInterface(trader, IID_Ownership);
     142        if (!cmpTrader || !cmpOwnership)
     143        {
     144            cmpMarket.RemoveTrader(trader);
     145            continue;
     146        }
     147        if (this.player != cmpOwnership.GetOwner())
     148            continue;
     149        cmpTrader.SwitchMarket(cmpMarket.entity, this.entity);
     150        cmpMarket.RemoveTrader(trader);
     151        this.AddTrader(trader);
     152    }
     153    this.marketType = cmpMarket.GetType();
     154    this.internationalBonus = cmpMarket.GetInternationalBonus();
     155};
     156
     157Mirage.prototype.HasType = function(type) { return this.marketType.has(type); };
     158Mirage.prototype.GetInternationalBonus = function() { return this.internationalBonus; };
     159Mirage.prototype.AddTrader = function(trader) { this.traders.add(trader); };
     160Mirage.prototype.RemoveTrader = function(trader) { this.traders.delete(trader); };
     161
     162Mirage.prototype.UpdateTraders = function(msg)
     163{
     164    let cmpMarket = Engine.QueryInterface(this.parent, IID_Market);
     165    if (!cmpMarket) // The parent market does not exist anymore
     166    {
     167        for (let trader of this.traders)
     168        {
     169            // TODO warn UnitAI
     170            let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
     171            if (cmpTrader)
     172                cmpTrader.RemoveMarket(this.entity);
     173        }
     174        return;
     175    }
     176
     177    // The market becomes visible, switch all traders from the mirage to the market
     178    for (let trader of this.traders)
     179    {
     180        let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
     181        if (!cmpTrader)
     182            continue;
     183        cmpTrader.SwitchMarket(this.entity, cmpMarket.entity);
     184        this.RemoveTrader(trader);
     185        cmpMarket.AddTrader(trader);
     186    }
     187};
     188
    128189// ============================
    129190
    130191Mirage.prototype.OnVisibilityChanged = function(msg)
     
    132193    if (msg.player != this.player || msg.newVisibility != VIS_HIDDEN)
    133194        return;
    134195
     196    if (this.miragedIids.has(IID_Market))
     197        this.UpdateTraders(msg);
     198
    135199    if (this.parent == INVALID_ENTITY)
    136200        Engine.DestroyEntity(this.entity);
    137201    else
  • binaries/data/mods/public/simulation/components/Trader.js

     
    4444        {
    4545            var garrisonMultiplier = 1;
    4646            var garrisonedTradersCount = 0;
    47             for each (var entity in cmpGarrisonHolder.GetEntities())
     47            for (var entity of cmpGarrisonHolder.GetEntities())
    4848            {
    4949                var cmpGarrisonedUnitTrader = Engine.QueryInterface(entity, IID_Trader);
    5050                if (cmpGarrisonedUnitTrader)
     
    6868// Return true if at least one of markets was changed.
    6969Trader.prototype.SetTargetMarket = function(target, source)
    7070{
    71     var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);
     71    let cmpTargetMarket = QueryMiragedInterface(target, IID_Market);
    7272    if (!cmpTargetMarket)
    7373        return false;
    7474
     
    7575    if (source)
    7676    {
    7777        // Establish a trade route with both markets in one go.
    78         let cmpSourceMarket = Engine.QueryInterface(source, IID_Market);
     78        let cmpSourceMarket = QueryMiragedInterface(source, IID_Market);
    7979        if (!cmpSourceMarket)
    8080            return false;
    8181        this.markets = [source];
    82         cmpSourceMarket.AddTrader(this.entity);
    8382    }
    8483    if (this.markets.length >= 2)
    8584    {
     
    8786        // and use the target as first market
    8887        for (let market of this.markets)
    8988        {
    90             let cmpMarket = Engine.QueryInterface(market, IID_Market);
     89            let cmpMarket = QueryMiragedInterface(market, IID_Market);
    9190            if (cmpMarket)
    9291                cmpMarket.RemoveTrader(this.entity);
    9392        }
     
    160159{
    161160    var cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity);
    162161    // Check that the target exists
    163     var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);
     162    var cmpTargetMarket = QueryMiragedInterface(target, IID_Market);
    164163    if (!cmpTargetMarket)
    165164        return false;
    166165    // Check that the target is not a foundation
     
    252251};
    253252
    254253/**
    255  * Called when this trader can no longer trade with the market
     254 * Returns true if the trader has the given market (can be either a market or a mirage)
    256255 */
     256Trader.prototype.HasMarket = function(market)
     257{
     258    return this.markets.indexOf(market) != -1;
     259};
     260
     261/**
     262 * Remove a market when this trader can no longer trade with it
     263 */
    257264Trader.prototype.RemoveMarket = function(market)
    258265{
    259266    let index = this.markets.indexOf(market);
    260267    if (index != -1)
    261268        this.markets.splice(index, 1);
     269    else
     270        error(" RemoveMarket problem: " + market);
    262271};
    263272
     273/**
     274 * Switch between a market and its mirage according to visibility
     275 */
     276Trader.prototype.SwitchMarket = function(oldMarket, newMarket)
     277{
     278    let index = this.markets.indexOf(oldMarket);
     279    if (index == -1)
     280        return;
     281    this.markets[index] = newMarket;
     282    let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
     283    if (cmpUnitAI)
     284        cmpUnitAI.SwitchMarketOrder(oldMarket, newMarket);
     285};
     286
    264287Trader.prototype.StopTrading = function()
    265288{
    266289    for (let market of this.markets)
    267290    {
    268         let cmpMarket = Engine.QueryInterface(market, IID_Market);
     291        let cmpMarket = QueryMiragedInterface(market, IID_Market);
    269292        if (cmpMarket)
    270293            cmpMarket.RemoveTrader(this.entity);
    271294    }
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    648648    "Order.Trade": function(msg) {
    649649        // We must check if this trader has both markets in case it was a back-to-work order
    650650        var cmpTrader = Engine.QueryInterface(this.entity, IID_Trader);
    651         if (!cmpTrader || ! cmpTrader.HasBothMarkets())
     651        if (!cmpTrader || !cmpTrader.HasBothMarkets())
    652652        {
    653653            this.FinishOrder();
    654654            return;
     
    53445344        error("UnitAI: Setting to invalid stance '"+stance+"'");
    53455345};
    53465346
     5347UnitAI.prototype.SwitchMarketOrder = function(oldMarket, newMarket)
     5348{
     5349    if (this.order.data && this.order.data.target && this.order.data.target == oldMarket)
     5350    {
     5351        this.order.data.target == newMarket;
     5352        // Mirages have no obstruction and can lead to strange path, so when the mirage is destroyed
     5353        // and the market becomes visible, redo the pathing
     5354        if (Engine.QueryInterface(newMarket, IID_Market) && this.GetCurrentState().split(".").pop() == "APPROACHINGMARKET")
     5355            this.MoveToMarket(newMarket);
     5356    }
     5357};
     5358
    53475359UnitAI.prototype.SwitchToStance = function(stance)
    53485360{
    53495361    var cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
  • binaries/data/mods/public/simulation/helpers/TraderGain.js

     
    11function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader)
    22{
    3     let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market);
    4     let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market);
     3    let cmpMarket1 = QueryMiragedInterface(firstMarket, IID_Market);
     4    let cmpMarket2 = QueryMiragedInterface(secondMarket, IID_Market);
    55    if (!cmpMarket1 || !cmpMarket2)
    66        return null;
    77