diff --git a/src/Mods/SecExp/attackOptions.js b/src/Mods/SecExp/attackOptions.js
index 9cfded3b797915e5f3cd74102aaae1fef0a92621..f783768364964e74d0d48dab9b575dfd681d9242 100644
--- a/src/Mods/SecExp/attackOptions.js
+++ b/src/Mods/SecExp/attackOptions.js
@@ -1,21 +1,23 @@
 App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 	eventPrerequisites() {
-		return [];
+		return [
+			() => V.secExpEnabled > 0,
+			() => V.foughtThisWeek === 0,
+			() => !!(V.SecExp.war)
+		];
 	}
 
 	execute(node) {
 		if (typeof V.SecExp.settings.unitDescriptions === "undefined") {
 			V.SecExp.settings.unitDescriptions = 0;
 		}
-		V.nextButton = " ", V.encyclopedia = "Battles";
-		let r =[];
+		V.nextButton = " ";
+		V.encyclopedia = "Battles";
+		let r = [];
 
-		let _options = new App.UI.OptionsGroup();
-		_options.addOption("Unit descriptions are", "unitDescriptions", V.SecExp.settings)
-		.addValueList([["Abbreviated", 1], ["Summarized", 0]])
-		node.append(_options.render());
+		let _options;
 
-		App.UI.DOM.appendNewElement("h2", node, `${(V.majorBattle === 1) ? `Major ` : ``}Attack Imminent`)
+		App.UI.DOM.appendNewElement("h2", node, `${(V.majorBattle === 1) ? `Major ` : ``}Attack Imminent`);
 		if (V.majorBattle === 0) {
 			if (V.SecExp.battles.victories + V.SecExp.battles.losses > 0) {
 				r.push(`The ominous message dominates the screens of your office, and ${V.assistant.name} quickly gathers all information available to prepare for battle.`);
@@ -26,7 +28,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 					} else {
 						r.push(`Some of your citizens saw the disorganized horde of raiders coming towards the city and quickly reported it. To such jackals your arcology surely looks like an appetizing morsel.`);
 					}
-					//<br><strong>Raiders</strong> are roaming gangs of bandits, preying on the vulnerable supply lines of Free Cities and old world nations. They are rarely equipped with decent armaments and even more rarely have any formal military training, but they make up for that with high mobility and numbers.
+					r.push(App.UI.DOM.makeElement("div", `<strong>Raiders</strong> are roaming gangs of bandits, preying on the vulnerable supply lines of Free Cities and old world nations. They are rarely equipped with decent armaments and even more rarely have any formal military training, but they make up for that with high mobility and numbers.`));
 				} else if (V.SecExp.war.attacker.type === "free city") {
 					if (App.SecExp.battle.recon() >= 1) {
 						r.push(`A menacing column of slavers and hired mercenaries is coming to your city. Another free city is ready to use their best tools to hit a dangerous competitor where it hurts.`);
@@ -34,7 +36,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 					} else {
 						r.push(`Some of your citizens saw the menacing column of slavers and hired mercenaries and rushed to your office to bring the grim news. Another free city is ready to use their best tools to bring down a dangerous competitor.`);
 					}
-					//<br><strong>Free City expeditions</strong> are usually composed of mercenaries hired to take down sensible supplies or infrastructure in order to damage the enemies of their contractor. They have on average good equipment and training, together with decent mobility, making them a formidable force. Their biggest weakness however is their relatively low numbers.
+					r.push(App.UI.DOM.makeElement("div", `<strong>Free City expeditions</strong> are usually composed of mercenaries hired to take down sensible supplies or infrastructure in order to damage the enemies of their contractor. They have on average good equipment and training, together with decent mobility, making them a formidable force. Their biggest weakness however is their relatively low numbers.`));
 				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
 					if (App.SecExp.battle.recon() >= 1) {
 						r.push(`A dangerous looking army of guerrillas is gathering just outside the arcology. Fanatics and idealists armed with dead men's words and hope, set on erasing your fledgling empire.`);
@@ -42,7 +44,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 					} else {
 						r.push(`Some of your citizens saw the dangerous looking army of guerrillas is gathering just outside the arcology. Fanatics and idealists armed with dead men's words and hope, set on erasing your fledgling empire.`);
 					}
-					//<br><strong>Freedom Fighters</strong> are groups of individuals fighting to rid the planet of "evils" such as the Free Cities and their way of life. Lacking the strength to assault one directly they fight guerrilla style slowly starving to death their enemies. They are rarely well equipped, but with good training and mobility they are not a threat that can be taken lightly.
+					r.push(App.UI.DOM.makeElement("div", `<strong>Freedom Fighters</strong> are groups of individuals fighting to rid the planet of "evils" such as the Free Cities and their way of life. Lacking the strength to assault one directly they fight guerrilla style slowly starving to death their enemies. They are rarely well equipped, but with good training and mobility they are not a threat that can be taken lightly.`));
 				} else if (V.SecExp.war.attacker.type === "old world") {
 					if (App.SecExp.battle.recon() >= 1) {
 						r.push(`A disciplined yet dusty, scruffy old world army is approaching the confines of your arcology. There's nothing better than a good war to unite the electorate and your arcology is just the perfect target.`);
@@ -50,7 +52,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 					} else {
 						r.push(`Some of your citizens saw the disciplined yet dusty, scruffy old world army is approaching the confines of your arcology. There's nothing better than a good war to unite the electorate and your arcology is just the perfect target.`);
 					}
-					//<br><strong>Old world expeditions</strong> are usually sent to secure resources and trade routes for their nation or, more often, to provide their citizens with a bogeyman to be scared of. They are usually decently equipped and trained, which together with their generous numbers make them a tough nut to crack. However, they often lack in mobility.
+					r.push(App.UI.DOM.makeElement("div", `<strong>Old world expeditions</strong> are usually sent to secure resources and trade routes for their nation or, more often, to provide their citizens with a bogeyman to be scared of. They are usually decently equipped and trained, which together with their generous numbers make them a tough nut to crack. However, they often lack in mobility.`));
 				}
 			} else {
 				r.push(`Your assistant interrupted your rest to bring the grim news. You quickly rush to your console, where you can see one of the convoys supplying your arcology has been attacked and looted. It seems a group of desperate looking bandits decided it was a good idea to steal from you.`);
@@ -58,9 +60,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 			}
 		} else {
 			if (V.SecExp.battles.major > 0) {
-				r.push(`The ominous message dominates the screens of your office, and `);
-		V.assistant.name
-			r.push(` quickly gathers all information available to prepare for the major battle ahead.`);
+				r.push(`The ominous message dominates the screens of your office, and ${V.assistant.name} quickly gathers all information available to prepare for the major battle ahead.`);
 			} else {
 				r.push(`Your assistant interrupted your rest to bring the grim news. You quickly rush to your console, where you can see the satellite images coming in of the force about to crash against your arcology. It's not the first time your armies fought for the survival of your empire, but this time it seems it will be a fight for life or death.`);
 			}
@@ -71,7 +71,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				} else {
 					r.push(`Some of your citizens saw the massive, disorganized horde of raiders coming towards the city and quickly reported it. It seems a warlord of the wastelands amassed enough men to try and obtain a slice of territory of his own; if he's not defeated there won't be a tomorrow for the arcology.`);
 				}
