Ticket #1691: trader.diff
File trader.diff, 10.5 KB (added by , 11 years ago) |
---|
-
binaries/data/mods/public/gui/session/input.js
270 270 271 271 var traderData = { "firstMarket": entState.id, "secondMarket": targetState.id, "template": trader }; 272 272 var gain = Engine.GuiInterfaceCall("GetTradingRouteGain", traderData); 273 if (gain !== null)273 if (gain && gain.trader) 274 274 { 275 275 data.command = "trade"; 276 276 data.target = traderData.secondMarket; 277 277 data.source = traderData.firstMarket; 278 278 cursor = "action-setup-trade-route"; 279 tooltip = "Click to establish a default route for new traders. Gain: " + gain + " metal."; 279 tooltip = "Click to establish a default route for new traders. Gain: " + gain.trader + " metal"; 280 if (gain.market2) 281 tooltip += " and " + gain.market2 + " metal for the allied."; 282 else 283 tooltip += "."; 280 284 } 281 285 } 282 286 … … 335 339 case "is first": 336 340 tooltip = "Origin trade market."; 337 341 if (tradingDetails.hasBothMarkets) 338 tooltip += " Gain: " + tradingDetails.gain + " " + tradingDetails.goods + ". Right-click to create a new trade route." 342 { 343 tooltip += " Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 344 if (tradingDetails.gain.market1) 345 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 346 if (tradingDetails.gain.market2) 347 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 348 tooltip += ". Right-click to create a new trade route."; 349 } 339 350 else 340 351 tooltip += " Right-click on another market to set it as a destination trade market." 341 352 break; 342 353 case "is second": 343 tooltip = "Destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + "." + " Right-click to create a new trade route."; 354 tooltip = "Destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 355 if (tradingDetails.gain.market1) 356 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 357 if (tradingDetails.gain.market2) 358 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 359 tooltip += ". Right-click to create a new trade route."; 344 360 break; 345 361 case "set first": 346 362 tooltip = "Set as origin trade market"; 347 363 break; 348 364 case "set second": 349 tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + "."; 365 tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 366 if (tradingDetails.gain.market1) 367 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 368 if (tradingDetails.gain.market2) 369 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 370 tooltip += ". "; 350 371 break; 351 372 } 352 373 return {"possible": true, "tooltip": tooltip}; -
binaries/data/mods/public/simulation/helpers/TraderGain.js
1 1 // This constant used to adjust gain value depending on distance 2 2 const DISTANCE_FACTOR = 1 / 110; 3 3 4 // Additional gain for trading performed between markets of different players, in percents5 const INTERNATIONAL_TRADING_ADDITION = 50;4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents 5 const INTERNATIONAL_TRADING_ADDITION = 25; 6 6 7 function CalculateTraderGain(firstMarket, secondMarket, template) 7 // If trader undefined, the trader owner is supposed to be the same as the first market 8 function CalculateTraderGain(firstMarket, secondMarket, template, trader) 8 9 { 10 var gain = {}; 11 9 12 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 10 13 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 11 14 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld()) … … 17 20 // We don't use pathfinder, because ordinary distance looks more fair. 18 21 var distance = Math.sqrt(Math.pow(firstMarketPosition.x - secondMarketPosition.x, 2) + Math.pow(firstMarketPosition.y - secondMarketPosition.y, 2)); 19 22 // We calculate gain as square of distance to encourage trading between remote markets 20 var gain = Math.pow(distance * DISTANCE_FACTOR, 2); 23 gain.trader = Math.pow(distance * DISTANCE_FACTOR, 2); 24 if (template.GainMultiplier) 25 gain.trader *= template.GainMultiplier; 26 gain.trader = Math.round(gain.trader); 21 27 22 28 // If markets belong to different players, multiple gain to INTERNATIONAL_TRADING_MULTIPLIER 23 var cmpFirstMarketOwnership = Engine.QueryInterface(firstMarket, IID_Ownership); 24 var cmpSecondMarketOwnership = Engine.QueryInterface(secondMarket, IID_Ownership); 25 if (cmpFirstMarketOwnership.GetOwner() != cmpSecondMarketOwnership.GetOwner()) 26 gain *= 1 + INTERNATIONAL_TRADING_ADDITION / 100; 29 var ownerFirstMarket = Engine.QueryInterface(firstMarket, IID_Ownership).GetOwner(); 30 var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner(); 31 if (ownerFirstMarket != ownerSecondMarket) 32 { 33 var internationalGain1 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket); 34 internationalGain1 = Math.round(gain.trader * internationalGain1 / 100); 35 var internationalGain2 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket); 36 internationalGain2 = Math.round(gain.trader * internationalGain2 / 100); 27 37 28 if (template.GainMultiplier) 29 gain *= template.GainMultiplier; 30 gain = Math.round(gain); 38 if (trader) 39 { 40 var cmpTraderOwnership = Engine.QueryInterface(trader, IID_Ownership); 41 if (ownerFirstMarket == cmpTraderOwnership.GetOwner()) 42 gain.trader += internationalGain1; 43 else 44 { 45 gain.market1 = internationalGain1; 46 gain.owner1 = ownerFirstMarket; 47 } 48 49 if (ownerSecondMarket == cmpTraderOwnership.GetOwner()) 50 gain.trader += internationalGain2; 51 else 52 { 53 gain.market2 = internationalGain2; 54 gain.owner2 = ownerSecondMarket; 55 } 56 } 57 else 58 { 59 // If trader undefined, the trader owner is supposed to be the same as the first market 60 gain.trader += internationalGain1; 61 gain.market2 = internationalGain2; 62 gain.owner2 = ownerSecondMarket; 63 } 64 } 65 31 66 return gain; 32 67 } 33 68 -
binaries/data/mods/public/simulation/components/Trader.js
31 31 // Selected resource for trading 32 32 this.preferredGoods = "metal"; 33 33 // Currently carried goods 34 this.goods = { "type": null, "amount": 0};34 this.goods = { "type": null, "amount": null }; 35 35 } 36 36 37 37 Trader.prototype.CalculateGain = function(firstMarket, secondMarket, template) 38 38 { 39 var gain = CalculateTraderGain(firstMarket, secondMarket, this.template, this.entity); 40 39 41 // For ship increase gain for each garrisoned trader 40 // Calculate this here to save passing unnecessary stuff into the CalculatetraderGain function 41 var garrisonMultiplier = 1; 42 // Calculate this here to save passing unnecessary stuff into the CalculateTraderGain function 42 43 var cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity); 43 44 if (cmpIdentity && cmpIdentity.HasClass("Ship")) 44 45 { 45 46 var cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder); 46 47 if (cmpGarrisonHolder) 47 48 { 49 var garrisonMultiplier = 1; 48 50 var garrisonedTradersCount = 0; 49 51 for each (var entity in cmpGarrisonHolder.GetEntities()) 50 52 { … … 53 55 garrisonedTradersCount++; 54 56 } 55 57 garrisonMultiplier *= 1 + GARRISONED_TRADER_ADDITION * garrisonedTradersCount / 100; 58 59 if (gain.trader) 60 gain.trader = Math.round(garrisonMultiplier * gain.trader); 61 if (gain.market1) 62 gain.market1 = Math.round(garrisonMultiplier * gain.market1); 63 if (gain.market2) 64 gain.market2 = Math.round(garrisonMultiplier * gain.market2); 56 65 } 57 66 } 58 67 59 return ga rrisonMultiplier * CalculateTraderGain(firstMarket, secondMarket, this.template);68 return gain; 60 69 } 61 70 62 71 Trader.prototype.GetGain = function() … … 116 125 if (marketsChanged) 117 126 { 118 127 // Drop carried goods 119 this.goods.amount = 0;128 this.goods.amount = null; 120 129 } 121 130 return marketsChanged; 122 131 } … … 177 186 178 187 Trader.prototype.PerformTrade = function() 179 188 { 180 if (this.goods.amount > 0)189 if (this.goods.amount && this.goods.amount.trader) 181 190 { 182 191 var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 183 cmpPlayer.AddResource(this.goods.type, this.goods.amount );192 cmpPlayer.AddResource(this.goods.type, this.goods.amount.trader); 184 193 185 194 var cmpStatisticsTracker = QueryOwnerInterface(this.entity, IID_StatisticsTracker); 186 195 if (cmpStatisticsTracker) 187 cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount); 196 cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.trader); 197 198 if (this.goods.amount.market1) 199 { 200 var cmpPlayer = QueryOwnerInterface(this.firstMarket, IID_Player); 201 cmpPlayer.AddResource(this.goods.type, this.goods.amount.market1); 202 203 var cmpStatisticsTracker = QueryOwnerInterface(this.firstMarket, IID_StatisticsTracker); 204 if (cmpStatisticsTracker) 205 cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.market1); 206 } 207 208 if (this.goods.amount.market2) 209 { 210 var cmpPlayer = QueryOwnerInterface(this.secondMarket, IID_Player); 211 cmpPlayer.AddResource(this.goods.type, this.goods.amount.market2); 212 213 var cmpStatisticsTracker = QueryOwnerInterface(this.secondMarket, IID_StatisticsTracker); 214 if (cmpStatisticsTracker) 215 cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.market2); 216 } 188 217 } 189 218 this.goods.type = this.preferredGoods; 190 219 this.goods.amount = this.gain; … … 198 227 Trader.prototype.StopTrading = function() 199 228 { 200 229 // Drop carried goods 201 this.goods.amount = 0;230 this.goods.amount = null; 202 231 // Reset markets 203 232 this.firstMarket = INVALID_ENTITY; 204 233 this.secondMarket = INVALID_ENTITY;