Ticket #3722: aitrademultiplier.patch
File aitrademultiplier.patch, 8.3 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/aiconfig/aiconfig.xml
10 10 <!-- Add a translucent black background to fade out the menu page --> 11 11 <object type="image" sprite="ModernFade"/> 12 12 13 <object type="image" style="ModernDialog" size="50%-230 50%-1 30 50%+230 50%+130">13 <object type="image" style="ModernDialog" size="50%-230 50%-150 50%+230 50%+150"> 14 14 15 15 <object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14"> 16 16 <translatableAttribute id="caption">AI Configuration</translatableAttribute> … … 33 33 </object> 34 34 </object> 35 35 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"/> 37 37 38 38 <object type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17" hotkey="cancel"> 39 39 <translatableAttribute id="caption">Cancel</translatableAttribute> -
binaries/data/mods/public/simulation/ai/petra/data.json
1 1 { 2 2 "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.", 4 4 "moduleName" : "PETRA", 5 5 "constructor": "PetraBot", 6 6 "useShared": true -
binaries/data/mods/public/simulation/components/Player.js
36 36 this.controlAllUnits = false; 37 37 this.isAI = false; 38 38 this.gatherRateMultiplier = 1; 39 this.tradeRateMultiplier = 1; 39 40 this.cheatsEnabled = false; 40 41 this.cheatTimeMultiplier = 1; 41 42 this.heroes = []; … … 156 157 return this.gatherRateMultiplier; 157 158 }; 158 159 160 Player.prototype.SetTradeRateMultiplier = function(value) 161 { 162 this.tradeRateMultiplier = value; 163 }; 164 165 Player.prototype.GetTradeRateMultiplier = function() 166 { 167 return this.tradeRateMultiplier; 168 }; 169 159 170 Player.prototype.GetHeroes = function() 160 171 { 161 172 return this.heroes; -
binaries/data/mods/public/simulation/helpers/InitGame.js
42 42 cmpRangeManager.ExploreAllTiles(i); 43 43 } 44 44 45 // Sandbox, Very Easy, Easy, Medium, Hard, Very Hard 46 let rate = [ 0.50, 0.64, 0.80, 1.00, 1.25, 1.56 ]; 45 47 let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 46 48 let cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager); 47 49 for (let i = 1; i < settings.PlayerData.length; ++i) … … 50 52 cmpPlayer.SetCheatsEnabled(!!settings.CheatsEnabled); 51 53 if (settings.PlayerData[i] && settings.PlayerData[i].AI && settings.PlayerData[i].AI != "") 52 54 { 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); 54 57 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]); 57 61 } 58 62 if (settings.PopulationCap) 59 63 cmpPlayer.SetMaxPopulation(settings.PopulationCap); -
binaries/data/mods/public/simulation/helpers/TraderGain.js
11 11 12 12 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 13 13 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 14 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld()) 14 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || 15 !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld()) 15 16 return null; 16 17 var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D(); 17 18 var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D(); … … 18 19 19 20 // Calculate ordinary Euclidean distance between markets. 20 21 // 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); 22 23 // We calculate gain as square of distance to encourage trading between remote markets 23 24 gain.traderGain = Math.pow(distance * DISTANCE_FACTOR, 2); 24 25 if (template && template.GainMultiplier) … … 28 29 else // called from the gui with modifications already applied 29 30 gain.traderGain *= template.GainMultiplier; 30 31 } 31 gain.traderGain = Math.round(gain.traderGain);32 32 // 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; 37 36 gain.traderOwner = cmpOwnership.GetOwner(); 38 37 39 38 // If markets belong to different players, add gain from international trading … … 41 40 var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner(); 42 41 if (ownerFirstMarket != ownerSecondMarket) 43 42 { 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; 46 44 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; 49 46 gain.market2Owner = ownerSecondMarket; 47 } 50 48 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); 51 65 } 52 66 53 67 return gain;