Index: binaries/data/mods/public/maps/skirmishes/Alpine_Valleys_(2).xml
===================================================================
--- binaries/data/mods/public/maps/skirmishes/Alpine_Valleys_(2).xml	(révision 16269)
+++ binaries/data/mods/public/maps/skirmishes/Alpine_Valleys_(2).xml	(copie de travail)
@@ -48,12 +48,18 @@
   "Name": "Alpine Valleys (2)",
   "PlayerData": [
     {
-      "Name": "Player 1"
+      "Name": "Player 1",
+      "StartingTechnologies": {"phase_town_generic": true, "phase_town_athen": true},
+      "DisabledTechnologies": {"phase_city_generic": true, "phase_city_athen": true, "phase_city_britons": true, "phase_city_gauls": true},
+      "DisabledTemplates": {"structures/{civ}_temple": true}
     },
     {
       "Name": "Player 2"
     }
   ],
+  "Garrison": {
+    "68": [2109, 2110, 2111, 2112]
+  },
   "Preview": "alpine_valley_skirmish.png",
   "RevealMap": false
 }
@@ -14835,4 +14841,4 @@
 		</Entity>
 	</Entities>
 	<Paths/>
-</Scenario>
\ No newline at end of file
+</Scenario>
Index: binaries/data/mods/public/simulation/components/Player.js
===================================================================
--- binaries/data/mods/public/simulation/components/Player.js	(révision 16269)
+++ binaries/data/mods/public/simulation/components/Player.js	(copie de travail)
@@ -43,6 +43,8 @@
 		"stone": markForTranslation("Stone"),
 	}
 	this.disabledTemplates = {};
+	this.disabledTechnologies = {};
+	this.startingTechnologies = {};
 };
 
 Player.prototype.SetPlayerID = function(id)
@@ -569,6 +571,24 @@
 };
 
 /**
+ * Do some map dependant initializations
+ */
+Player.prototype.OnGlobalInitGame = function(msg)
+{
+	let cmpTechnologyManager = Engine.QueryInterface(this.entity, IID_TechnologyManager);
+	if (cmpTechnologyManager)
+		for (let tech in this.startingTechnologies)
+			cmpTechnologyManager.ResearchTechnology(tech);
+
+	// Replace the "{civ}" code with this civ ID
+	let disabledTemplates = this.disabledTemplates;
+	this.disabledTemplates = {};
+	for (let template in disabledTemplates)
+		if (disabledTemplates[template])
+			this.disabledTemplates[template.replace(/\{civ\}/g, this.civ)] = true;
+};
+
+/**
  * Keep track of population effects of all entities that
  * become owned or unowned by this player
  */
@@ -731,4 +751,37 @@
 	return this.disabledTemplates;
 };
 
+Player.prototype.AddDisabledTechnology = function(tech)
+{
+	this.disabledTechnologies[tech] = true;
+	Engine.BroadcastMessage(MT_DisabledTechnologiesChanged, {});
+};
+
+Player.prototype.RemoveDisabledTechnology = function(tech)
+{
+	this.disabledTechnologies[tech] = false;
+	Engine.BroadcastMessage(MT_DisabledTechnologiesChanged, {});
+};
+
+Player.prototype.SetDisabledTechnologies = function(techs)
+{
+	this.disabledTechnologies = techs;
+	Engine.BroadcastMessage(MT_DisabledTechnologiesChanged, {});
+};
+
+Player.prototype.GetDisabledTechnologies = function()
+{
+	return this.disabledTechnologies;
+};
+
+Player.prototype.AddStartingTechnology = function(tech)
+{
+	this.startingTechnologies[tech] = true;
+};
+
+Player.prototype.SetStartingTechnologies = function(techs)
+{
+	this.startingTechnologies = techs;
+};
+
 Engine.RegisterComponentType(IID_Player, "Player", Player);
