From 33b86ee72cdb036d52041d9abd6869e7481aebc1 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Sat, 30 May 2020 18:09:53 -0700
Subject: [PATCH] Port most of neighborInteract.tw to DOM so it can be rebuilt
 dynamically when changing the selected arcology on the grid or list, and get
 rid of the old arcology link list entirely. Refactor economic uncertainty
 calculation into a shared function and eliminate the economicUncertainty
 global variable. Allow Neighbor Description to be called on your own
 arcology, because why not?

---
 js/003-data/gameVariableData.js             |   1 -
 src/cheats/mod_EditNeighborArcologyCheat.tw |   2 +-
 src/js/utilsFC.js                           |  14 +
 src/neighbor/neighborDisplay.js             |  27 +-
 src/neighbor/neighborInteract.js            | 322 ++++++++++
 src/uncategorized/neighborDescription.tw    |  65 +-
 src/uncategorized/neighborInteract.tw       | 675 +-------------------
 src/uncategorized/neighborsDevelopment.tw   |  15 +-
 8 files changed, 387 insertions(+), 734 deletions(-)
 create mode 100644 src/neighbor/neighborInteract.js

diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index cbcfb44ca88..cafb853643f 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -1117,7 +1117,6 @@ App.Data.resetOnNGPlus = {
 	Wardeness: 0,
 	/** @type {FC.SlaveStateOrZero} */
 	Concubine: 0,
-	economicUncertainty: 10,
 
 	justiceEvents: ["slave deal", "slave training", "majority deal", "indenture deal", "virginity deal", "breeding deal"], /* not in setupVars because we remove events from this array as they occur */
 	prisonCircuit: ["low tier criminals", "gangs and smugglers", "white collar", "military prison"],
diff --git a/src/cheats/mod_EditNeighborArcologyCheat.tw b/src/cheats/mod_EditNeighborArcologyCheat.tw
index ea9afda1f12..00a2d0cdeaf 100644
--- a/src/cheats/mod_EditNeighborArcologyCheat.tw
+++ b/src/cheats/mod_EditNeighborArcologyCheat.tw
@@ -34,7 +34,7 @@
 <</link>>
 <</if>>
 
-<br>
+<br><br>
 <<set $averageProsperity = _.mean($arcologies.map((a) => a.prosperity))>>
 
 <<for $i = 1; $i < $arcologies.length; $i++>>
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index 017e3f57dcf..b9d78538af1 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -2947,3 +2947,17 @@ App.Utils.countAssignmentWorkers = function(assignments) {
 	assignments = assignments || Object.values(Job);
 	return assignments.reduce((acc, cur) => { acc[cur] = V.JobIDMap[cur].size; return acc; }, {});
 };
+
+/** Calculate and return economic uncertainty multiplier for a given arcology
+ * @param {number} arcologyID
+ * @returns {number}
+ */
+App.Utils.economicUncertainty = function(arcologyID) {
+	let uncertainty = arcologyID === 0 ? 5 : 10;
+	if (assistant.power === 1) {
+		uncertainty -= Math.max(Math.trunc(uncertainty/2), 0);
+	} else if (assistant.power > 1) {
+		uncertainty = 0;
+	}
+	return jsRandom(100 - uncertainty, 100 + uncertainty) / 100;
+};
diff --git a/src/neighbor/neighborDisplay.js b/src/neighbor/neighborDisplay.js
index 6fd7d52f1a1..7f035f2e115 100644
--- a/src/neighbor/neighborDisplay.js
+++ b/src/neighbor/neighborDisplay.js
@@ -3,6 +3,7 @@ App.Neighbor.Display = class {
 	 * @param {function(number):void} onSelection function to be called when selection changes
 	 */
 	constructor(onSelection) {
+		this.containerID = "neighbor-display";
 		this._onSelection = onSelection;
 	}
 
@@ -10,24 +11,22 @@ App.Neighbor.Display = class {
 	 * @returns {Element}
 	 */
 	render() {
-		const containerID = "neighbor-display";
 		const container = document.createElement("div");
-		container.id = containerID;
+		container.id = this.containerID;
 
 		function makeSortLink(/** @type {string} */ title, /** @type {string} */ mode) {
 			if (V.neighborDisplay === mode) {
 				return document.createTextNode(title);
 			} else {
-				return App.UI.DOM.link(title, () => { V.neighborDisplay = mode; rerender(); } );
+				return App.UI.DOM.link(title, () => { V.neighborDisplay = mode; this.rerender(); } );
 			}
 		}
 
 		container.append("Neighbor display mode:");
-		const rerender = () => $(`#${containerID}`).empty().append(this.render());
 		container.appendChild(App.UI.DOM.generateLinksStrip([
-			makeSortLink("List by ID", "list"),
-			makeSortLink("List by Name", "list-name"),
-			makeSortLink("City Grid", "grid")
+			makeSortLink.call(this, "List by ID", "list"),
+			makeSortLink.call(this, "List by Name", "list-name"),
+			makeSortLink.call(this, "City Grid", "grid")
 		]));
 
 		// pick a mode
@@ -41,6 +40,11 @@ App.Neighbor.Display = class {
 		return container;
 	}
 
+	/** Refresh an existing neighbor display list */
+	rerender() {
+		$(`#${this.containerID}`).replaceWith(this.render());
+	}
+
 	/** Render the display as a list, sorted by ID
 	 * @returns {Element}
 	 */
@@ -102,8 +106,9 @@ App.Neighbor.Display = class {
 			return res;
 		}
 
-		function nameFrag() {
-			return App.UI.DOM.makeElement("div", App.UI.DOM.link(arcology.name, () => this.select(arcID)), "name");
+		/** @param {function(): void} selectLambda */
+		function nameFrag(selectLambda) {
+			return App.UI.DOM.makeElement("div", App.UI.DOM.link(arcology.name, selectLambda), "name");
 		}
 
 		function govGSPFrag() {
@@ -114,7 +119,7 @@ App.Neighbor.Display = class {
 			} else {
 				gov = App.UI.DOM.appendNewElement("div", frag, capFirstChar(arcology.government) + '; ');
 			}
-			const estimatedGSP = Math.trunc((0.1 * arcology.prosperity * random(100 - V.economicUncertainty, 100 + V.economicUncertainty))/100);
+			const estimatedGSP = Math.trunc(0.1 * arcology.prosperity * App.Utils.economicUncertainty(arcID));
 			App.UI.DOM.appendNewElement("span", gov, cashFormat(estimatedGSP) + "m GSP", "cash");
 			return frag;
 		}
@@ -170,7 +175,7 @@ App.Neighbor.Display = class {
 			// empty block
 			classNames.push("neighbor-item-empty");
 		} else {
-			frag.appendChild(nameFrag());
+			frag.appendChild(nameFrag(() => this.select(arcID)));
 			frag.appendChild(govGSPFrag());
 			frag.appendChild(fsFrag());
 			frag.appendChild(ownershipFrag());
diff --git a/src/neighbor/neighborInteract.js b/src/neighbor/neighborInteract.js
new file mode 100644
index 00000000000..e13f02b9c98
--- /dev/null
+++ b/src/neighbor/neighborInteract.js
@@ -0,0 +1,322 @@
+App.Neighbor.Interact = (function() {
+	let nd = new App.Neighbor.Display((id) => replaceDetails(id));
+
+	/** Output the arcology list
+	 * @returns {DocumentFragment}
+	 */
+	function list() {
+		V.arcologies.forEach((a) => a.prosperity = Math.clamp(a.prosperity, 1, 300));
+		if (!V.activeArcologyIdx) {
+			V.activeArcologyIdx = 0;
+		}
+
+		let frag = document.createDocumentFragment();
+
+		// set up the neighbor display list itself
+		frag.append(nd.render());
+		$(document).one(':passagedisplay', () => nd.select(V.activeArcologyIdx));
+
+		// empty container for details
+		const detailSpan = App.UI.DOM.appendNewElement("span", frag);
+		detailSpan.id = "neighbor-details";
+
+		return frag;
+	}
+
+	/** Replace the details block with an updated one for the given arcology
+	 * Used both as a refresh and as a selection handler
+	 * @param {number} arcID
+	 */
+	function replaceDetails(arcID) {
+		V.activeArcologyIdx = arcID;
+		const container = $("#neighbor-details").empty();
+		container.append(description(arcID));
+		container.append(details(arcID));
+	}
+
+	/** Re-render most of the page because some important arcology property (FS, government, ownership) may have changed
+	 * @param {number} arcID for reselection
+	 */
+	function arcChanged(arcID) {
+		nd.rerender();
+		nd.select(arcID);
+	}
+
+	/** Create a div containing the neighbor's description
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function description(arcID) {
+		// still in Twine for now
+		let container = document.createElement("div");
+		V.i = arcID;
+		App.UI.DOM.includePassage(container, "Neighbor Description");
+		return container;
+	}
+
+	/** Create a fragment containing all the details for a given arcology
+	 * @param {number} arcID
+	 * @returns {DocumentFragment}
+	 */
+	function details(arcID) {
+		let frag = document.createDocumentFragment();
+		if (arcID === 0) {
+			const desc = FutureSocieties.activeFSes(0).map((f) => FutureSocieties.displayName(f));
+			if (desc.length === 0) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture has not developed to the point where it can meaningfully influence other arcologies.`);
+			} else if (desc.length > 2) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's mature culture is capable of exerting great cultural sway over other arcologies. It can readily project ${desc.reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch)}.`);
+			} else if (desc.length === 2) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of exerting some cultural sway over other arcologies. It can effectively project ${desc[0]} and ${desc[1]}.`);
+			} else {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of starting to exert cultural sway over other arcologies. It can project ${desc[0]}.`);
+			}
+		} else {
+			const ownershipCost = 500*Math.trunc(V.arcologies[arcID].prosperity*(1+(V.arcologies[arcID].demandFactor/100)));
+			frag.append(`A 1% interest in this arcology is worth ${cashFormat(ownershipCost)}. `);
+			if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
+				frag.append(`The transaction fee is ${cashFormat(10000)}.`);
+			}
+
+			if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
+				let links = [];
+				links.push(App.UI.DOM.link("Buy", (f) => {
+					cashX(forceNeg(ownershipCost), "war");
+					cashX(-10000, "war");
+					V.arcologies[arcID].PCminority += 1;
+					V.arcologies[arcID].demandFactor += 2;
+				}, [], "Neighbor Interact"));
+				if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority <= 90) {
+					if (V.cash > ownershipCost*10) {
+						const link = App.UI.DOM.link("10%", (f) => {
+							cashX(forceNeg(ownershipCost*10), "war");
+							cashX(-10000, "war");
+							V.arcologies[arcID].PCminority += 10;
+							V.arcologies[arcID].demandFactor += 20;
+						}, [], "Neighbor Interact");
+						links.push(link);
+					}
+				}
+				const div = App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
+				if (links.length > 1) {
+					App.UI.DOM.appendNewElement("span", div, "Transaction costs will only be paid once.", "detail");
+				}
+			}
+
+			if (V.arcologies[arcID].PCminority > 0) {
+				let links = [];
+				links.push(App.UI.DOM.link("Sell", (f) => {
+					cashX(ownershipCost, "war");
+					V.arcologies[arcID].PCminority -= 1;
+					V.arcologies[arcID].demandFactor -= 2;
+					if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
+						if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
+							V.arcologies[arcID].ownership += 10;
+						}
+					}
+					arcChanged(arcID);
+				}, [], "Neighbor Interact"));
+				if (V.arcologies[arcID].PCminority >= 10) {
+					links.push(App.UI.DOM.link("10%", (f) => {
+						cashX((ownershipCost*10), "war");
+						V.arcologies[arcID].PCminority -= 10;
+						V.arcologies[arcID].demandFactor -= 20;
+						if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
+							if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
+								V.arcologies[arcID].ownership += 10;
+							}
+						}
+					}, [], "Neighbor Interact"));
+				}
+				App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
+			}
+
+			if (V.arcologies[arcID].direction !== V.arcologies[0].embargoTarget) {
+				frag.append(document.createElement("br"));
+				frag.append(App.UI.DOM.passageLink("Target them for economic warfare", "Neighbor Interact", () => V.arcologies[0].embargoTarget = V.arcologies[arcID].direction));
+			}
+
+			if (V.PC.skill.hacking > 0) {
+				if (V.arcologies[arcID].direction !== V.arcologies[0].CyberEconomicTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Target them for cyber economic warfare", "Neighbor Interact", () => V.arcologies[0].CyberEconomicTarget = V.arcologies[arcID].direction));
+				}
+				if (V.arcologies[arcID].direction !== V.arcologies[0].CyberReputationTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Target their leadership for character assassination", "Neighbor Interact", () => V.arcologies[0].CyberReputationTarget = V.arcologies[arcID].direction));
+				}
+			}
+			if (FutureSocieties.influenceSources(0).length > 0) {
+				if (V.arcologies[arcID].direction !== V.arcologies[0].influenceTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Set as influence target", "Neighbor Interact", () => V.arcologies[0].influenceTarget = V.arcologies[arcID].direction));
+				}
+			}
+
+			if (V.arcologies[arcID].government === "your trustees" || V.arcologies[arcID].government === "your agent") {
+				frag.append(controlActions(arcID));
+			}
+
+			frag.append(fsGoods(arcID));
+		}
+		return frag;
+	}
+
+	/** Create a div containing actions specific to arcologies that are under the player's control
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function controlActions(arcID) {
+		const container = document.createElement("div");
+		const agent = App.currentAgent(arcID);
+		const him = agent ? getPronouns(agent).him : "them";
+		container.append(document.createElement("br"));
+		if (V.arcologies[arcID].government === "your trustees") {
+			container.append(App.UI.DOM.passageLink("Appoint an agent", "Agent Select"));
+		} else {
+			let linkText = `Recall and reenslave ${him}`;
+			const residentList = [agent.ID];
+			const agentPartner = V.slaves.find((s) => s.assignment === Job.AGENTPARTNER && s.relationshipTarget === agent.ID);
+			if (agentPartner) {
+				linkText = `Recall them and reenslave your agent`;
+				residentList.push(agentPartner.ID);
+			}
+			container.append(App.UI.SlaveList.render.listDOM(residentList, [], App.UI.SlaveList.SlaveInteract.stdInteract));
+			container.append(App.UI.DOM.link(linkText, (f) => { removeJob(agent, "be your agent"); arcChanged(arcID); }));
+		}
+		container.append(" | ");
+		const rename = App.UI.DOM.appendNewElement("span", container, '');
+		rename.id = "rename";
+		rename.append(App.UI.DOM.link(`Instruct ${him} to rename the arcology`, () => $("#rename").replaceWith([
+			App.UI.DOM.makeTextBox(V.arcologies[arcID].name, (s) => { V.arcologies[arcID].name = s; }, false),
+			App.UI.DOM.link("Confirm name", arcChanged, [arcID])
+		])));
+
+		if (V.arcologies[arcID].government === "your agent") {
+			const {His, his, he, himself /* him is already set */} = getPronouns(agent);
+			let r = [];
+			r.push(`${His} ${agent.intelligence > 95 ? `brilliance` : `intelligence`} and education are the most important qualities for ${him}.`);
+			if (agent.actualAge > 35) {
+				r.push(`As with the Head Girl position, ${his} age and experience lend ${him} leadership weight.`);
+			}
+			if (agent.career === "an arcology owner") {
+				r.push(`${His} career as an arcology owner ${himself} is, obviously, useful to ${him}.`);
+			} else if (setup.HGCareers.includes(agent.career)) {
+				r.push(`${His} career in leadership helps ${him}.`);
+			}
+			if (agent.fetishStrength > 95) {
+				if ((agent.fetish === "dom") || (agent.fetish === "sadist")) {
+					r.push(`${His} sexually dominant fetish helps ${him} fill a leadership role.`);
+				} else if ((agent.fetish === "submissive") || (agent.fetish === "masochist")) {
+					r.push(`Unfortunately, ${he} has an inappropriate fetish for a leader.`);
+				} else {
+					r.push(`${His} sexual fetishes will influence how ${he} leads the arcology.`);
+				}
+			}
+			if (agent.energy > 95) {
+				r.push(`Finally, ${his} sexual depravity lets ${him} fit into arcology society naturally.`);
+			}
+			App.UI.DOM.appendNewElement("div", container, r.join(' ' ));
+		}
+
+		container.append(document.createElement("br"));
+		const forceAbandonment = (fs) => { V.arcologies[arcID][fs] = "unset"; arcChanged(arcID); };
+		for (const fs of FutureSocieties.activeFSes(arcID)) {
+			App.UI.DOM.appendNewElement("div", container, App.UI.DOM.link(`Force abandonment of ${FutureSocieties.displayName(fs)}`, forceAbandonment, [fs]));
+		}
+
+		return container;
+	}
+
+	/** Create an element containing all the society-dependent stuff you can buy from this arcology.
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function fsGoods(arcID) {
+		const container = document.createElement("div");
+		let r = [];
+		r.push(`If ${V.arcologies[arcID].name} has developed enough to begin exporting worthwhile goods, it may be of interest to acquire some.`);
+		const opinionDiscount = App.Neighbor.opinion(arcID, 0)*10;
+		const basePrice = Math.trunc((7500-opinionDiscount)*V.upgradeMultiplierTrade);
+		const controlled = (V.arcologies[arcID].government === "your trustees") || (V.arcologies[arcID].government === "your agent");
+		if (controlled) {
+			r.push(`Since it is under your control, it is no problem at all to request the transfer of goods to ${V.arcologies[0].name}.`);
+		} else if (V.PC.skill.hacking >= 50) {
+			r.push(`It is within your skills to redirect an outgoing shipment to ${V.arcologies[0].name} for your retrieval.`);
+		} else if (V.arcologies[arcID].direction === V.arcologies[0].embargoTarget) {
+			r.push(`However, due to your active embargo, trade with ${V.arcologies[arcID].name} is not possible.`);
+		}
+		App.UI.DOM.appendNewElement("p", container, r.join(' '));
+
+		let exports = 0;
+
+		/** Build a link or text block describing how to acquire a specific good from this arcology
+		 * @param {string} fsRequired - the FS that the arcology has to have for this block to appear
+		 * @param {string} itemName - the item name to check to see if the player already has this item
+		 * @param {string} category - the category to check to see if the player already has this item
+		 * @param {string} itemDisplay - a display name for a group of the item; as in, "a shipment of XXX" or "enough XXX"
+		 * @param {string} property - the global property controlling whether this item has been acquired
+		 * @param {number} [itemPrice] - the price the player should pay for the item; by default, basePrice (computed above)
+		 */
+		function addAcquisitionBlock(fsRequired, itemName, category, itemDisplay, property, itemPrice = basePrice) {
+			if (V.arcologies[arcID][fsRequired] > 95) {
+				if (!isItemAccessible.entry(itemName, category)) {
+					if (controlled) {
+						const link = App.UI.DOM.link(`Request a shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							replaceDetails(arcID);
+						});
+						App.UI.DOM.appendNewElement("div", container, link);
+					} else if (V.PC.skill.hacking >= 50) {
+						const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							replaceDetails(arcID);
+						});
+						App.UI.DOM.appendNewElement("div", container, link);
+					} else if (V.arcologies[arcID].direction !== V.arcologies[0].embargoTarget) {
+						const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							cashX(forceNeg(itemPrice), "capEx");
+							// replaceDetails(arcID); - cash changed, force passage transition for sidebar update
+						}, [], "Neighbor Interact");
+						const div = App.UI.DOM.appendNewElement("div", container, link);
+						App.UI.DOM.appendNewElement("span", div, `Will cost ${cashFormat(itemPrice)}`, "detail");
+					}
+				} else {
+					App.UI.DOM.appendNewElement("div", container, `You already have enough ${itemDisplay}.`);
+				}
+				exports = 1;
+			}
+		}
+
+		addAcquisitionBlock("FSRomanRevivalist", "a toga", "clothing", "togas", "clothesBoughtToga");
+		addAcquisitionBlock("FSEdoRevivalist", "a kimono", "clothing", "kimonos", "clothesBoughtKimono");
+		addAcquisitionBlock("FSArabianRevivalist", "harem gauze", "clothing", "silken harem garb", "clothesBoughtHarem");
+		addAcquisitionBlock("FSAztecRevivalist", "a huipil", "clothing", "huipils", "clothesBoughtHuipil");
+		addAcquisitionBlock("FSChineseRevivalist", "a slutty qipao", "clothing", "skimpy qipaos", "clothesBoughtQipao");
+		addAcquisitionBlock("FSEgyptianRevivalist", "ancient Egyptian", "collar", "Egyptian necklace replicas", "clothesBoughtEgypt");
+		addAcquisitionBlock("FSPaternalist", "conservative clothing", "clothing", "conservative clothing", "clothesBoughtConservative");
+		addAcquisitionBlock("FSDegradationist", "chains", "clothing", "binding chains", "clothesBoughtChains");
+		addAcquisitionBlock("FSGenderFundamentalist", "a bunny outfit", "clothing", "bunny suits", "clothesBoughtBunny");
+		addAcquisitionBlock("FSIntellectualDependency", "a bimbo outfit", "cloting", "bimbo attire", "clothesBoughtBimbo");
+		addAcquisitionBlock("FSSlaveProfessionalism", "a courtesan dress", "clothing", "cortesan dresses", "clothesBoughtCourtesan");
+		// addAcquisitionBlock("FSPetiteAdmiration", "petite dress", "clothing", "petite-sized dresses", "clothesBoughtPetite");
+		addAcquisitionBlock("FSPhysicalIdealist", "body oil", "clothing", "body oil", "clothesBoughtOil");
+		addAcquisitionBlock("FSHedonisticDecadence", "stretch pants and a crop-top", "clothing", "stretch pants and crop-tops", "clothesBoughtLazyClothes");
+		addAcquisitionBlock("FSChattelReligionist", "a chattel habit", "clothing", "chattel religionist habits", "clothesBoughtHabit");
+		addAcquisitionBlock("FSPastoralist", "Western clothing", "clothing", "Western clothing", "clothesBoughtWestern");
+		addAcquisitionBlock("FSRepopulationFocus", "a maternity dress", "clothing", "maternity dresses", "clothesBoughtMaternityDress");
+		addAcquisitionBlock("FSRepopulationFocus", "attractive lingerie for a pregnant woman", "clothing", "maternity lingerie", "clothesBoughtMaternityLingerie");
+		addAcquisitionBlock("FSRepopulationFocus", "a small empathy belly", "bellyAccessory", "empathy bellies", "clothesBoughtBelly");
+		addAcquisitionBlock("FSStatuesqueGlorification", "platform heels", "shoes", "platform shoes", "shoesBoughtHeels");
+
+		if (exports !== 1) {
+			const luck = (V.arcologies[arcID].direction === V.arcologies[0].embargoTarget) ? `Fortunately` : `Unfortunately`;
+			App.UI.DOM.appendNewElement("p", container, `${luck}, they have nothing of value.`);
+		}
+
+		return container;
+	}
+
+	return list;
+})();
diff --git a/src/uncategorized/neighborDescription.tw b/src/uncategorized/neighborDescription.tw
index 91b4e531e3b..2d4dc8f1796 100644
--- a/src/uncategorized/neighborDescription.tw
+++ b/src/uncategorized/neighborDescription.tw
@@ -1,43 +1,37 @@
 :: Neighbor Description [nobr]
 
-<br><br>&nbsp;&nbsp;&nbsp;&nbsp;
-'' $arcologies[$i].name'' is located to the $arcologies[$i].direction of your arcology. It is governed by
-<<switch $arcologies[$i].government>>
-<<case "elected officials">>
-	elected officials, periodically paralyzing its development.
-<<case "a committee">>
-	a committee, hindering its development.
-<<case "an oligarchy">>
-	a small group of leading citizens, making its development very unpredictable.
-<<case "your trustees">>
-	a small group of leading citizens who are serving as @@.mediumseagreen;your trustees.@@
-<<case "an individual">>
-	@@.cyan;an individual,@@ making its development vibrant but unpredictable.
-<<case "your agent">>
-	@@.deeppink;your agent,@@ who is directing the arcology in your stead.
-<<case "a corporation">>
-	a corporation, making its development steady and unspectacular.
-<<default>>
-	direct democracy, making its development dangerously unstable.
-<</switch>>
-<<if $arcologies[$i].direction == 0>>
-	<<set $economicUncertainty = 5>>
+<div class="indent">
+<<if $arcologies[$i].direction != 0>>
+	''$arcologies[$i].name'' is located to the $arcologies[$i].direction of your arcology. It is governed by
+	<<switch $arcologies[$i].government>>
+	<<case "elected officials">>
+		elected officials, periodically paralyzing its development.
+	<<case "a committee">>
+		a committee, hindering its development.
+	<<case "an oligarchy">>
+		a small group of leading citizens, making its development very unpredictable.
+	<<case "your trustees">>
+		a small group of leading citizens who are serving as @@.mediumseagreen;your trustees.@@
+	<<case "an individual">>
+		@@.cyan;an individual,@@ making its development vibrant but unpredictable.
+	<<case "your agent">>
+		@@.deeppink;your agent,@@ who is directing the arcology in your stead.
+	<<case "a corporation">>
+		a corporation, making its development steady and unspectacular.
+	<<default>>
+		direct democracy, making its development dangerously unstable.
+	<</switch>>
 <<else>>
-	<<set $economicUncertainty = 10>>
-<</if>>
-<<if $assistant.power > 1>>
-	<<set $economicUncertainty = 0>>
-<<elseif $assistant.power == 1>>
-	<<set $economicUncertainty = Math.max(Math.trunc($economicUncertainty/2),0)>>
+	''$arcologies[$i].name'' is your arcology.
 <</if>>
-<<if $arcologies[$i].government != "your trustees">>
-	<<if $arcologies[$i].government != "your agent">>
-		Its leadership has control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > $arcologies[$i].ownership-10>>, a dangerously narrow margin over competition with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
-	<</if>>
+<<set _economicUncertainty = App.Utils.economicUncertainty($i)>>
+<<if $arcologies[$i].direction == 0>>
+	You control @@.lime;$arcologies[$i].ownership%@@ of the arcology, and the largest minority holder controls @@.orange;$arcologies[$i].minority%.@@
+<<elseif ($arcologies[$i].government != "your trustees") && ($arcologies[$i].government != "your agent")>>
+	Its leadership has control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > $arcologies[$i].ownership-10>>, a dangerously narrow margin over competition with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.
 <</if>>
-<<if $arcologies[$i].PCminority > 0>>You own @@.lime;$arcologies[$i].PCminority%@@ of this arcology<<if (($arcologies[$i].government == "your trustees") || ($arcologies[$i].government == "your agent")) && $arcologies[$i].minority > $arcologies[$i].PCminority-10>>, a dangerously narrow margin over competition with a @@.red;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.<</if>>
-<<set $economicUncertainty -= Math.min(2*$assistant.power, $economicUncertainty)>>
-The arcology has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc((0.1*$arcologies[$i].prosperity*random(100-$economicUncertainty,100+$economicUncertainty))/100))>>m,@@
+<<if $arcologies[$i].PCminority > 0>>You own @@.lime;$arcologies[$i].PCminority%@@ of this arcology<<if (($arcologies[$i].government == "your trustees") || ($arcologies[$i].government == "your agent")) && $arcologies[$i].minority > $arcologies[$i].PCminority-10>>, a dangerously narrow margin over competition with a @@.red;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.<</if>>
+The arcology has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc(0.1*$arcologies[$i].prosperity*_economicUncertainty))>>m,@@
 <<if Math.abs($arcologies[$i].prosperity - $averageProsperity) < 5>>
 	average among
 <<elseif $arcologies[$i].prosperity > $averageProsperity>>
@@ -614,3 +608,4 @@ its neighbors.
 		Its culture is diverging from the old world: it is _neighborDescription[0]
 	<</if>>
 <</if>>
+</div>
diff --git a/src/uncategorized/neighborInteract.tw b/src/uncategorized/neighborInteract.tw
index bb7620634a9..746acbf34e6 100644
--- a/src/uncategorized/neighborInteract.tw
+++ b/src/uncategorized/neighborInteract.tw
@@ -71,677 +71,4 @@ You have <<print $arcologies.length-1>> neighbors. <br><br>
 	<</if>>
 <</if>>
 
-<<set _selFunc = (f) => {}>>
-<<set _nd = new App.Neighbor.Display(_selFunc)>>
-<<includeDOM _nd.render()>>
-<<run _nd.select(0)>>
-
-<span id="Security">
-<<set $desc = FutureSocieties.activeFSes(0).map((f) => FutureSocieties.displayName(f))>>
-<<if $desc.length == 0>>
-	Your arcology's culture has not developed to the point where it can meaningfully influence other arcologies.
-<<elseif $desc.length > 2>>
-	Your arcology's mature culture is capable of exerting great cultural sway over other arcologies. It can readily project <<= $desc.reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch)>>.
-<<elseif $desc.length == 2>>
-	Your arcology's culture is capable of exerting some cultural sway over other arcologies. It can effectively project $desc[0] and $desc[1].
-<<else>>
-	Your arcology's culture is capable of starting to exert cultural sway over other arcologies. It can project $desc[0].
-<</if>>
-<br>
-
-<<for _currentNeighbor = 1; _currentNeighbor < $arcologies.length; _currentNeighbor++>>
-<<set _Agent = App.currentAgent(_currentNeighbor)>>
-<<capture _currentNeighbor, _Agent>>
-	<<set $arcologies[_currentNeighbor].prosperity = Math.clamp($arcologies[_currentNeighbor].prosperity, 1, 300)>>
-	<br>You own $arcologies[_currentNeighbor].PCminority% of
-	<<link "$arcologies[_currentNeighbor].name">>
-	<<replace "#Security">> <<set $activeArcologyIdx = _currentNeighbor>>
-	[[Back to the main diplomacy page|Neighbor Interact]]
-	<<set $i = _currentNeighbor>> <<include "Neighbor Description">> <br>
-
-		<<set _ownershipCost = 500*Math.trunc($arcologies[_currentNeighbor].prosperity*(1+($arcologies[_currentNeighbor].demandFactor/100)))>>
-		<br>A 1% interest in this arcology is worth <<print cashFormat(_ownershipCost)>>.
-		<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 100)>>
-			The transaction fee is <<print cashFormat(10000)>>.
-		<</if>>
-		<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 100)>>
-			<br>&nbsp;
-			<<link "Buy" "Neighbor Interact">>
-				<<run cashX(forceNeg(_ownershipCost), "war")>>
-				<<run cashX(-10000, "war")>>
-				<<set $arcologies[_currentNeighbor].PCminority += 1>>
-				<<set $arcologies[_currentNeighbor].demandFactor += 2>>
-			<</link>>
-			<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority <= 90)>>
-				<<if $cash > _ownershipCost*10>>
-					| <<link "10%" "Neighbor Interact">>
-						<<run cashX(forceNeg(_ownershipCost*10), "war")>>
-						<<run cashX(-10000, "war")>>
-						<<set $arcologies[_currentNeighbor].PCminority += 10>>
-						<<set $arcologies[_currentNeighbor].demandFactor += 20>>
-					<</link>>
-					//Transaction costs will only be paid once.//
-				<</if>>
-			<</if>>
-		<</if>>
-
-		<<if $arcologies[_currentNeighbor].PCminority > 0>>
-			<br>&nbsp;
-			<<link "Sell" "Neighbor Interact">>
-				<<run cashX(_ownershipCost, "war")>>
-				<<set $arcologies[_currentNeighbor].PCminority -= 1>>
-				<<set $arcologies[_currentNeighbor].demandFactor -= 2>>
-				<<if $arcologies[_currentNeighbor].government != "your agent" && $arcologies[_currentNeighbor].government != "your trustees" && $arcologies[_currentNeighbor].rival != 1>>
-					<<if $arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 10>>
-						<<set $arcologies[_currentNeighbor].ownership += 10>>
-					<</if>>
-				<</if>>
-			<</link>>
-			<<if $arcologies[_currentNeighbor].PCminority >= 10>>
-				| <<link "10%" "Neighbor Interact">>
-					<<run cashX((_ownershipCost*10), "war")>>
-					<<set $arcologies[_currentNeighbor].PCminority -= 10>>
-					<<set $arcologies[_currentNeighbor].demandFactor -= 20>>
-					<<if $arcologies[_currentNeighbor].government != "your agent" && $arcologies[_currentNeighbor].government != "your trustees" && $arcologies[_currentNeighbor].rival != 1>>
-						<<if $arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 10>>
-							<<set $arcologies[_currentNeighbor].ownership += 10>>
-						<</if>>
-					<</if>>
-			<</link>>
-			<</if>>
-		<</if>>
-		<br>
-
-		<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].embargoTarget>>
-			<br>[[Target them for economic warfare|Neighbor Interact][$arcologies[0].embargoTarget = $arcologies[_currentNeighbor].direction]]
-		<</if>>
-
-		<<if $PC.skill.hacking > 0>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].CyberEconomicTarget>>
-				<br>[[Target them for cyber economic warfare|Neighbor Interact][$arcologies[0].CyberEconomicTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].CyberReputationTarget>>
-				<br>[[Target their leadership for character assassination|Neighbor Interact][$arcologies[0].CyberReputationTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-		<</if>>
-		<<if $desc.length > 0>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].influenceTarget>>
-				<br>[[Set as influence target|Neighbor Interact][$arcologies[0].influenceTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-		<</if>>
-
-	<<if $arcologies[_currentNeighbor].government == "your trustees" || $arcologies[_currentNeighbor].government == "your agent">>
-		<br><br>
-		<<if $arcologies[_currentNeighbor].government == "your trustees">>
-			[[Appoint an agent|Agent Select]] <<set $him = "them">>
-		<<else>>
-			<<setLocalPronouns _Agent>>
-			Your agent @@.deeppink;<<= SlaveFullName(_Agent)>>@@ is running this arcology. <<link "Recall and reenslave $him" "Neighbor Interact">><<run removeJob(_Agent, "be your agent")>><</link>>
-		<</if>>
-		<span id="rename"> | <<link "Instruct $him to rename the arcology">><<replace #rename>> | <<textbox "$arcologies[$activeArcologyIdx].name" $arcologies[$activeArcologyIdx].name>> [[Confirm name|Neighbor Interact]]<</replace>><</link>></span>
-		<<if $arcologies[_currentNeighbor].government === "your agent">>
-			<br>$His <<if _Agent.intelligence > 95>>brilliance<<else>>intelligence<</if>> and education are the most important qualities for $him.
-			<<if _Agent.actualAge > 35>>
-				As with the Head Girl position, $his age and experience lend $him leadership weight.
-			<</if>>
-			<<if _Agent.career == "an arcology owner">>
-				$His career as an arcology owner $himself is, obviously, useful to $him.
-			<<elseif setup.HGCareers.includes(_Agent.career)>>
-				$His career in leadership helps $him.
-			<</if>>
-			<<if _Agent.fetishStrength > 95>>
-				<<if (_Agent.fetish == "dom") || (_Agent.fetish == "sadist")>>
-					$His sexually dominant fetish helps $him fill a leadership role.
-				<<elseif (_Agent.fetish == "submissive") || (_Agent.fetish == "masochist")>>
-					Unfortunately, $he has an inappropriate fetish for a leader.
-				<<else>>
-					$His sexual fetishes will influence how $he leads the arcology.
-				<</if>>
-			<</if>>
-			<<if _Agent.energy > 95>>
-				Finally, $his sexual depravity lets $him fit into arcology society naturally.
-			<</if>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSubjugationist != "unset">>
-			<br><<link "Force Abandonment of Racial Subjugation" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSubjugationist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSupremacist != "unset">>
-			<br><<link "Force Abandonment of Racial Supremacy" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSupremacist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRepopulationFocus != "unset">>
-			<br><<link "Force Abandonment of Repopulationism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRepopulationFocus = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRestart != "unset">>
-			<br><<link "Force Abandonment of Eugenics" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRestart = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSGenderRadicalist != "unset">>
-			<br><<link "Force Abandonment of Gender Radicalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSGenderRadicalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSIntellectualDependency != "unset">>
-			<br><<link "Force Abandonment of Intellectual Dependency" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSIntellectualDependency = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSlaveProfessionalism != "unset">>
-			<br><<link "Force Abandonment of Slave Professionalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSlaveProfessionalism = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSGenderFundamentalist != "unset">>
-			<br><<link "Force Abandonment of Gender Fundamentalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSGenderFundamentalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPaternalist != "unset">>
-			<br><<link "Force Abandonment of Paternalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPaternalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSDegradationist != "unset">>
-			<br><<link "Force Abandonment of Degradationism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSDegradationist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSBodyPurist != "unset">>
-			<br><<link "Force Abandonment of Body Purism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSBodyPurist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSTransformationFetishist != "unset">>
-			<br><<link "Force Abandonment of Transformation Fetishism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSTransformationFetishist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSYouthPreferentialist != "unset">>
-			<br><<link "Force Abandonment of Youth Preferentialism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSYouthPreferentialist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSMaturityPreferentialist != "unset">>
-			<br><<link "Force Abandonment of Maturity Preferentialism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSMaturityPreferentialist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPetiteAdmiration != "unset">>
-			<br><<link "Force Abandonment of Petite Admiration" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPetiteAdmiration = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSStatuesqueGlorification != "unset">>
-			<br><<link "Force Abandonment of Statuesque Glorification" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSStatuesqueGlorification = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSlimnessEnthusiast != "unset">>
-			<br><<link "Force Abandonment of Slimness Enthusiasm" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSlimnessEnthusiast = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSAssetExpansionist != "unset">>
-			<br><<link "Force Abandonment of Asset Expansionism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSAssetExpansionist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPastoralist != "unset">>
-			<br><<link "Force Abandonment of Pastoralism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPastoralist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSCummunism != "unset">>
-			<br><<link "Force Abandonment of Cummunism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSCummunism = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPhysicalIdealist != "unset">>
-			<br><<link "Force Abandonment of Physical Idealism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPhysicalIdealist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSHedonisticDecadence != "unset">>
-			<br><<link "Force Abandonment of Hedonistic Decadence" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSHedonisticDecadence = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSIncestFetishist != "unset">>
-			<br><<link "Force Abandonment of Incest Fetishism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSIncestFetishist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSChattelReligionist != "unset">>
-			<br><<link "Force Abandonment of Chattel Religionism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSChattelReligionist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRomanRevivalist != "unset">>
-			<br><<link "Force Abandonment of Roman Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRomanRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSAztecRevivalist !== "unset">>
-			<br><<link "Force Abandonment of Aztec Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSAztecRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSEgyptianRevivalist != "unset">>
-			<br><<link "Force Abandonment of Egyptian Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSEgyptianRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSEdoRevivalist != "unset">>
-			<br><<link "Force Abandonment of Edo Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSEdoRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSArabianRevivalist != "unset">>
-			<br><<link "Force Abandonment of Arabian Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSArabianRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSChineseRevivalist != "unset">>
-			<br><<link "Force Abandonment of Chinese Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSChineseRevivalist = "unset">><</link>>
-		<</if>>
-	<</if>>
-
-	<br><br>
-	If $arcologies[_currentNeighbor].name has developed enough to begin exporting worthwhile goods, it may be of interest to acquire some.
-	<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-		Since it is under your control, it is no problem at all to request the transfer of goods to $arcologies[0].name.
-	<<elseif $PC.skill.hacking >= 50>>
-		It is within your skills to redirect an outgoing shipment to $arcologies[0].name for your retrieval.
-	<<elseif $arcologies[_currentNeighbor].direction === $arcologies[0].embargoTarget>>
-		Due to your active embargo, trade with $arcologies[_currentNeighbor].name is not possible.
-	<<else>>
-		<<set _opinion = App.Neighbor.opinion(_currentNeighbor, 0)>>
-		<<set _prices = _opinion*10>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSRomanRevivalist > 95>>
-		<<if !isItemAccessible.entry("a toga", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough togas.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSEdoRevivalist > 95>>
-		<<if !isItemAccessible.entry("a kimono", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough kimonos.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSArabianRevivalist > 95>>
-		<<if !isItemAccessible.entry("harem gauze", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough silk.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSAztecRevivalist > 95>>
-		<<if !isItemAccessible.entry("a huipil", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough huipils.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSChineseRevivalist > 95>>
-		<<if !isItemAccessible.entry("a slutty qipao", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough skimpy qipaos.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSEgyptianRevivalist > 95>>
-		<<if !isItemAccessible.entry("ancient Egyptian", "collar")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough replicas of Egyptian necklaces.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSPaternalist > 95>>
-		<<if !isItemAccessible.entry("conservative clothing", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough modest clothing.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSDegradationist > 95>>
-		<<if !isItemAccessible.entry("chains", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough chains.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSGenderFundamentalist > 95>>
-		<<if !isItemAccessible.entry("a bunny outfit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough bunny suits and bowties.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSIntellectualDependency > 95>>
-		<<if !isItemAccessible.entry("a bimbo outfit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough bimbo attire.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSSlaveProfessionalism > 95>>
-		<<if !isItemAccessible.entry("a courtesan dress", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough courtesan dresses.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	/*
-	<<if $arcologies[_currentNeighbor].FSPetiteAdmiration > 95>>
-		<<if !isItemAccessible.entry("temp", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough temp.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	*/
-	<<if $arcologies[_currentNeighbor].FSPhysicalIdealist > 95>>
-		<<if !isItemAccessible.entry("body oil", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough body oil.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSHedonisticDecadence > 95>>
-		<<if !isItemAccessible.entry("stretch pants and a crop-top", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough elastic waistbands and tight tops.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSChattelReligionist > 95>>
-		<<if !isItemAccessible.entry("a chattel habit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough chattel religionist habits.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSPastoralist > 95>>
-		<<if !isItemAccessible.entry("Western clothing", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough rancher outfits.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSRepopulationFocus > 95>>
-		<<if !isItemAccessible.entry("a maternity dress", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough maternity dresses.
-		<</if>>
-		<<if !isItemAccessible.entry("attractive lingerie for a pregnant woman", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough lingerie suited for pregnant women.
-		<</if>>
-		<<if !isItemAccessible.entry("a small empathy belly", "bellyAccessory")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-					<<run cashX(forceNeg(Math.trunc((15000-(_prices*2))*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc(15000-(_prices*2)))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough fake baby bumps.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSStatuesqueGlorification > 95>>
-		<<if !isItemAccessible.entry("platform heels", "shoes")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough varieties of platform shoe.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if _exports != 1>>
-		<<if $arcologies[_currentNeighbor].direction == $arcologies[0].embargoTarget>>
-			Fortunately,
-		<<else>>
-			Unfortunately,
-		<</if>>
-		they have nothing of value.
-	<</if>>
-
-	<</replace>>
-	<</link>>
-	which has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc((0.1*$arcologies[_currentNeighbor].prosperity*random(100-$economicUncertainty,100+$economicUncertainty))/100))>>m@@ and is run by
-	<<if $arcologies[_currentNeighbor].government !== "your agent">>
-		$arcologies[_currentNeighbor].government who own $arcologies[_currentNeighbor].ownership%.
-	<<else>>
-		your agent:
-		<<set _residentList = [_Agent.ID]>>
-		<<set _agentPartner = $slaves.find((s) => s.assignment === Job.AGENTPARTNER && s.relationshipTarget === _Agent.ID)>>
-		<<if _agentPartner>>
-			<<run _residentList.push(_agentPartner.ID)>>
-		<</if>>
-		<<= App.UI.SlaveList.render.listMarkup(
-			_residentList,
-			[],
-			App.UI.SlaveList.SlaveInteract.stdInteract
-		)>>
-	<</if>>
-<</capture>>
-<</for>>
-</span>
+<<includeDOM App.Neighbor.Interact()>>
diff --git a/src/uncategorized/neighborsDevelopment.tw b/src/uncategorized/neighborsDevelopment.tw
index 2d7dd91affb..2bd868154eb 100644
--- a/src/uncategorized/neighborsDevelopment.tw
+++ b/src/uncategorized/neighborsDevelopment.tw
@@ -239,16 +239,7 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 <<if $arcologies[$i].direction != 0>>
 
 /* AI ARCOLOGY SHARE BUYING AND SELLING */
-<<if $arcologies[$i].direction == 0>>
-	<<set $economicUncertainty = 5>>
-<<else>>
-	<<set $economicUncertainty = 10>>
-<</if>>
-<<if $assistant.power > 1>>
-	<<set $economicUncertainty = 0>>
-<<elseif $assistant.power == 1>>
-	<<set $economicUncertainty = Math.max(Math.trunc($economicUncertainty/2),0)>>
-<</if>>
+<<set _economicUncertainty = App.Utils.economicUncertainty($i)>>
 <<if $arcologies[$i].government != "your agent">>
 	<<if $arcologies[$i].government != "your trustees">>
 		<<if $arcologies[$i].minority + $arcologies[$i].ownership + $arcologies[$i].PCminority < 100>>
@@ -257,14 +248,14 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 				Its leadership acquires an increased share of its ownership.
 				<<set $arcologies[$i].ownership += 1>>
 				<<set $arcologies[$i].prosperity -= 5>>
-				This places its government in control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
+				This places its government in control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.
 			<<elseif _prosperityDiff < random(-50,10)>>
 				<<if $arcologies[$i].ownership > 0>>
 					<<if $arcologies[$i].rival != 1 || ($arcologies[$i].rival == 1 && $arcologies[$i].ownership > 51 && random(1,2) == 1)>>
 						Its leadership sells off some of its ownership to stay afloat.
 						<<set $arcologies[$i].ownership -= 1>>
 						<<set $arcologies[$i].prosperity += 5>>
-						This leaves its government in control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition, with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
+						This leaves its government in control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition, with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty>>%@@ share<</if>>.
 					<</if>>
 				<</if>>
 			<</if>>
-- 
GitLab