Ticket #3917: tradeinternational.3.diff
File tradeinternational.3.diff, 9.5 KB (added by , 8 years ago) |
---|
-
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'/>" + 21 "</element>" + 22 "<element name='InternationalBonus' a:help='Additional part of the gain donated when two different players trade'>" + 23 "<ref name='positiveDecimal'/>" + 20 24 "</element>"; 21 25 22 26 Trader.prototype.Init = function() 23 27 { 24 28 this.markets = []; -
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 / 115; 3 3 4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents5 const INTERNATIONAL_TRADING_ADDITION = 25;6 7 4 // If trader undefined, the trader owner is supposed to be the same as the first market 8 5 function CalculateTraderGain(firstMarket, secondMarket, template, trader) 9 6 { 10 7 var gain = {}; 11 8 … … function CalculateTraderGain(firstMarket 20 17 // Calculate ordinary Euclidean distance between markets. 21 18 // We don't use pathfinder, because ordinary distance looks more fair. 22 19 var distance = firstMarketPosition.distanceTo(secondMarketPosition); 23 20 // We calculate gain as square of distance to encourage trading between remote markets 24 21 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 applied30 gain.traderGain *= template.GainMultiplier;31 }32 // If trader undefined, the trader owner is supposed to be the same as the first market33 var cmpOwnership = trader ? Engine.QueryInterface(trader, IID_Ownership) : Engine.QueryInterface(firstMarket, IID_Ownership);34 if (!cmpOwnership)35 return null;36 gain.traderOwner = cmpOwnership.GetOwner();37 38 // If markets belong to different players, add gain from international trading39 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 22 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); 23 // else case is called from the gui with modifications already applied 24 let gainMultiplier = template && template.GainMultiplier && trader ? ApplyValueModificationsToEntity("Trader/GainMultiplier", +template.GainMultiplier, trader) : template.GainMultiplier; 54 25 55 if (ownerFirstMarket != ownerSecondMarket) 26 let cmpFirstMarketOwnership = Engine.QueryInterface(firstMarket, IID_Ownership); 27 let cmpSecondMarketOwnership = Engine.QueryInterface(secondMarket, IID_Ownership); 28 if (!cmpFirstMarketOwnership || !cmpSecondMarketOwnership) 29 return null; 30 let ownerFirstMarket = cmpFirstMarketOwnership.GetOwner(); 31 let ownerSecondMarket = cmpSecondMarketOwnership.GetOwner(); 32 // If trader undefined, the trader owner is supposed to be the same as the first market 33 let ownerTrader = ownerFirstMarket; 34 if (trader) 56 35 { 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); 36 let cmpOwnership = Engine.QueryInterface(trader, IID_Ownership); 37 if (!cmpOwnership) 38 return null; 39 let ownerTrader = cmpOwnership.GetOwner(); 64 40 } 41 gain.traderOwner = ownerTrader; 42 gain.market1Owner = ownerFirstMarket; 43 gain.market2Owner = ownerSecondMarket; 44 // Add potential player trade multipliers 45 let cmpPlayer = QueryPlayerIDInterface(ownerTrader); 46 let playerBonus = cmpPlayer ? cmpPlayer.GetTradeRateMultiplier() : 1; 47 // If markets belong to different players, add gain from international trading 48 let internationalBonus = (template && template.InternationalBonus && ownerFirstMarket != ownerSecondMarket ) ? template.InternationalBonus : 0; 49 let market1Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, firstMarket) * ((ownerTrader == ownerFirstMarket) ? playerBonus : 1); 50 let market2Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, secondMarket) * ((ownerTrader == ownerSecondMarket) ? playerBonus : 1); 51 52 gain.traderGain *= gainMultiplier; 53 gain.market1Gain = Math.round(gain.traderGain * market1Bonus); 54 gain.market2Gain = Math.round(gain.traderGain * market2Bonus); 55 gain.traderGain = Math.round(gain.traderGain * playerBonus); 65 56 66 57 return gain; 67 58 } 68 59 69 60 Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain); -
binaries/data/mods/public/simulation/templates/template_formation.xml
40 40 <WalkSpeed>1.0</WalkSpeed> 41 41 <PassabilityClass>large</PassabilityClass> 42 42 </UnitMotion> 43 43 <Trader> 44 44 <GainMultiplier>1.0</GainMultiplier> 45 <InternationalBonus>0.25</InternationalBonus> 45 46 </Trader> 46 47 </Entity> -
binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml
44 44 <BarHeight>0.5</BarHeight> 45 45 <HeightOffset>6.0</HeightOffset> 46 46 </StatusBars> 47 47 <Trader> 48 48 <GainMultiplier>1.0</GainMultiplier> 49 <InternationalBonus>0.25</InternationalBonus>InternationalBonus> 49 50 </Trader> 50 51 <UnitAI> 51 52 <DefaultStance>passive</DefaultStance> 52 53 <CanGuard>false</CanGuard> 53 54 </UnitAI> -
binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml
38 38 <gather_ore>resource/mining/mining.xml</gather_ore> 39 39 </SoundGroups> 40 40 </Sound> 41 41 <Trader> 42 42 <GainMultiplier>1.0</GainMultiplier> 43 <InternationalBonus>0.25</InternationalBonus> 43 44 </Trader> 44 45 <UnitAI> 45 46 <CanGuard>false</CanGuard> 46 47 </UnitAI> 47 48 <UnitMotion> -
binaries/data/mods/public/simulation/templates/units/cart_ship_merchant.xml
12 12 <Icon>units/cart_ship_merchant.png</Icon> 13 13 <RequiredTechnology>phase_village</RequiredTechnology> 14 14 </Identity> 15 15 <Trader> 16 16 <GainMultiplier>1.25</GainMultiplier> 17 <InternationalBonus op="add">0.1</InternationalBonus> 17 18 </Trader> 18 19 <VisualActor> 19 20 <Actor>structures/carthaginians/merchant_ship.xml</Actor> 20 21 </VisualActor> 21 22 </Entity> -
binaries/data/mods/public/simulation/templates/units/cart_support_trader.xml
16 16 <select>actor/fauna/animal/camel.xml</select> 17 17 <order_walk>actor/fauna/movement/camel.xml</order_walk> 18 18 <death>actor/fauna/death/death_camel.xml</death> 19 19 </SoundGroups> 20 20 </Sound> 21 <Trader> 22 <GainMultiplier>1.0</GainMultiplier> 23 <InternationalBonus op="add">0.1</InternationalBonus> 24 </Trader> 21 25 <VisualActor> 22 26 <Actor>units/carthaginians/trader.xml</Actor> 23 27 </VisualActor> 24 28 </Entity>