Ticket #3917: tradeinternational.5.diff
File tradeinternational.5.diff, 12.0 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/simulation/components/Market.js
Market.prototype.Schema = 8 8 "<value>land</value>" + 9 9 "<value>naval</value>" + 10 10 "</choice>" + 11 11 "</oneOrMore>" + 12 12 "</list>" + 13 "</element>" + 14 "<element name='InternationalBonus' a:help='Additional part of the gain donated when two different players trade'>" + 15 "<ref name='nonNegativeDecimal'/>" + 13 16 "</element>"; 14 17 15 18 Market.prototype.Init = function() 16 19 { 17 20 this.traders = new Set(); // list of traders with a route on this market … … Market.prototype.AddTrader = function(en 26 29 Market.prototype.RemoveTrader = function(ent) 27 30 { 28 31 this.traders.delete(ent); 29 32 }; 30 33 34 Market.prototype.GetInternationalBonus = function() 35 { 36 return ApplyValueModificationsToEntity("Market/InternationalBonus", +this.template.InternationalBonus, this.entity); 37 } 38 31 39 Market.prototype.HasType = function(type) 32 40 { 33 41 return this.tradeType.has(type); 34 42 }; 35 43 -
binaries/data/mods/public/simulation/components/Trader.js
function Trader() {} 12 12 Trader.prototype.Schema = 13 13 "<a:help>Lets the unit generate resouces while moving between markets (or docks in case of water trading).</a:help>" + 14 14 "<a:example>" + 15 15 "<MaxDistance>2.0</MaxDistance>" + 16 16 "<GainMultiplier>1.0</GainMultiplier>" + 17 "<InternationalBonus>0.25</InternationalBonus>" + 17 18 "</a:example>" + 18 19 "<element name='GainMultiplier' a:help='Additional gain multiplier'>" + 19 20 "<ref name='positiveDecimal'/>" + 20 21 "</element>"; 21 22 … … Trader.prototype.GetFirstMarket = functi 131 132 Trader.prototype.GetSecondMarket = function() 132 133 { 133 134 return this.markets[1] || null; 134 135 }; 135 136 137 Trader.prototype.GetTraderGainMultiplier = function() 138 { 139 return ApplyValueModificationsToEntity("Trader/GainMultiplier", +this.template.GainMultiplier, this.entity); 140 } 141 136 142 Trader.prototype.HasBothMarkets = function() 137 143 { 138 144 return this.markets.length >= 2; 139 145 }; 140 146 -
binaries/data/mods/public/simulation/data/technologies/trade_commercial_treaty.json
1 { 2 "genericName": "Commercial Treaty", 3 "description": "Improve the international trading profit.", 4 "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 100 }, 5 "requirements": { "tech": "phase_town" }, 6 "requirementsTooltip": "Unlocked in Town Phase.", 7 "icon": "sibylline_books.png", 8 "researchTime": 40, 9 "tooltip": "Market +10% International Bonus.", 10 "modifications": [{ "value": "Market/InternationalBonus", "add": 0.10 }], 11 "affects": ["Market"], 12 "soundComplete": "interface/alarm/alarm_upgradearmory.xml" 13 } -
binaries/data/mods/public/simulation/helpers/TraderGain.js
1 1 // This constant used to adjust gain value depending on distance 2 const DISTANCE_FACTOR = 1 / 1 15;2 const DISTANCE_FACTOR = 1 / 13225; 3 3 4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents 5 const INTERNATIONAL_TRADING_ADDITION = 25; 6 7 // If trader undefined, the trader owner is supposed to be the same as the first market 8 function CalculateTraderGain(firstMarket, secondMarket, template, trader) 4 function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader) 9 5 { 6 if (!traderTemplate) 7 return null; 10 8 var gain = {}; 11 9 12 10 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 13 11 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 14 12 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || … … function CalculateTraderGain(firstMarket 17 15 var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D(); 18 16 var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D(); 19 17 20 18 // Calculate ordinary Euclidean distance between markets. 21 19 // We don't use pathfinder, because ordinary distance looks more fair. 22 var distance = firstMarketPosition.distanceTo(secondMarketPosition);20 var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition); 23 21 // We calculate gain as square of distance to encourage trading between remote markets 24 gain.traderGain = Math.pow(distance * DISTANCE_FACTOR, 2); 25 if (template && template.GainMultiplier) 26 { 27 if (trader) 28 gain.traderGain *= ApplyValueModificationsToEntity("Trader/GainMultiplier", +template.GainMultiplier, trader); 29 else // called from the gui with modifications already applied 30 gain.traderGain *= template.GainMultiplier; 31 } 22 gain.traderGain = distanceSq * DISTANCE_FACTOR; 23 let gainMultiplier = traderTemplate.GainMultiplier || 1; 24 // false when called from the gui, modifications already applied 25 if (trader) 26 gainMultiplier = ApplyValueModificationsToEntity("Trader/GainMultiplier", gainMultiplier, trader); 27 let cmpMarket1Player = QueryOwnerInterface(firstMarket); 28 let cmpMarket2Player = QueryOwnerInterface(secondMarket); 29 if (!cmpMarket1Player || !cmpMarket2Player) 30 return null; 31 gain.market1Owner = cmpMarket1Player.GetPlayerID(); 32 gain.market2Owner = cmpMarket2Player.GetPlayerID(); 32 33 // If trader undefined, the trader owner is supposed to be the same as the first market 33 var cmpOwnership = trader ? Engine.QueryInterface(trader, IID_Ownership) : Engine.QueryInterface(firstMarket, IID_Ownership);34 if (!cmp Ownership)34 let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player; 35 if (!cmpPlayer) 35 36 return null; 36 gain.traderOwner = cmpOwnership.GetOwner(); 37 37 gain.traderOwner = cmpPlayer.GetPlayerID(); 38 // Add potential player trade multipliers 39 let playerBonus = cmpPlayer.GetTradeRateMultiplier(); 40 let market1PlayerBonus = gain.traderOwner == gain.market1Owner ? cmpMarket1Player.GetTradeRateMultiplier() : 1; 41 let market2PlayerBonus = gain.traderOwner == gain.market2Owner ? cmpMarket2Player.GetTradeRateMultiplier() : 1; 38 42 // If markets belong to different players, add gain from international trading 39 var ownerFirstMarket = Engine.QueryInterface(firstMarket, IID_Ownership).GetOwner(); 40 var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner(); 41 if (ownerFirstMarket != ownerSecondMarket) 42 { 43 gain.market1Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket) / 100; 44 gain.market1Owner = ownerFirstMarket; 45 gain.market2Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket) / 100; 46 gain.market2Owner = ownerSecondMarket; 47 } 48 49 // Add potential trade multipliers and roundings 50 var cmpPlayer = trader ? QueryOwnerInterface(trader) : QueryOwnerInterface(firstMarket); 51 if (cmpPlayer) 52 gain.traderGain *= cmpPlayer.GetTradeRateMultiplier(); 53 gain.traderGain = Math.round(gain.traderGain); 54 55 if (ownerFirstMarket != ownerSecondMarket) 56 { 57 if ((cmpPlayer = QueryOwnerInterface(firstMarket))) 58 gain.market1Gain *= cmpPlayer.GetTradeRateMultiplier(); 59 gain.market1Gain = Math.round(gain.market1Gain); 60 61 if ((cmpPlayer = QueryOwnerInterface(secondMarket))) 62 gain.market2Gain *= cmpPlayer.GetTradeRateMultiplier(); 63 gain.market2Gain = Math.round(gain.market2Gain); 64 } 43 let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market); 44 let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market); 45 if (!cmpMarket1 || !cmpMarket2) 46 return null; 47 let internationalBonus1 = gain.market1Owner != gain.market2Owner ? cmpMarket1.GetInternationalBonus() : 0; 48 let internationalBonus2 = gain.market1Owner != gain.market2Owner ? cmpMarket2.GetInternationalBonus() : 0; 49 gain.traderGain *= gainMultiplier; 50 gain.market1Gain = Math.round(gain.traderGain * internationalBonus1 * market1PlayerBonus); 51 gain.market2Gain = Math.round(gain.traderGain * internationalBonus2 * market2PlayerBonus); 52 gain.traderGain = Math.round(gain.traderGain * playerBonus); 65 53 66 54 return gain; 67 55 } 68 56 69 57 Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain); -
binaries/data/mods/public/simulation/templates/structures/cart_dock.xml
17 17 <GenericName>Commercial Port</GenericName> 18 18 <SpecificName>Namel</SpecificName> 19 19 <History>The Carthaginians were famous for their sea trade. Carthage itself had an entire harbor dedicated to nothing more than commercial sea trade.</History> 20 20 <Tooltip>Construct fishing boats to gather meat and merchant ships to trade with other docks.</Tooltip> 21 21 </Identity> 22 <Market> 23 <InternationalBonus op="add">0.1</InternationalBonus> 24 </Market> 22 25 <Obstruction> 23 26 <Static width="30.0" depth="19.0"/> 24 27 </Obstruction> 25 28 <ProductionQueue> 26 29 <Technologies datatype="tokens"> -
binaries/data/mods/public/simulation/templates/structures/cart_market.xml
10 10 <Identity> 11 11 <Civ>cart</Civ> 12 12 <SpecificName>Šūq</SpecificName> 13 13 <History>Carthaginian markets were probably just big sheds or structures surrounding a ?market? area or in a wharf area of a port.</History> 14 14 </Identity> 15 <Market> 16 <InternationalBonus op="add">0.1</InternationalBonus> 17 </Market> 15 18 <Obstruction> 16 19 <Static width="27.0" depth="20.0"/> 17 20 </Obstruction> 18 21 <VisualActor> 19 22 <Actor>structures/carthaginians/market.xml</Actor> -
binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml
32 32 <stone>25</stone> 33 33 <metal>25</metal> 34 34 </Loot> 35 35 <Market> 36 36 <TradeType>land</TradeType> 37 <InternationalBonus>0.2</InternationalBonus> 37 38 </Market> 38 39 <Obstruction> 39 40 <Static width="30.0" depth="26.0"/> 40 41 </Obstruction> 41 42 <Sound> … … 57 58 unlock_shared_dropsites 58 59 trade_convoys_speed 59 60 trade_convoys_armor 60 61 trade_gain_01 61 62 trade_gain_02 63 trade_commercial_treaty 62 64 </Technologies> 63 65 <Entities datatype="tokens"> 64 66 units/{civ}_support_trader 65 67 </Entities> 66 68 </ProductionQueue> -
binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml
34 34 <stone>0</stone> 35 35 <metal>0</metal> 36 36 </Loot> 37 37 <Market> 38 38 <TradeType>land naval</TradeType> 39 <InternationalBonus>0.2</InternationalBonus> 39 40 </Market> 40 41 <Obstruction> 41 42 <Static width="18.0" depth="18.0"/> 42 43 </Obstruction> 43 44 <Position>