Ticket #3917: tradeinternational.6.diff
File tradeinternational.6.diff, 15.6 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 // This constant used to adjust gain value depending on distance2 const DISTANCE_FACTOR = 1 / 115;3 1 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) 2 function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader) 9 3 { 4 if (!traderTemplate) 5 return null; 10 6 var gain = {}; 11 7 12 8 var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position); 13 9 var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position); 14 10 if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || … … function CalculateTraderGain(firstMarket 17 13 var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D(); 18 14 var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D(); 19 15 20 16 // Calculate ordinary Euclidean distance between markets. 21 17 // We don't use pathfinder, because ordinary distance looks more fair. 22 var distance = firstMarketPosition.distanceTo(secondMarketPosition);18 var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition); 23 19 // 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 } 20 gain.traderGain = distanceSq; 21 let gainMultiplier = traderTemplate.GainMultiplier || 1; 22 // false when called from the gui, modifications already applied 23 if (trader) 24 gainMultiplier = ApplyValueModificationsToEntity("Trader/GainMultiplier", gainMultiplier, trader); 25 let cmpMarket1Player = QueryOwnerInterface(firstMarket); 26 let cmpMarket2Player = QueryOwnerInterface(secondMarket); 27 if (!cmpMarket1Player || !cmpMarket2Player) 28 return null; 29 gain.market1Owner = cmpMarket1Player.GetPlayerID(); 30 gain.market2Owner = cmpMarket2Player.GetPlayerID(); 32 31 // 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)32 let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player; 33 if (!cmpPlayer) 35 34 return null; 36 gain.traderOwner = cmpOwnership.GetOwner(); 37 35 gain.traderOwner = cmpPlayer.GetPlayerID(); 36 // Add potential player trade multipliers 37 let playerBonus = cmpPlayer.GetTradeRateMultiplier(); 38 let market1PlayerBonus = gain.traderOwner == gain.market1Owner ? cmpMarket1Player.GetTradeRateMultiplier() : 1; 39 let market2PlayerBonus = gain.traderOwner == gain.market2Owner ? cmpMarket2Player.GetTradeRateMultiplier() : 1; 38 40 // 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 } 41 let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market); 42 let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market); 43 if (!cmpMarket1 || !cmpMarket2) 44 return null; 45 let internationalBonus1 = gain.market1Owner != gain.market2Owner ? cmpMarket1.GetInternationalBonus() : 0; 46 let internationalBonus2 = gain.market1Owner != gain.market2Owner ? cmpMarket2.GetInternationalBonus() : 0; 47 gain.traderGain *= gainMultiplier; 48 gain.market1Gain = Math.round(gain.traderGain * internationalBonus1 * market1PlayerBonus); 49 gain.market2Gain = Math.round(gain.traderGain * internationalBonus2 * market2PlayerBonus); 50 gain.traderGain = Math.round(gain.traderGain * playerBonus); 65 51 66 52 return gain; 67 53 } 68 54 69 55 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.0000756</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.0000756</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.0000756</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>