Index: binaries/data/mods/public/simulation/components/ProductionQueue.js
===================================================================
--- binaries/data/mods/public/simulation/components/ProductionQueue.js	(révision 16269)
+++ binaries/data/mods/public/simulation/components/ProductionQueue.js	(copie de travail)
@@ -156,7 +156,11 @@
 	
 	var techs = string.split(/\s+/);
 	var techList = [];
-	var superseded = {}; // Stores the tech which supersedes the key 
+	var superseded = {}; // Stores the tech which supersedes the key
+
+	var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
+	if (cmpPlayer)
+		var disabledTechnologies = cmpPlayer.GetDisabledTechnologies();
 	
 	// Add any top level technologies to an array which corresponds to the displayed icons
 	// Also store what a technology is superceded by in the superceded object {"tech1":"techWhichSupercedesTech1", ...}
@@ -163,6 +167,8 @@
 	for (var i in techs)
 	{
 		var tech = techs[i];
+		if (disabledTechnologies && disabledTechnologies[tech])
+			continue;
 		var template = cmpTechnologyManager.GetTechnologyTemplate(tech);
 		if (!template.supersedes || techs.indexOf(template.supersedes) === -1)
 			techList.push(tech);
Index: binaries/data/mods/public/simulation/components/interfaces/Trigger.js
===================================================================
--- binaries/data/mods/public/simulation/components/interfaces/Trigger.js	(révision 16269)
+++ binaries/data/mods/public/simulation/components/interfaces/Trigger.js	(copie de travail)
@@ -1,3 +1,5 @@
 Engine.RegisterInterface("Trigger");
 
 Engine.RegisterMessageType("DisabledTemplatesChanged");
+
+Engine.RegisterMessageType("DisabledTechnologiesChanged");
Index: binaries/data/mods/public/simulation/helpers/Player.js
===================================================================
--- binaries/data/mods/public/simulation/helpers/Player.js	(révision 16269)
+++ binaries/data/mods/public/simulation/helpers/Player.js	(copie de travail)
@@ -109,6 +109,15 @@
 		if (getSetting(playerData, playerDefaults, i, "Resources") !== undefined)
 			cmpPlayer.SetResourceCounts(getSetting(playerData, playerDefaults, i, "Resources"));
 
+		if (getSetting(playerData, playerDefaults, i, "StartingTechnologies") !== undefined)
+			cmpPlayer.SetStartingTechnologies(getSetting(playerData, playerDefaults, i, "StartingTechnologies"));
+
+		if (getSetting(playerData, playerDefaults, i, "DisabledTechnologies") !== undefined)
+			cmpPlayer.SetDisabledTechnologies(getSetting(playerData, playerDefaults, i, "DisabledTechnologies"));
+
+		if (getSetting(playerData, playerDefaults, i, "DisabledTemplates") !== undefined)
+			cmpPlayer.SetDisabledTemplates(getSetting(playerData, playerDefaults, i, "DisabledTemplates"));
+
 		// If diplomacy explicitly defined, use that; otherwise use teams
 		if (getSetting(playerData, playerDefaults, i, "Diplomacy") !== undefined)
 			cmpPlayer.SetDiplomacy(getSetting(playerData, playerDefaults, i, "Diplomacy"));
Index: binaries/data/mods/public/simulation/helpers/Setup.js
===================================================================
--- binaries/data/mods/public/simulation/helpers/Setup.js	(révision 16269)
+++ binaries/data/mods/public/simulation/helpers/Setup.js	(copie de travail)
@@ -39,6 +39,18 @@
 	var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
 	if (settings.GameType)
 		cmpEndGameManager.SetGameType(settings.GameType);
+
+	if (settings.Garrison)
+	{
+		for (let holder in settings.Garrison)
+		{
+			let cmpGarrisonHolder = Engine.QueryInterface(+holder, IID_GarrisonHolder);
+			if (!cmpGarrisonHolder)
+				warning("Map error in Setup.js: entity " + holder + " can not garrison units");
+			else
+				cmpGarrisonHolder.initGarrison = settings.Garrison[holder];
+		}
+	}
 }
 
 Engine.RegisterGlobal("LoadMapSettings", LoadMapSettings);
