Ticket #1691: trader-v2.diff
File trader-v2.diff, 12.1 KB (added by , 11 years ago) |
---|
-
binaries/data/mods/public/gui/session/input.js
271 271 272 272 var traderData = { "firstMarket": entState.id, "secondMarket": targetState.id, "template": trader }; 273 273 var gain = Engine.GuiInterfaceCall("GetTradingRouteGain", traderData); 274 if (gain !== null)274 if (gain && gain.trader) 275 275 { 276 276 data.command = "trade"; 277 277 data.target = traderData.secondMarket; … … 279 279 cursor = "action-setup-trade-route"; 280 280 tooltip = "Click to establish a default route for new traders."; 281 281 if (trader) 282 tooltip += " Gain: " + gain + " metal.";282 tooltip += " Gain: " + gain.trader + " metal"; 283 283 else // Foundation or cannot produce traders 284 tooltip += " Expected gain: " + gain + " metal."; 284 tooltip += " Expected gain: " + gain.trader + " metal."; 285 if (gain.market2) 286 tooltip += " and " + gain.market2 + " metal for the allied."; 287 else 288 tooltip += "."; 285 289 } 286 290 } 287 291 … … 348 352 case "is first": 349 353 tooltip = "Origin trade market."; 350 354 if (tradingDetails.hasBothMarkets) 351 tooltip += " Gain: " + tradingDetails.gain + " " + tradingDetails.goods + ". Right-click to create a new trade route." 355 { 356 tooltip += " Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 357 if (tradingDetails.gain.market1) 358 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 359 if (tradingDetails.gain.market2) 360 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 361 tooltip += ". Right-click to create a new trade route."; 362 } 352 363 else 353 364 tooltip += " Right-click on another market to set it as a destination trade market." 354 365 break; 355 366 case "is second": 356 tooltip = "Destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + "." + " Right-click to create a new trade route."; 367 tooltip = "Destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 368 if (tradingDetails.gain.market1) 369 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 370 if (tradingDetails.gain.market2) 371 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 372 tooltip += ". Right-click to create a new trade route."; 357 373 break; 358 374 case "set first": 359 375 tooltip = "Set as origin trade market"; 360 376 break; 361 377 case "set second": 362 tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + "."; 378 tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods; 379 if (tradingDetails.gain.market1) 380 tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1; 381 if (tradingDetails.gain.market2) 382 tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2; 383 tooltip += ". "; 363 384 break; 364 385 } 365 386 return {"possible": true, "tooltip": tooltip}; -
binaries/data/mods/public/gui/session/selection_details.js
133 133 getGUIObjectByName("resourceCarryingText").caption = carried.amount + " / " + carried.max; 134 134 } 135 135 // Use the same indicators for traders 136 else if (entState.trader && entState.trader.goods.amount > 0)136 else if (entState.trader && entState.trader.goods.amount && entState.trader.goods.amount.trader > 0) 137 137 { 138 138 getGUIObjectByName("resourceCarryingIcon").hidden = false; 139 139 getGUIObjectByName("resourceCarryingText").hidden = false; 140 140 getGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/resources/"+entState.trader.goods.type+".png"; 141 getGUIObjectByName("resourceCarryingText").caption = entState.trader.goods.amount; 141 getGUIObjectByName("resourceCarryingText").caption = entState.trader.goods.amount.trader; 142 if (entState.trader.goods.amount.market1) 143 getGUIObjectByName("resourceCarryingText").caption += " + " + entState.trader.goods.amount.market1; 144 if (entState.trader.goods.amount.market2) 145 getGUIObjectByName("resourceCarryingText").caption += " + " + entState.trader.goods.amount.market2; 142 146 } 143 147 else 144 148 { -
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 && template.GainMultiplier) 25 gain.trader *= template.GainMultiplier; 26 gain.trader = Math.round(gain.trader); 21 27 22 // If markets belongs 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; 28 // If markets belong to different players, multiple gain to INTERNATIONAL_TRADING_MULTIPLIER 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 && 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 Math.round(garrisonMultiplier * 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;