-				//<br>Raiders are roaming gangs of bandits, preying on the vulnerable supply lines of Free Cities and old world nations. They are rarely equipped with decent armaments and even more rarely have any formal military training, but they make up for that with high mobility and numbers.
+				r.push(App.UI.DOM.makeElement("div", `Raiders are roaming gangs of bandits, preying on the vulnerable supply lines of Free Cities and old world nations. They are rarely equipped with decent armaments and even more rarely have any formal military training, but they make up for that with high mobility and numbers.`));
 			} else if (V.SecExp.war.attacker.type === "free city") {
 				if (App.SecExp.battle.recon() >= 1) {
 					r.push(`A massive, menacing column of slavers and hired mercenaries is coming to your city. The quantity of money invested in this assault is staggering; it seems you made some very powerful enemies. If they're not defeated your story will end this day.`);
@@ -79,7 +79,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				} else {
 					r.push(`Some of your citizens saw the massive, menacing column of slavers and hired mercenaries and rushed to your office to bring the grim news. The quantity of money invested in this assault is staggering; it seems you made some very powerful enemies. If they're not defeated your story will end this day.`);
 				}
-				//<br>Free City expeditions are usually composed of mercenaries hired to take down sensible supplies or infrastructure in order to damage the enemies of their contractor. They have, on average, good equipment and training, together with decent mobility, making them a formidable force. Their biggest weakness, however, is their relatively low numbers.
+				r.push(App.UI.DOM.makeElement("div", `Free City expeditions are usually composed of mercenaries hired to take down sensible supplies or infrastructure in order to damage the enemies of their contractor. They have, on average, good equipment and training, together with decent mobility, making them a formidable force. Their biggest weakness, however, is their relatively low numbers.`));
 			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
 				if (App.SecExp.battle.recon() >= 1) {
 					r.push(`A massive, dangerous army of guerrillas is gathering just outside the arcology. A huge ocean of fanatics and idealists armed with dead men's words and hope, set on erasing your fledgling empire once and for all. And this time they won't stop until your body is burnt to a crisp.`);
@@ -87,7 +87,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				} else {
 					r.push(`Some of your citizens saw the massive, dangerous army of guerrillas is gathering just outside the arcology. A huge ocean of fanatics and idealists armed with dead men's words and hope, set on erasing your fledgling empire once and for all. And this time they won't stop until your body is burnt to a crisp.`);
 				}
-				//<br>Freedom Fighters are groups of individuals fighting to rid the planet of "evils" such as the Free Cities and their way of life. Lacking the strength to assault one directly, they fight guerrilla style, slowly starving to death their enemies. They are rarely well equipped, but with good training and mobility they are not a threat that can be taken lightly.
+				r.push(App.UI.DOM.makeElement("div", `Freedom Fighters are groups of individuals fighting to rid the planet of "evils" such as the Free Cities and their way of life. Lacking the strength to assault one directly, they fight guerrilla style, slowly starving to death their enemies. They are rarely well equipped, but with good training and mobility they are not a threat that can be taken lightly.`));
 			} else if (V.SecExp.war.attacker.type === "old world") {
 				if (App.SecExp.battle.recon() >= 1) {
 					r.push(`A massive, disciplined old world army is approaching the confines of your arcology. It seems one of the nations of the old world is determined to put your arcology to rest once and for all or die trying.`);
@@ -95,13 +95,13 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				} else {
 					r.push(`Some of your citizens saw the massive, disciplined old world army is approaching the confines of your arcology. It seems one of the nations of the old world is determined to put your arcology to rest once and for all or die trying.`);
 				}
-				//<br>Old world expeditions are usually sent to secure resources and trade routes for their nation or, more often, to provide their citizens with a bogeyman to be scared of. They are usually decently equipped and trained, which together with their generous numbers make them a tough nut to crack. However, they often lack in mobility.
+				r.push(App.UI.DOM.makeElement("div", `Old world expeditions are usually sent to secure resources and trade routes for their nation or, more often, to provide their citizens with a bogeyman to be scared of. They are usually decently equipped and trained, which together with their generous numbers make them a tough nut to crack. However, they often lack in mobility.`));
 			}
 		}
