Ticket #3917: tradeinternational.4.diff
File tradeinternational.4.diff, 9.7 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 const DISTANCE_FACTOR = 1 / 115; 3 4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents 5 const INTERNATIONAL_TRADING_ADDITION = 25; 2 const DISTANCE_FACTOR = 1 / 13225; 6 3 7 4 // If trader undefined, the trader owner is supposed to be the same as the first market 8 function CalculateTraderGain(firstMarket, secondMarket, t emplate, trader)5 function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader) 9 6 { 7 if (!traderTemplate) 8 return null; 10 9 var gain = {}; 11 10 12 11 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 13 12 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 14 13 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || … … function CalculateTraderGain(firstMarket 17 16 var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D(); 18 17 var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D(); 19 18 20 19 // Calculate ordinary Euclidean distance between markets. 21 20 // We don't use pathfinder, because ordinary distance looks more fair. 22 var distance = firstMarketPosition.distanceTo(secondMarketPosition);21 var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition); 23 22 // 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 } 23 gain.traderGain = distanceSq * DISTANCE_FACTOR; 24 let gainMultiplier = traderTemplate.GainMultiplier || 1; 25 // false when called from the gui, modifications already applied 26 if (trader) 27 gainMultiplier = ApplyValueModificationsToEntity("Trader/GainMultiplier", gainMultiplier, trader); 28 let cmpFirstMarketPlayer = QueryOwnerInterface(firstMarket); 29 let cmpSecondMarketPlayer = QueryOwnerInterface(secondMarket); 30 if (!cmpFirstMarketPlayer || !cmpSecondMarketPlayer) 31 return null; 32 gain.market1Owner = cmpFirstMarketPlayer.GetPlayerID(); 33 gain.market2Owner = cmpSecondMarketPlayer.GetPlayerID(); 32 34 // 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)35 let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpFirstMarketPlayer; 36 if (!cmpPlayer) 35 37 return null; 36 gain.traderOwner = cmpOwnership.GetOwner(); 37 38 gain.traderOwner = cmpPlayer.GetPlayerID(); 39 // Add potential player trade multipliers 40 let playerBonus = cmpPlayer.GetTradeRateMultiplier(); 38 41 // 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 } 42 let internationalBonus = traderTemplate && traderTemplate.InternationalBonus && gain.market1Owner != gain.market2Owner ? traderTemplate.InternationalBonus : 0; 43 let market1Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, firstMarket) * ((gain.traderOwner == gain.market1Owner) ? playerBonus : 1); 44 let market2Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, secondMarket) * ((gain.traderOwner == gain.market2Owner) ? playerBonus : 1); 45 gain.traderGain *= gainMultiplier; 46 gain.market1Gain = Math.round(gain.traderGain * market1Bonus); 47 gain.market2Gain = Math.round(gain.traderGain * market2Bonus); 48 gain.traderGain = Math.round(gain.traderGain * playerBonus); 65 49 66 50 return gain; 67 51 } 68 52 69 53 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> 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>