Index: binaries/data/mods/public/gui/session/menu.js =================================================================== --- binaries/data/mods/public/gui/session/menu.js +++ binaries/data/mods/public/gui/session/menu.js @@ -520,8 +520,12 @@ if (template.cost) { + let modifiedTemplate = clone(template); + for (let res in template.cost) + modifiedTemplate.cost[res] = Math.floor(GetSimState().players[i].spyCostMultiplier * template.cost[res]); + tooltips.push(getEntityCostTooltip(modifiedTemplate)); let neededResources = Engine.GuiInterfaceCall("GetNeededResources", { - "cost": template.cost, + "cost": modifiedTemplate.cost, "player": g_ViewedPlayer }); if (neededResources) Index: binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/GuiInterface.js +++ binaries/data/mods/public/simulation/components/GuiInterface.js @@ -109,6 +109,7 @@ "disabledTechnologies": cmpPlayer.GetDisabledTechnologies(), "hasSharedDropsites": cmpPlayer.HasSharedDropsites(), "hasSharedLos": cmpPlayer.HasSharedLos(), + "spyCostMultiplier": cmpPlayer.GetSpyCostMultiplier(), "phase": phase, "isAlly": allies, "isMutualAlly": mutualAllies, Index: binaries/data/mods/public/simulation/components/Player.js =================================================================== --- binaries/data/mods/public/simulation/components/Player.js +++ binaries/data/mods/public/simulation/components/Player.js @@ -6,6 +6,9 @@ "" + "" + "" + + "" + + "" + + "" + ""; Player.prototype.Init = function() @@ -38,6 +41,7 @@ this.disabledTemplates = {}; this.disabledTechnologies = {}; this.startingTechnologies = []; + this.spyCostMultiplier = +this.template.SpyCostMultiplier; // Initial resources and trading goods probability in steps of 5 let resCodes = Resources.GetCodes(); @@ -175,6 +179,11 @@ return this.tradeRateMultiplier; }; +Player.prototype.GetSpyCostMultiplier = function() +{ + return this.spyCostMultiplier; +}; + Player.prototype.GetHeroes = function() { return this.heroes; @@ -725,6 +734,13 @@ this.UpdateSharedLos(); }; +Player.prototype.OnValueModification = function(msg) +{ + if (msg.component != "Player" || msg.valueNames.indexOf("Player/SpyCostMultiplier") === -1) + return; + this.spyCostMultiplier = ApplyValueModificationsToPlayer("Player/SpyCostMultiplier", +this.template.SpyCostMultiplier, this.entity, this.playerID); +}; + Player.prototype.SetCheatsEnabled = function(flag) { this.cheatsEnabled = flag; Index: binaries/data/mods/public/simulation/components/VisionSharing.js =================================================================== --- binaries/data/mods/public/simulation/components/VisionSharing.js +++ binaries/data/mods/public/simulation/components/VisionSharing.js @@ -119,10 +119,13 @@ let template = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager).GetTemplate("special/spy"); let costs = {}; + // Additionnal cost for this owner + let cmpPlayerBribed = QueryPlayerIDInterface(cmpOwnership.GetOwner()); + let multiplier = cmpPlayerBribed.GetSpyCostMultiplier(); for (let res in template.Cost.Resources) - costs[res] = Math.floor(ApplyValueModificationsToTemplate("Cost/Resources/"+res, +template.Cost.Resources[res], player, template)); - let cmpPlayer = QueryPlayerIDInterface(player); - if (!cmpPlayer || !cmpPlayer.TrySubtractResources(costs)) + costs[res] = Math.floor(multiplier * ApplyValueModificationsToTemplate("Cost/Resources/"+res, +template.Cost.Resources[res], player, template)); + let cmpPlayerSpy = QueryPlayerIDInterface(player); + if (!cmpPlayerSpy || !cmpPlayerSpy.TrySubtractResources(costs)) return 0; // If no duration given, take it from the spy template and scale it with the ent vision Index: binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js +++ binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js @@ -108,6 +108,7 @@ IsEnemy: function() { return true; }, GetDisabledTemplates: function() { return {}; }, GetDisabledTechnologies: function() { return {}; }, + GetSpyCostMultiplier: function() { return 1; }, HasSharedDropsites: function() { return false; }, HasSharedLos: function() { return false; }, }); @@ -193,6 +194,7 @@ IsEnemy: function() { return false; }, GetDisabledTemplates: function() { return {}; }, GetDisabledTechnologies: function() { return {}; }, + GetSpyCostMultiplier: function() { return 1; }, HasSharedDropsites: function() { return false; }, HasSharedLos: function() { return false; }, }); @@ -280,6 +282,7 @@ disabledTechnologies: {}, hasSharedDropsites: false, hasSharedLos: false, + spyCostMultiplier: 1, phase: "village", isAlly: [false, false], isMutualAlly: [false, false], @@ -323,6 +326,7 @@ disabledTechnologies: {}, hasSharedDropsites: false, hasSharedLos: false, + spyCostMultiplier: 1, phase: "village", isAlly: [true, true], isMutualAlly: [false, false], @@ -394,6 +398,7 @@ disabledTechnologies: {}, hasSharedDropsites: false, hasSharedLos: false, + spyCostMultiplier: 1, phase: "village", isAlly: [false, false], isMutualAlly: [false, false], @@ -450,6 +455,7 @@ disabledTechnologies: {}, hasSharedDropsites: false, hasSharedLos: false, + spyCostMultiplier: 1, phase: "village", isAlly: [true, true], isMutualAlly: [false, false], Index: binaries/data/mods/public/simulation/components/tests/test_Player.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_Player.js +++ binaries/data/mods/public/simulation/components/tests/test_Player.js @@ -8,7 +8,8 @@ "GetResource": () => ({}), }; -var cmpPlayer = ConstructComponent(10, "Player"); +var template = { "SpyCostMultiplier": 1 }; +var cmpPlayer = ConstructComponent(10, "Player", template); TS_ASSERT_EQUALS(cmpPlayer.GetPopulationCount(), 0); TS_ASSERT_EQUALS(cmpPlayer.GetPopulationLimit(), 0); Index: binaries/data/mods/public/simulation/components/tests/test_VisionSharing.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_VisionSharing.js +++ binaries/data/mods/public/simulation/components/tests/test_VisionSharing.js @@ -128,6 +128,7 @@ "ApplyModificationsTemplate": (valueName, curValue, template) => curValue }); AddMock(14, IID_Player, { + "GetSpyCostMultiplier": () => 1, "TrySubtractResources": costs => false }); cmpVisionSharing.AddSpy(4, 25); @@ -136,6 +137,7 @@ TS_ASSERT_EQUALS(cmpVisionSharing.spyId, 20); AddMock(14, IID_Player, { + "GetSpyCostMultiplier": () => 1, "TrySubtractResources": costs => true }); AddMock(SYSTEM_ENTITY, IID_Timer, { Index: binaries/data/mods/public/simulation/data/technologies/spy_counter.json =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/data/technologies/spy_counter.json @@ -0,0 +1,12 @@ +{ + "genericName": "Counter Espionage", + "description": "xxx.", + "cost": { "food": 400, "wood": 0, "stone": 0, "metal": 400 }, + "supersedes": "unlock_spies", + "requirements": { "tech": "phase_city" }, + "icon": "spy_trader.png", + "researchTime": 60, + "tooltip": "Make your units 50% more expensive to bribe.", + "modifications": [{ "value": "Player/SpyCostMultiplier", "multiply": 1.5 }], + "soundComplete": "interface/alarm/alarm_upgradearmory.xml" +} Index: binaries/data/mods/public/simulation/templates/special/player.xml =================================================================== --- binaries/data/mods/public/simulation/templates/special/player.xml +++ binaries/data/mods/public/simulation/templates/special/player.xml @@ -59,6 +59,7 @@ unlock_shared_los unlock_shared_dropsites + 1.0 Index: binaries/data/mods/public/simulation/templates/special/player_gaia.xml =================================================================== --- binaries/data/mods/public/simulation/templates/special/player_gaia.xml +++ binaries/data/mods/public/simulation/templates/special/player_gaia.xml @@ -3,5 +3,6 @@ + 1.0 Index: binaries/data/mods/public/simulation/templates/special/spy.xml =================================================================== --- binaries/data/mods/public/simulation/templates/special/spy.xml +++ binaries/data/mods/public/simulation/templates/special/spy.xml @@ -8,7 +8,7 @@ 0 0 0 - 900 + 500 Index: binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml +++ binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml @@ -94,6 +94,8 @@ phase_town phase_city + unlock_spies + spy_counter Index: binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml +++ binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml @@ -48,7 +48,6 @@ trade_gain_01 trade_gain_02 trade_commercial_treaty - unlock_spies units/{civ}_support_trader