Ticket #3722: aitrademultiplier.patch

File aitrademultiplier.patch, 8.3 KB (added by mimo, 8 years ago)

improved version, with an update of the info displayed in the aiconfig panel

  • binaries/data/mods/public/gui/aiconfig/aiconfig.xml

     
    1010    <!-- Add a translucent black background to fade out the menu page -->
    1111    <object type="image" sprite="ModernFade"/>
    1212
    13     <object type="image" style="ModernDialog" size="50%-230 50%-130 50%+230 50%+130">
     13    <object type="image" style="ModernDialog" size="50%-230 50%-150 50%+230 50%+150">
    1414
    1515        <object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
    1616            <translatableAttribute id="caption">AI Configuration</translatableAttribute>
     
    3333            </object>
    3434        </object>
    3535
    36         <object name="aiDescription" type="text" style="ModernLabelText" size="8% 50%-54 92% 50%+74"/>
     36        <object name="aiDescription" type="text" style="ModernLabelText" size="8% 90 92% 100%-60"/>
    3737
    3838        <object type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17" hotkey="cancel">
    3939            <translatableAttribute id="caption">Cancel</translatableAttribute>
  • binaries/data/mods/public/simulation/ai/petra/data.json

     
    11{
    22  "name": "Petra Bot",
    3   "description": "Started as a fork of Aegis bot, Petra is the most stable AI available. It supports naval maps and is generally more challenging. Please report issues to Wildfire Games (see the link in the main menu).",
     3  "description": "Petra is the default 0AD AI bot. Please report issues to Wildfire Games (see the link in the main menu).\n\nThe AI has a malus-bonus on resource stockpiling (either gathering rate or trade gain) varying from 0.5 for Sandbox to 1.6 for Very Hard (Medium = 1.0). In addition, the Sandbox level does not expand nor attack.",
    44  "moduleName" : "PETRA",
    55  "constructor": "PetraBot",
    66  "useShared": true
  • binaries/data/mods/public/simulation/components/Player.js

     
    3636    this.controlAllUnits = false;
    3737    this.isAI = false;
    3838    this.gatherRateMultiplier = 1;
     39    this.tradeRateMultiplier = 1;
    3940    this.cheatsEnabled = false;
    4041    this.cheatTimeMultiplier = 1;
    4142    this.heroes = [];
     
    156157    return this.gatherRateMultiplier;
    157158};
    158159
     160Player.prototype.SetTradeRateMultiplier = function(value)
     161{
     162    this.tradeRateMultiplier = value;
     163};
     164
     165Player.prototype.GetTradeRateMultiplier = function()
     166{
     167    return this.tradeRateMultiplier;
     168};
     169
    159170Player.prototype.GetHeroes = function()
    160171{
    161172    return this.heroes;
  • binaries/data/mods/public/simulation/helpers/InitGame.js

     
    4242            cmpRangeManager.ExploreAllTiles(i);
    4343    }
    4444
     45    // Sandbox, Very Easy, Easy, Medium, Hard, Very Hard
     46    let rate = [ 0.50, 0.64, 0.80, 1.00, 1.25, 1.56 ];
    4547    let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
    4648    let cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
    4749    for (let i = 1; i < settings.PlayerData.length; ++i)
     
    5052        cmpPlayer.SetCheatsEnabled(!!settings.CheatsEnabled);
    5153        if (settings.PlayerData[i] && settings.PlayerData[i].AI && settings.PlayerData[i].AI != "")
    5254        {
    53             cmpAIManager.AddPlayer(settings.PlayerData[i].AI, i, +settings.PlayerData[i].AIDiff);
     55            let AIDiff = +settings.PlayerData[i].AIDiff;
     56            cmpAIManager.AddPlayer(settings.PlayerData[i].AI, i, AIDiff);
    5457            cmpPlayer.SetAI(true);
    55             // Sandbox: 50%, very easy: 50%, easy: 66%, Medium: 100%, hard: 133%, very hard: 166%
    56             cmpPlayer.SetGatherRateMultiplier(Math.max(0.5,(+settings.PlayerData[i].AIDiff)/3.0));
     58            AIDiff = Math.min(AIDiff, rate.length - 1);
     59            cmpPlayer.SetGatherRateMultiplier(rate[AIDiff]);
     60            cmpPlayer.SetTradeRateMultiplier(rate[AIDiff]);
    5761        }
    5862        if (settings.PopulationCap)
    5963            cmpPlayer.SetMaxPopulation(settings.PopulationCap);
  • binaries/data/mods/public/simulation/helpers/TraderGain.js

     
    1111
    1212    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
    1313    var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
    14     if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
     14    if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
     15        !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
    1516        return null;
    1617    var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
    1718    var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
     
    1819
    1920    // Calculate ordinary Euclidean distance between markets.
    2021    // We don't use pathfinder, because ordinary distance looks more fair.
    21     var distance = Math.sqrt(Math.pow(firstMarketPosition.x - secondMarketPosition.x, 2) + Math.pow(firstMarketPosition.y - secondMarketPosition.y, 2));
     22    var distance = firstMarketPosition.distanceTo(secondMarketPosition);
    2223    // We calculate gain as square of distance to encourage trading between remote markets
    2324    gain.traderGain = Math.pow(distance * DISTANCE_FACTOR, 2);
    2425    if (template && template.GainMultiplier)
     
    2829        else    // called from the gui with modifications already applied
    2930            gain.traderGain *= template.GainMultiplier;
    3031    }
    31     gain.traderGain = Math.round(gain.traderGain);
    3232    // If trader undefined, the trader owner is supposed to be the same as the first market
    33     if (trader)
    34         var cmpOwnership = Engine.QueryInterface(trader, IID_Ownership);
    35     else
    36         var cmpOwnership = Engine.QueryInterface(firstMarket, IID_Ownership);
     33    var cmpOwnership = trader ? Engine.QueryInterface(trader, IID_Ownership) : Engine.QueryInterface(firstMarket, IID_Ownership);
     34    if (!cmpOwnership)
     35        return null;
    3736    gain.traderOwner = cmpOwnership.GetOwner();
    3837
    3938    // If markets belong to different players, add gain from international trading
     
    4140    var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner();
    4241    if (ownerFirstMarket != ownerSecondMarket)
    4342    {
    44         var internationalGain1 = ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket);
    45         gain.market1Gain = Math.round(gain.traderGain * internationalGain1 / 100);
     43        gain.market1Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket) / 100;
    4644        gain.market1Owner = ownerFirstMarket;
    47         var internationalGain2 = ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket);
    48         gain.market2Gain = Math.round(gain.traderGain * internationalGain2 / 100);
     45        gain.market2Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket) / 100;
    4946        gain.market2Owner = ownerSecondMarket;
     47    }
    5048
     49    // Add potential trade multipliers and roundings
     50    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     51    var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(gain.traderOwner), IID_Player);
     52    if (cmpPlayer)
     53        gain.traderGain *= cmpPlayer.GetTradeRateMultiplier();
     54    gain.traderGain = Math.round(gain.traderGain);
     55
     56    if (ownerFirstMarket != ownerSecondMarket)
     57    {
     58        if ((cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(gain.market1Owner), IID_Player)))
     59            gain.market1Gain *= cmpPlayer.GetTradeRateMultiplier();
     60        gain.market1Gain = Math.round(gain.market1Gain);
     61
     62        if ((cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(gain.market2Owner), IID_Player)))
     63            gain.market2Gain *= cmpPlayer.GetTradeRateMultiplier();
     64        gain.market2Gain = Math.round(gain.market2Gain);
    5165    }
    5266
    5367    return gain;