-		//<br><br>__Recon__: (AO: V.terrain)
+		r.push(App.UI.DOM.makeElement("div", `<br>__Recon__: (AO: ${V.terrain})`));
 		const _estimatedMen = V.SecExp.war.estimatedMen;
 		const _expectedEquip = V.SecExp.war.expectedEquip;
-		//<br>It seems your troops and your adversary will fight
+		r.push(App.UI.DOM.makeElement("div", `It seems your troops and your adversary will fight`));
 		if (V.SecExp.war.terrain === "rural") {
 			r.push(`in <strong>the rural land</strong> surrounding the free city.`);
 		} else if (V.SecExp.war.terrain === "urban") {
@@ -121,9 +121,9 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 		} else if (["an underwater cave", "a sunken ship", "an island"].includes(V.SecExp.war.terrain)) {
 			r.push(`in <strong>${V.SecExp.war.terrain}</strong> near the free city.`);
 		} else if (V.SecExp.war.terrain === "error") {
-			//<br><span class="red">Error: failed to assign terrain.</span> SecExp.war.terrain reads: V.SecExp.war.terrain.
+			r.push(App.UI.DOM.makeElement("div", `<span class="red">Error: failed to assign terrain.</span> SecExp.war.terrain reads: V.SecExp.war.terrain.`));
 		} else {
-			//<br><span class="red">Error: failed to read terrain.</span> SecExp.war.terrain reads: V.SecExp.war.terrain.
+			r.push(App.UI.DOM.makeElement("div", `<span class="red">Error: failed to read terrain.</span> SecExp.war.terrain reads: V.SecExp.war.terrain.`));
 		}
 		if (App.SecExp.battle.recon() === 3) {
 			r.push(`Your recon capabilities are top notch. The information collected will be most likely correct or very close to be so:`);
@@ -136,15 +136,15 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 		}
 		r.push(`approximately <strong>_estimatedMen men</strong> are coming, they seem to be`);
 		if (_expectedEquip <= 0) {
-			//<strong>poorly armed</strong>. Old rusty small arms are the norm with just a few barely working civilian vehicles.
+			// <strong>poorly armed</strong>. Old rusty small arms are the norm with just a few barely working civilian vehicles.
 		} else if (_expectedEquip === 1) {
-			//<strong>lightly armed</strong>, mostly with small arms and some repurposed civilian vehicles with scattered machine gun support. There's no sign of heavy vehicles, artillery or aircraft.
+			// <strong>lightly armed</strong>, mostly with small arms and some repurposed civilian vehicles with scattered machine gun support. There's no sign of heavy vehicles, artillery or aircraft.
 		} else if (_expectedEquip === 2) {
-			//<strong>decently armed</strong> with good quality small arms, machine guns and a few mortars. There appear to be some heavy military vehicles coming as well.
+			// <strong>decently armed</strong> with good quality small arms, machine guns and a few mortars. There appear to be some heavy military vehicles coming as well.
 		} else if (_expectedEquip === 3) {
-			//<strong>well armed</strong> with high quality small arms, snipers, demolitions teams, heavy duty machine guns and mortars. Heavy military vehicles are numerous and a few artillery pieces are accompanying the detachment.
+			// <strong>well armed</strong> with high quality small arms, snipers, demolitions teams, heavy duty machine guns and mortars. Heavy military vehicles are numerous and a few artillery pieces are accompanying the detachment.
 		} else if (_expectedEquip >= 4) {
-			//<strong>extremely well armed</strong> with excellent small arms and specialized teams with heavy duty infantry support weapons. Heavy presence of armored military vehicles, artillery pieces and even some attack helicopters.
+			// <strong>extremely well armed</strong> with excellent small arms and specialized teams with heavy duty infantry support weapons. Heavy presence of armored military vehicles, artillery pieces and even some attack helicopters.
 		}
 
 		App.UI.DOM.appendNewElement("h2", node, `Battle plan`);
