Ticket #3917: tradeinternational.diff
File tradeinternational.diff, 16.5 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
const RESOURCES = ["food", "wood", "ston 10 10 function Trader() {} 11 11 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 "<MaxDistance>2.0</MaxDistance>" + 16 "<GainMultiplier>1.0</GainMultiplier>" + 15 "<GainMultiplier>0.75</GainMultiplier>" + 17 16 "</a:example>" + 18 "<element name='GainMultiplier' a:help=' Additional gain multiplier'>" +17 "<element name='GainMultiplier' a:help='Trader gain for a 100m distance'>" + 19 18 "<ref name='positiveDecimal'/>" + 20 19 "</element>"; 21 20 22 21 Trader.prototype.Init = function() 23 22 { … … Trader.prototype.GetFirstMarket = functi 131 130 Trader.prototype.GetSecondMarket = function() 132 131 { 133 132 return this.markets[1] || null; 134 133 }; 135 134 135 Trader.prototype.GetTraderGainMultiplier = function() 136 { 137 return ApplyValueModificationsToEntity("Trader/GainMultiplier", +this.template.GainMultiplier, this.entity); 138 } 139 136 140 Trader.prototype.HasBothMarkets = function() 137 141 { 138 142 return this.markets.length >= 2; 139 143 }; 140 144 -
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 // 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; 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) 1 function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader) 9 2 { 10 var gain = {}; 11 12 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 13 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 3 let cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 4 let cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 14 5 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || 15 6 !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld()) 16 7 return null; 17 varfirstMarketPosition = cmpFirstMarketPosition.GetPosition2D();18 varsecondMarketPosition = cmpSecondMarketPosition.GetPosition2D();8 let firstMarketPosition = cmpFirstMarketPosition.GetPosition2D(); 9 let secondMarketPosition = cmpSecondMarketPosition.GetPosition2D(); 19 10 20 // Calculate ordinary Euclidean distance between markets. 21 // We don't use pathfinder, because ordinary distance looks more fair. 22 var distance = firstMarketPosition.distanceTo(secondMarketPosition); 23 // 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 } 32 // 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 (!cmpOwnership) 11 let cmpMarket1Player = QueryOwnerInterface(firstMarket); 12 let cmpMarket2Player = QueryOwnerInterface(secondMarket); 13 if (!cmpMarket1Player || !cmpMarket2Player) 35 14 return null; 36 gain.traderOwner = cmpOwnership.GetOwner();37 15 38 // 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) 16 let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market); 17 let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market); 18 if (!cmpMarket1 || !cmpMarket2) 19 return null; 20 21 let gainMultiplier; 22 if (trader) 42 23 { 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;24 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 25 if (!cmpTrader) 26 return null; 27 gainMultiplier = cmpTrader.GetTraderGainMultiplier(); 47 28 } 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) 29 //called from the gui, modifications already applied 30 else 56 31 { 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); 32 if (!traderTemplate || !traderTemplate.GainMultiplier) 33 return null; 34 gainMultiplier = traderTemplate.GainMultiplier / 10000; 64 35 } 65 36 66 return gain; 37 let gain = {}; 38 39 // Calculate ordinary Euclidean distance between markets. 40 // We don't use pathfinder, because ordinary distance looks more fair. 41 let distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition); 42 // We calculate gain as square of distance to encourage trading between remote markets 43 gain.traderGain = distanceSq * gainMultiplier; 44 45 gain.market1Owner = cmpMarket1Player.GetPlayerID(); 46 gain.market2Owner = cmpMarket2Player.GetPlayerID(); 47 // If trader undefined, the trader owner is supposed to be the same as the first market 48 let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player; 49 if (!cmpPlayer) 50 return null; 51 gain.traderOwner = cmpPlayer.GetPlayerID(); 52 // Add potential player trade multipliers 53 let playerBonus = cmpPlayer.GetTradeRateMultiplier(); 54 // If markets belong to different players, add gain from international trading 55 if (gain.market1Owner != gain.market2Owner) 56 { let market1PlayerBonus = cmpMarket1Player.GetTradeRateMultiplier(); 57 let market2PlayerBonus = cmpMarket2Player.GetTradeRateMultiplier(); 58 let internationalBonus1 = cmpMarket1.GetInternationalBonus(); 59 let internationalBonus2 = cmpMarket2.GetInternationalBonus(); 60 gain.market1Gain = Math.round(gain.traderGain * internationalBonus1 * market1PlayerBonus); 61 gain.market2Gain = Math.round(gain.traderGain * internationalBonus2 * market2PlayerBonus); 62 } 63 gain.traderGain = Math.round(gain.traderGain * playerBonus); 64 65 return gain; 67 66 } 68 67 69 68 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_formation.xml
39 39 <FormationController>true</FormationController> 40 40 <WalkSpeed>1.0</WalkSpeed> 41 41 <PassabilityClass>large</PassabilityClass> 42 42 </UnitMotion> 43 43 <Trader> 44 <GainMultiplier> 1.0</GainMultiplier>44 <GainMultiplier>0.75</GainMultiplier> 45 45 </Trader> 46 46 </Entity> -
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> -
binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml
43 43 <BarWidth>6.0</BarWidth> 44 44 <BarHeight>0.5</BarHeight> 45 45 <HeightOffset>6.0</HeightOffset> 46 46 </StatusBars> 47 47 <Trader> 48 <GainMultiplier> 1.0</GainMultiplier>48 <GainMultiplier>0.75</GainMultiplier> 49 49 </Trader> 50 50 <UnitAI> 51 51 <DefaultStance>passive</DefaultStance> 52 52 <CanGuard>false</CanGuard> 53 53 </UnitAI> -
binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml
37 37 <gather_rock>resource/mining/pickaxe.xml</gather_rock> 38 38 <gather_ore>resource/mining/mining.xml</gather_ore> 39 39 </SoundGroups> 40 40 </Sound> 41 41 <Trader> 42 <GainMultiplier> 1.0</GainMultiplier>42 <GainMultiplier>0.75</GainMultiplier> 43 43 </Trader> 44 44 <UnitAI> 45 45 <CanGuard>false</CanGuard> 46 46 </UnitAI> 47 47 <UnitMotion> -
binaries/data/mods/public/simulation/templates/units/cart_ship_merchant.xml
11 11 <Tooltip>Trade between docks. Garrison a Trader aboard for additional profit (+20% for each garrisoned). Gather profitable aquatic treasures. Carthaginians have +25% sea trading bonus.</Tooltip> 12 12 <Icon>units/cart_ship_merchant.png</Icon> 13 13 <RequiredTechnology>phase_village</RequiredTechnology> 14 14 </Identity> 15 15 <Trader> 16 <GainMultiplier >1.25</GainMultiplier>16 <GainMultiplier op="mul">1.25</GainMultiplier> 17 17 </Trader> 18 18 <VisualActor> 19 19 <Actor>structures/carthaginians/merchant_ship.xml</Actor> 20 20 </VisualActor> 21 21 </Entity> -
binaries/data/mods/public/simulation/templates/units/pers_support_trader.xml
19 19 <order_walk>actor/fauna/movement/camel.xml</order_walk> 20 20 <death>actor/fauna/death/death_camel.xml</death> 21 21 </SoundGroups> 22 22 </Sound> 23 23 <Trader> 24 <GainMultiplier >1.25</GainMultiplier>24 <GainMultiplier op="mul">1.25</GainMultiplier> 25 25 </Trader> 26 26 <VisualActor> 27 27 <Actor>units/persians/trader.xml</Actor> 28 28 </VisualActor> 29 29 </Entity>