@@ -156,7 +156,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 		/* leader assignment */
 		_options = new App.UI.OptionsGroup();
 		let option = _options.addOption("Commander", "commander", V.SecExp.war)
-			.addValueList([["Personal", "PC"], [V.assistant.name, "assistant"]])
+			.addValueList([["Personal", "PC"], [V.assistant.name, "assistant"]]);
 
 		node.append(_options.render());
 
@@ -175,174 +175,179 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 		if (V.SF.Toggle && V.SF.Active >= 1 && V.SF.MercCon.CanAttend === -2) {
 			option.addValue("Colonel", "colonel");
 		}
-		
-		for (const tactics in App.Data.SecExp.TerrainAndTactics.get(V.SecExp.war.terrain)) {
+		node.append(_options.render());
 
+		_options = new App.UI.OptionsGroup();
+		const tacticsDesc = new Map([
+			["Bait and Bleed", `Combines bait and switch tactics with guerrilla style assaults, with the objective of slowly bleed the enemy.`],
+			[`Guerrilla`, `Involves using terrain knowledge and small fast attacks to hinder and weaken the enemy.`],
+			[`Choke Points`, `Involves using terrain knowledge and strong fortifications in order to stop the enemy on its track`],
+			[`Interior Lines`, `Involves exploiting a defender's shorter logistics lines and redeployment times in order to keep the enemy pressured.`],
+			[`Pincer Maneuver`, `Involves letting the enemy push back the center in order to envelop their formation.`],
+			[`Defense In Depth`, `Involves letting the enemy gain terrain to gain tactical superiority by alternating between delaying actions and small counterattacks.`],
+			[`Blitzkrieg`, `Involves breaking the front of the enemy with a fast armored force concentrated into a small area.`],
+			[`Human Wave`, `Involves assaulting the enemy with large numbers of infantry to overwhelm their lines.`],
+		]);
+		const tactics = App.Data.SecExp.TerrainAndTactics.get(V.SecExp.war.terrain);
+		for (const tactic in tactics) {
+			_options.addOption(tactic, "chosenTactic", V.SecExp.war).addComment(tacticsDesc.get(tactic)).addValue("Select", tactic);
 		}
-		//<br>For this battle you choose to follow <strong>V.SecExp.war.chosenTactic</strong> tactics.<br>
-		//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'defensiveTactics')" id="tab defensive tactics">Defensive tactics</button>
-		//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'offensiveTactics')" id="tab offensiveTactics">Offensive Tactics</button>
-
-		//<div id="defensiveTactics" class="tab-content">
-			//<div class="content">
-				[[Bait and Bleed|attackOptions][V.SecExp.war.chosenTactic = "Bait and Bleed"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Combines bait and switch tactics with guerrilla style assaults, with the objective of slowly bleed the enemy.//
-				//<br>[[Guerrilla|attackOptions][V.SecExp.war.chosenTactic = "Guerrilla"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves using terrain knowledge and small fast attacks to hinder and weaken the enemy.//
-				//<br>[[Choke Points|attackOptions][V.SecExp.war.chosenTactic = "Choke Points"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves using terrain knowledge and strong fortifications in order to stop the enemy on its track.//
-				//<br>[[Interior Lines|attackOptions][V.SecExp.war.chosenTactic = "Interior Lines"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves exploiting a defender's shorter logistics lines and redeployment times in order to keep the enemy pressured.//
-				//<br>[[Pincer Maneuver|attackOptions][V.SecExp.war.chosenTactic = "Pincer Maneuver"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves letting the enemy push back the center in order to envelop their formation.//
-				//<br>[[Defense In Depth|attackOptions][V.SecExp.war.chosenTactic = "Defense In Depth"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves letting the enemy gain terrain to gain tactical superiority by alternating between delaying actions and small counterattacks.//
-			//</div>
-		//</div>
+		node.append(_options.render());
 
-		//<div id="offensiveTactics" class="tab-content">
-			//<div class="content">
-				[[Blitzkrieg|attackOptions][V.SecExp.war.chosenTactic = "Blitzkrieg"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves breaking the front of the enemy with a fast armored force concentrated into a small area.//
-				//<br>[[Human Wave|attackOptions][V.SecExp.war.chosenTactic = "Human Wave"]]
-				//<br>&nbsp;&nbsp;&nbsp;&nbsp;//Involves assaulting the enemy with large numbers of infantry to overwhelm their lines.//
-			//</div>
-		//</div>
 
-		if (_leaderFound === 1) {
-			if (App.SecExp.battle.deployedUnits() > 0) {
-				//<br>[[Send your orders|attackHandler][V.SecExp.war.result = 4, V.foughtThisWeek = 1]] /* sets V.SecExp.war.result value outside accepted range (-3, 3) to avoid evaluation problems */
-			} else {
-				//<br>You need at least a unit in your roster to proceed to battle.
-			}
-			//<br>[[Surrender|attackReport][V.SecExp.war.result = -1, V.foughtThisWeek = 1]]
-			//<br>[[Attempt to bribe|attackHandler][V.SecExp.war.result = 1, V.foughtThisWeek = 1]]
-			r.push(` //Will cost around `);
-		V.cashFormat(Math.round(App.SecExp.battle.bribeCost() * (1 + either(-1,1) * random(2) * 0.1)))
-			r.push(` (estimate).//`);
+		if (App.SecExp.battle.deployedUnits() > 0) {
+			r.push(App.UI.DOM.makeElement("div", `[[Send your orders|attackHandler][V.SecExp.war.result = 4, V.foughtThisWeek = 1]] /* sets V.SecExp.war.result value outside accepted range (-3, 3) to avoid evaluation problems */`));
 		} else {
-			r.push(`Your leader needs to be present to proceed.`);
+			r.push(App.UI.DOM.makeElement("div", `You need at least a unit in your roster to proceed to battle.`));
 		}
+		r.push(App.UI.DOM.makeElement("div", `[[Surrender|attackReport][V.SecExp.war.result = -1, V.foughtThisWeek = 1]]`));
+		r.push(App.UI.DOM.makeElement("div", `[[Attempt to bribe|attackHandler][V.SecExp.war.result = 1, V.foughtThisWeek = 1]]`));
+		r.push(` //Will cost around ${cashFormat(Math.round(App.SecExp.battle.bribeCost() * (1 + either(-1, 1) * random(2) * 0.1)))} (estimate).//`);
 
 		if (V.SF.Toggle && V.SF.Active >= 1 && V.majorBattle) {
 			r.push(` <br>`);
 			_options = new App.UI.OptionsGroup();
-			//<<run _options.addOption("The incoming attack's scale warrants deploying the special force.", "deploySF", V.SecExp.war)
-			r.push(`.addValue("Green light", 1).on().addValue("Red light", 0).off()`);
-			r.push(`.addComment("Some upgrades will be able to support your troops even if the special force is not deployed in the fight.")>>`);
-			//<<includeDOM _options.render()>>
+			_options.addOption("The incoming attack's scale warrants deploying the special force.", "deploySF", V.SecExp.war)
+				.addValue("Green light", 1).on().addValue("Red light", 0).off()
+				.addComment("Some upgrades will be able to support your troops even if the special force is not deployed in the fight.");
+			node.append(_options.render());
 		}
 
-		//<br>
+		let linkArray = [];
 		if (V.SecExp.battles.lastSelection.length > 0) {
-			//<<link "Restore saved roster" "attackOptions">>
-				//<<for _i = 0; _i < V.SecExp.battles.lastSelection.length; _i++>>
-					if (V.SecExp.battles.lastSelection[_i] === -1) {
-						V.SecExp.units.bots.isDeployed = 1;
-					} else {
-						//<<for _squad range App.SecExp.unit.humanSquads()>>
-							if (V.SecExp.battles.lastSelection[_i] === _squad.ID) {
-								_squad.isDeployed = 1;
-								//<<break>>
+			linkArray.push(
+				App.UI.DOM.link(
+					`Restore saved roster`,
+					() => {
+						for (let _i = 0; _i < V.SecExp.battles.lastSelection.length; _i++) {
+							if (V.SecExp.battles.lastSelection[_i] === -1) {
+								V.SecExp.units.bots.isDeployed = 1;
+							} else {
+								for (const _squad of App.SecExp.unit.humanSquads()) {
+									if (V.SecExp.battles.lastSelection[_i] === _squad.ID) {
+										_squad.isDeployed = 1;
+										break;
+									}
+								}
 							}
-						//<</for>>
-					}
-				//<</for>>
-				V.SecExp.war.saveValid = 1, V.SecExp.war.commander = V.SecExp.battles.saved.commander, V.SecExp.war.deploySF = V.SecExp.battles.saved.sfSupport;
-			//<</link>>
+						}
+						V.SecExp.war.saveValid = 1;
+						V.SecExp.war.commander = V.SecExp.battles.saved.commander;
+						V.SecExp.war.deploySF = V.SecExp.battles.saved.sfSupport;
+					},
+					[],
+					passage()
+				)
+			);
 		} else {
 			r.push(`Restore saved roster`);
 		}
-		|
 		if (V.SecExp.war.saveValid !== 1) {
-			//<<link "Save current roster" "attackOptions">>
-				if (App.SecExp.battle.deployedUnits('bots')) {
-					_tmp = -1;
-					V.SecExp.battles.lastSelection.push(_tmp);
-				}
-				//<<for _squad range App.SecExp.unit.humanSquads()>>
-					if (_squad.isDeployed === 1) {
-						V.SecExp.battles.lastSelection.push(_squad.ID);
-					}
-				//<</for>>
-				V.SecExp.war.saveValid = 1, V.SecExp.battles.saved.commander = V.SecExp.war.commander, V.SecExp.battles.saved.sfSupport = V.SecExp.war.deploySF;
-			//<</link>>
+			linkArray.push(
+				App.UI.DOM.link(
+					`Save current roster`,
+					() => {
+						if (App.SecExp.battle.deployedUnits('bots')) {
+							V.SecExp.battles.lastSelection.push(-1);
+						}
+						for (const _squad of App.SecExp.unit.humanSquads()) {
+							if (_squad.isDeployed === 1) {
+								V.SecExp.battles.lastSelection.push(_squad.ID);
+							}
+						}
+						V.SecExp.war.saveValid = 1;
+						V.SecExp.battles.saved.commander = V.SecExp.war.commander;
+						V.SecExp.battles.saved.sfSupport = V.SecExp.war.deploySF;
+					},
+					[],
+					passage()
+				)
+			);
 		} else {
 			r.push(`Save current roster`);
 		}
-		|
 		if (App.SecExp.battle.deployedUnits() > 0) {
-			//<<link "Clear current roster" "attackOptions">>
-				V.SecExp.units.bots.isDeployed = 0;
-				//<<for _squad range App.SecExp.unit.humanSquads()>>
-					_squad.isDeployed = 0;
-				//<</for>>
-				V.SecExp.war.saveValid = 0;
-			//<</link>>
+			linkArray.push(
+				App.UI.DOM.link(
+					`Clear current roster`,
+					() => {
+						V.SecExp.units.bots.isDeployed = 0;
+						for (const _squad of App.SecExp.unit.humanSquads()) {
+							_squad.isDeployed = 0;
+						}
+						V.SecExp.war.saveValid = 0;
+					},
+					[],
+					passage()
+				)
+			);
 		} else {
 			r.push(`Clear current roster`);
 		}
-		|
 		if (V.SecExp.battles.lastSelection.length > 0) {
-			[[Clear saved roster|attackOptions][V.SecExp.battles.lastSelection = [], V.SecExp.war.saveValid = 0]]
+			linkArray.push(
+				App.UI.DOM.link(
+					`Clear saved roster`,
+					() => {
+						V.SecExp.battles.lastSelection = [];
+						V.SecExp.war.saveValid = 0;
+					},
+					[],
+					passage()
+				)
+			);
 		} else {
 			r.push(`Clear saved roster`);
 		}
 
-		//<br> /* troop deployment */
+		/* troop deployment */
 		if (App.SecExp.battle.deployableUnits() > 0) {
-			r.push(`With your current readiness level you can send an additional <strong>`);
-		V.App.SecExp.battle.deployableUnits()</strong> units.
+			r.push(`With your current readiness level you can send an additional <strong>${App.SecExp.battle.deployableUnits()}</strong> units.`);
 		}
-		//<<includeDOM App.SecExp.unit.replenishAll()>>
-		_mL = V.SecExp.units.militia.squads.length;
-		_sL = V.SecExp.units.slaves.squads.length;
-		_meL = V.SecExp.units.mercs.squads.length;
+		node.append(App.SecExp.unit.replenishAll());
 
 		App.UI.tabBar.handlePreSelectedTab(V.tabChoice.Options);
 
 		if (App.SecExp.battle.deployableUnits() === 0) {
-			//<strong>Unit roster full.</strong>
+			App.UI.DOM.appendNewElement("div", node, `Unit roster full.`, "strong");
 		}
-		//<div>
-		//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'drones')" id="tab drones">Drones</button>
-		if (_mL > 0) {
-			//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'militia')" id="tab militia">Militia: (_mL)</button>
+
+		const tabBar = new App.UI.Tabs.TabBar("SlaveInteract");
+
+		tabBar.addTab("Bots", "bots", App.SecExp.unit.deployMenu(V.SecExp.units.bots, "bots"));
+		if (V.SecExp.units.militia.squads.length > 0) {
+			tabBar.addTab("Militia", "militia", () => {
+				const frag = new DocumentFragment();
+				for (let _i = 0; _i < V.SecExp.units.militia.squads.length; _i++) {
+					node.append(App.SecExp.unit.deployMenu(V.SecExp.units.militia.squads[_i], "militia", _i));
+				}
+				return frag;
+			});
 		}
-		if (_sL > 0) {
-			//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'slaves')" id="tab slaves">Slaves: (_sL)</button>
+		if (V.SecExp.units.slaves.squads.length > 0) {
+			tabBar.addTab("Slaves", "slaves", () => {
+				const frag = new DocumentFragment();
+				for (let _i = 0; _i < V.SecExp.units.slaves.squads.length; _i++) {
+					node.append(App.SecExp.unit.deployMenu(V.SecExp.units.slaves.squads[_i], "slaves", _i));
+				}
+				return frag;
+			});
 		}
-		if (_meL > 0) {
-			//<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'mercs')" id="tab mercs">Mercs: (_meL)</button>
+		if (V.SecExp.units.mercs.squads.length > 0) {
+			tabBar.addTab("Mercs", "mercs", () => {
+				const frag = new DocumentFragment();
+				for (let _i = 0; _i < V.SecExp.units.mercs.squads.length; _i++) {
+					node.append(App.SecExp.unit.deployMenu(V.SecExp.units.mercs.squads[_i], "mercs", _i));
+				}
+				return frag;
+			});
 		}
-		//</div>
+		node.append(tabBar.render());
 
-		//<div id="drones" class="tab-content">
-			//<div class="content">
-				//<br> 
-		//<<includeDOM App.SecExp.unit.deployMenu(V.SecExp.units.bots, "bots")>>
-			//</div>
-		//</div>
-		//<div id="militia" class="tab-content">
-			//<div class="content">
-				//<<for _i = 0; _i < _mL; _i++>>
-					//<<includeDOM App.SecExp.unit.deployMenu(V.SecExp.units.militia.squads[_i], "militia", _i)>>
-				//<</for>>
-			//</div>
-		//</div>
-		//<div id="slaves" class="tab-content">
-			//<div class="content">
-				//<<for _i = 0; _i < _sL; _i++>>
-					//<<includeDOM App.SecExp.unit.deployMenu(V.SecExp.units.slaves.squads[_i], "slaves", _i)>>
-				//<</for>>
-			//</div>
-		//</div>
-		//<div id="mercs" class="tab-content">
-			//<div class="content">
-				//<<for _i = 0; _i < _meL; _i++>>
-					//<<includeDOM App.SecExp.unit.deployMenu(V.SecExp.units.mercs.squads[_i], "mercs", _i)>>
-				//<</for>>
-			//</div>
-		//</div>
+		_options = new App.UI.OptionsGroup();
+		_options.addOption("Unit descriptions are", "unitDescriptions", V.SecExp.settings)
+			.addValueList([["Abbreviated", 1], ["Summarized", 0]]);
+		node.append(_options.render());
+		return node;
 	}
 };
diff --git a/src/Mods/SecExp/terrainAndTactics.js b/src/Mods/SecExp/terrainAndTactics.js
index 90e11e86e12c3795e30804ee31afeb73ad2d6a72..1848e1f1cdb563c5ae137bf97f4ac824cb06b5d6 100644
--- a/src/Mods/SecExp/terrainAndTactics.js
+++ b/src/Mods/SecExp/terrainAndTactics.js
@@ -28,8 +28,8 @@ globalThis.terrainAndTactics = function() {
 		let terrainDifficulty = 0;
 		for (const tactic in tactics) {
 			let mods = 0;
-			for (const mod in tactics[tactic]) {
-				mods += tactics[tactic][mod];
+			for (const mod of ["atkMod", "defMod", "tacChance"]) {
+				mods += tactics[tactic][mod] || 0;
 			}
 			terrainDifficulty += mods;
 			tacticTotal.set(tactic, tacticTotal.get(tactic) + mods || mods);
diff --git a/src/events/nonRandomEvent.js b/src/events/nonRandomEvent.js
index cd9fa3e73df0747837204f3727c853b04814186c..15884cdfcc76c5a4838583f14ac4147e5eb1651b 100644
--- a/src/events/nonRandomEvent.js
+++ b/src/events/nonRandomEvent.js
@@ -17,11 +17,7 @@ App.Events.getNonrandomEvents = function() {
 			() => V.foughtThisWeek === 0,
 			() => (V.slaveRebellion === 1 || V.citizenRebellion === 1)
 		], "rebellionOptions"),
-		new App.Events.TwineEvent().wrapPassage([
-			() => V.secExpEnabled > 0,
-			() => V.foughtThisWeek === 0,
-			() => !!(V.SecExp.war)
-		], "attackOptions"),
+		new App.Events.attackOptions(),
 		new App.Events.TwineEvent().wrapPassage([
 			() => V.PC.labor === 1
 		], "SE Player Birth"),