From 2f568392a551d5d37b931d9fc5867d515eb1eb73 Mon Sep 17 00:00:00 2001
From: Blank_Alt <12406-Blank_Alt@users.noreply.gitgud.io>
Date: Sun, 20 Mar 2022 23:26:25 +0000
Subject: [PATCH] Rivary cleanup

---
 devTools/types/FC/gameState.d.ts              |  27 ++
 js/003-data/gameVariableData.js               |  17 +-
 src/002-config/fc-version.js                  |   2 +-
 src/Mods/SecExp/events/secExpSmilingMan0.js   |   2 +-
 src/Mods/SecExp/events/secExpSmilingMan1.js   |   2 +-
 src/Mods/SecExp/events/secExpSmilingMan2.js   |   2 +-
 src/Mods/SecExp/events/secExpSmilingMan3.js   |   2 +-
 .../backwardsCompatibility.js                 |  35 ++
 src/endWeek/economics/neighborsDevelopment.js |   8 +-
 src/endWeek/nextWeek/nextWeek.js              |   6 +-
 src/endWeek/saDevotion.js                     |   8 +-
 src/endWeek/saRelationships.js                |   2 +-
 src/events/intro/acquisition.js               |   2 +-
 .../nonRandom/daughters/pCoupAftermath.js     |  40 +--
 src/events/nonRandom/mercs/pMercsHelpCorp.js  |   2 +-
 .../peacekeepers/pPeacekeepersIndependence.js |   2 +-
 .../nonRandom/rival/pHostageAcquisition.js    | 232 +++++++-------
 .../nonRandom/rival/pRivalInitiation.js       |  14 +-
 src/events/nonRandom/rival/pRivalryActions.js | 303 +++++++++---------
 src/events/nonRandom/rival/pRivalryCapture.js |  15 +-
 .../nonRandom/rival/pRivalryDispatch.js       |   8 +-
 src/events/nonRandom/rival/pRivalryHostage.js |  12 +-
 .../nonRandom/rival/pRivalryPeacekeepers.js   |   2 +-
 src/events/nonRandom/rival/pRivalryVictory.js |  19 +-
 src/events/scheduled/seFCNNstation.js         |   2 +-
 src/futureSocieties/fsPassage.js              |  68 ++--
 26 files changed, 440 insertions(+), 394 deletions(-)

diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index 4b1d99fd963..9ab475c6db3 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -12,6 +12,33 @@ declare namespace FC {
 		say: string;
 	}
 
+	interface Rival {
+		/**
+		- 0: Init
+		- 1: Not established
+		- 2: Established
+		- 3: Captured
+		- 4: Killed
+		- 5: Enslaved
+		 */
+		state: number;
+		duration: number;
+		prosperity: number;
+		power: number;
+		race?: FC.Race;
+		/**
+		- 1: Female
+		- 2: Male
+		 */
+		gender?: number;
+		ID?: number;
+		FS: {
+			name: string;
+			race?: FC.Race; 
+			adopted?: number;
+		}
+	}
+
 	interface Peacekeepers {
 		/**
 		- 0: Gone
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 0d40cceddf3..aab73fe2d17 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -435,7 +435,6 @@ App.Data.resetOnNGPlus = {
 	/** @type {Array<Array<App.Events.BaseEvent>>} */
 	eventQueue: [],
 
-	rivalID: 0,
 	eliteAuctioned: 0,
 	slavesSacrificedThisWeek: 0,
 
@@ -997,20 +996,8 @@ App.Data.resetOnNGPlus = {
 	hostageGiveIn: 0, // TODO: Set up code block to set to one. This is already checked in src/endWeek/saDevotion.js
 	/** @type {FC.SlaveStateOrZero} */
 	hostageWife: 0,
-	rivalSet: 0,
-	/** @type {FC.Zeroable<FC.FutureSocietyNoun>} */
-	rivalryFS: 0,
-	/** @type {FC.Bool} */
-	rivalryFSAdopted: 0,
-	/** @type {FC.Zeroable<FC.Race>} */
-	rivalryFSRace: 0,
-	rivalOwner: 0,
-	rivalOwnerEnslaved: 0,
-	rivalryPower: 0,
-	rivalryDuration: 0,
-	/** @type {FC.Zeroable<FC.Race>} */
-	rivalRace: 0,
-	rivalGender: 0,
+	/** @type {FC.Rival} */
+	rival: {state: 0, duration: 0, prosperity: 0, power: 0, FS: {name: ""}},
 	nationHate: 0,
 	eventResults: {},
 
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 664f0ebf356..c41b7630b14 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "4.0.0-alpha.13",
 	commitHash: null,
-	release: 1163, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1164, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/Mods/SecExp/events/secExpSmilingMan0.js b/src/Mods/SecExp/events/secExpSmilingMan0.js
index 5d2a749bd1e..cda9d50687c 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan0.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan0.js
@@ -1,7 +1,7 @@
 App.Events.secExpSmilingMan0 = class secExpSmilingMan0 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
 			() => V.SecExp.smilingMan.progress === 0,
 			() => App.Events.effectiveWeek() >= 74,
diff --git a/src/Mods/SecExp/events/secExpSmilingMan1.js b/src/Mods/SecExp/events/secExpSmilingMan1.js
index 4197d1c030b..c51c512a248 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan1.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan1.js
@@ -1,7 +1,7 @@
 App.Events.secExpSmilingMan1 = class secExpSmilingMan1 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
 			() => V.SecExp.smilingMan.progress === 1,
 			() => App.Events.effectiveWeek() >= 77,
diff --git a/src/Mods/SecExp/events/secExpSmilingMan2.js b/src/Mods/SecExp/events/secExpSmilingMan2.js
index d6b439c9896..021d1cac5f5 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan2.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan2.js
@@ -1,7 +1,7 @@
 App.Events.secExpSmilingMan2 = class secExpSmilingMan2 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
 			() => V.SecExp.smilingMan.progress === 2,
 			() => App.Events.effectiveWeek() >= 82,
diff --git a/src/Mods/SecExp/events/secExpSmilingMan3.js b/src/Mods/SecExp/events/secExpSmilingMan3.js
index bbb26716209..c11f7de1eb9 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan3.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan3.js
@@ -1,7 +1,7 @@
 App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
 			() => V.SecExp.smilingMan.progress === 3,
 		];
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 31576225593..89266fc0cef 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -130,6 +130,41 @@ App.Update.backwardsCompatibility = function() {
 };
 
 App.Update.globalVariables = function(node) {
+	V.rival = V.rival || {};
+	V.rival.FS = V.rival.FS || {};
+
+	V.rival.state = V.rival.state || 0;
+	V.rival.prosperity = V.rival.prosperity || 0;
+	V.rival.power = V.rivalryPower || V.rival.power || 0;
+	V.rival.duration = V.rivalryDuration || V.rival.duration || 0;
+	V.rival.FS.name = V.rivalryFS || V.rival.FS.name || "";
+	if (V.rivalRace) {
+		V.rival.race = V.rivalRace;
+	}
+	if (V.rivalryFSRace) {
+		V.rival.FS.race = V.rivalryFSRace;
+	}
+	if (V.rivalryFSAdopted) {
+		V.rival.FS.adopted = 1;
+	}
+	if (V.rivalOwner > 0) {
+		V.rival.prosperity = V.rivalOwner;
+	}
+	if (V.rivalOwner > 0 && V.rivalSet === 0) {
+		V.rival.state = 1;
+	} else if (V.rivalSet === 1) {
+		V.rival.state = 2;
+	}
+	if (V.rivalOwner === -1) {
+		V.rival.state = 3;
+	}
+	if (V.rivalOwnerEnslaved) {
+		V.rival.state = 5;
+	}
+	if (V.rivalGender) {
+		V.rival.gender = V.rivalGender;
+	}
+
 	if (typeof V.peacekeepers.state === "undefined") {
 		V.peacekeepers = V.peacekeepers || {};
 		delete V.peacekeepers.independent;
diff --git a/src/endWeek/economics/neighborsDevelopment.js b/src/endWeek/economics/neighborsDevelopment.js
index 2390e7614e2..835e80e929e 100644
--- a/src/endWeek/economics/neighborsDevelopment.js
+++ b/src/endWeek/economics/neighborsDevelopment.js
@@ -1643,10 +1643,10 @@ App.EndWeek.neighborsDevelopment = function() {
 
 			if (arc.rival === 1) {
 				if (arc.government === "an individual") {
-					if (V.rivalryFSAdopted === 0) {
-						V.rivalryFSAdopted = 1;
+					if (!V.rival.FS.adopted) {
+						V.rival.FS.adopted = 1;
 						const desc = "Its owner is";
-						switch (V.rivalryFS) {
+						switch (V.rival.FS.name) {
 							case "Racial Subjugationism":
 								r.push(`${desc} preoccupied by belief in the superiority of the ${V.arcologies[0].FSSubjugationistRace} race, leading the arcology to <span class="yellow">adopt ${V.arcologies[0].FSSubjugationistRace} Supremacy.</span>`);
 								adoptRivalFS("FSSupremacist");
@@ -1771,7 +1771,7 @@ App.EndWeek.neighborsDevelopment = function() {
 								adoptRivalFS("FSRomanRevivalist");
 								return;
 							default:
-								V.rivalryFSAdopted = 0;
+								delete V.rival.FS.adopted;
 						}
 					} else { // RIVAL ADOPTION
 						let desc = "Its owner is";
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index 849f3f5e5a3..4bf5cea4cd2 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -5,10 +5,10 @@ App.EndWeek.nextWeek = function() {
 	V.upgradeMultiplierTrade = upgradeMultiplier('trading');
 
 	const rival = V.arcologies.find(function(s) { return s.direction !== 0 && s.rival === 1; });
-	if (rival && V.rivalOwner !== 0) {
-		V.rivalOwner = rival.prosperity;
+	if (rival && V.rival.prosperity !== 0) {
+		V.rival.prosperity = V.rival.prosperity;
 	} else if (!rival) {
-		V.rivalSet = 0;
+		V.rival.state = 1;
 	}
 
 	if (V.playerAging !== 0) {
diff --git a/src/endWeek/saDevotion.js b/src/endWeek/saDevotion.js
index 3a563c41626..5700e185d4d 100644
--- a/src/endWeek/saDevotion.js
+++ b/src/endWeek/saDevotion.js
@@ -93,8 +93,8 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 	 *
 	 */
 	function hostageDevotion(slave) {
-		if (slave.origin === "You were acquainted with $him before you were an arcology owner; your rival tried to use $him to manipulate you, but you rescued $him." && slave.newGamePlus === 0 && V.rivalryFS !== "Slave Professionalism" && V.rivalryFS !== "Intellectual Dependency") {
-			if (V.rivalryDuration <= 10 || V.rivalryFS === "Racial Supremacism" || V.rivalryFS === "Paternalism") {
+		if (slave.origin === "You were acquainted with $him before you were an arcology owner; your rival tried to use $him to manipulate you, but you rescued $him." && slave.newGamePlus === 0 && V.rival.FS.name !== "Slave Professionalism" && V.rival.FS.name !== "Intellectual Dependency") {
+			if (V.rival.duration <= 10 || V.rival.FS.name === "Racial Supremacism" || V.rival.FS.name === "Paternalism") {
 				r.push(`You <span class="trust inc">saved ${slave.slaveName} from a living nightmare</span> under your rival's rule. ${He} <span class="devotion inc">tries ${his} best to adapt to ${his} savior's wishes.</span>`);
 				slave.devotion += 10;
 				slave.trust += 10;
@@ -104,7 +104,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 				slave.devotion += 5;
 				slave.trust += 5;
 			*/
-			} else if (V.rivalryDuration > 20 && slave.devotion < 5) {
+			} else if (V.rival.duration > 20 && slave.devotion < 5) {
 				if (gettingPersonalAttention) {
 					r.push(`You took everything from ${slave.slaveName} and <span class="devotion dec">${he} hates you for it.</span> Since you won't give ${him} what ${he} wants, ${he} <span class="trust dec">refuses to trust you.</span> Since you are putting such a personal touch into ${his} care, ${he} can't find it in ${him} to rebel as strongly.`);
 					slave.devotion -= 5;
@@ -114,7 +114,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 					slave.devotion -= 25;
 					slave.trust -= 25;
 				}
-			} else if (V.rivalryDuration > 10 && slave.devotion < 5) {
+			} else if (V.rival.duration > 10 && slave.devotion < 5) {
 				if (gettingPersonalAttention) {
 					r.push(`${He} is <span class="trust dec">horrified by you.</span> Your rival taught ${him} a great deal about slave life in your arcology and indulged ${his} deepest fantasies. ${slave.slaveName} considers being your pet <span class="devotion dec">a fate worse than death.</span> Since you are putting such a personal touch into ${his} care, maybe you aren't the monster ${he} thought you were. ${He} can't find it in ${him} to hate and fear you as much.`);
 					slave.devotion -= 3;
diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js
index f0b4db5cc62..8fef8ef4dbc 100644
--- a/src/endWeek/saRelationships.js
+++ b/src/endWeek/saRelationships.js
@@ -136,7 +136,7 @@ App.SlaveAssignment.relationships = function saRelationships(slave) {
 				r.push(`${slave.slaveName} greets ${potentialFriend.slaveName} with joy. It's not clear whether they ever knew each other during their lives as Futanari Sisters, but it seems that they believe themselves to be in a relationship by simple virtue of having been Sisters. In any case, ${slave.slaveName} and ${potentialFriend.slaveName} <span class="relationship">become inseparable lovers</span> instantly, as though there's no possibility they would do anything else. They're even surprised when other slaves ask them about it; it's as though they're unaware that other possibilities even exist.`);
 				startFriendship(slave, potentialFriend, 4);
 			}
-		} else if (slave.origin === "You were acquainted with $him before you were an arcology owner; your rival tried to use $him to manipulate you, but you rescued $him." && V.rivalryDuration > 20 && !["Intellectual Dependency", "Paternalism", "Racial Supremacism", "Slave Professionalism"].includes(V.rivalryFS) && slave.newGamePlus === 0) {
+		} else if (slave.origin === "You were acquainted with $him before you were an arcology owner; your rival tried to use $him to manipulate you, but you rescued $him." && V.rival.duration > 20 && !["Intellectual Dependency", "Paternalism", "Racial Supremacism", "Slave Professionalism"].includes(V.rival.FS.name) && slave.newGamePlus === 0) {
 			const potentialFriend = V.slaves.find((s) => (s.prestigeDesc === "You bankrupted and enslaved $him in revenge for $his part in the attack on your arcology by the Daughters of Liberty." && s.fuckdoll === 0 && s.fetish !== "mindbroken" && s.newGamePlus === 0));
 			if (potentialFriend !== undefined) {
 				r.push(`${slave.slaveName} greets ${potentialFriend.slaveName} with joy, happy to see a familiar face again. Without any regard to you, <span class="relationship">they continue their prior relationship.</span>`);
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index 80c3dfc450b..23330f02e94 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -20,7 +20,7 @@ App.Intro.acquisition = function() {
 	inbreedingCalc();
 	if (V.plot === 1 && V.neighboringArcologies > 0) {
 		V.arcologies.reduce((acc, val) => (val.direction !== 0 && val.prosperity > acc.prosperity) ? val : acc, V.arcologies[1]).rival = 1;
-		V.rivalSet = 1;
+		V.rival.state = 2;
 	}
 	V.targetAge = V.minimumSlaveAge;
 	V.targetAgeNursery = V.minimumSlaveAge;
diff --git a/src/events/nonRandom/daughters/pCoupAftermath.js b/src/events/nonRandom/daughters/pCoupAftermath.js
index 0977e320c69..4db08a28727 100644
--- a/src/events/nonRandom/daughters/pCoupAftermath.js
+++ b/src/events/nonRandom/daughters/pCoupAftermath.js
@@ -3,20 +3,14 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 		let r = [];
 
 		V.nextButton = " "; // hide button until user makes a selection
-		V.rivalOwner = 0;
-		V.rivalryPower = 0;
-		if (random(0, 99) <= V.seeDicks) {
-			V.rivalGender = 2;
-		} else {
-			V.rivalGender = 1;
-		}
+		V.rival.gender = random(0, 99) <= V.seeDicks ? 2 : 1;
 		const {
 			HeR,
 			heR, himR,
-		} = getPronouns({pronoun: (V.rivalGender === 2) ? App.Data.Pronouns.Kind.male : App.Data.Pronouns.Kind.female}).appendSuffix("R");
+		} = getPronouns({pronoun: (V.rival.gender === 2) ? App.Data.Pronouns.Kind.male : App.Data.Pronouns.Kind.female}).appendSuffix("R");
 		const {heA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
-		const rivalArc = (V.rivalSet !== 0) ? V.arcologies.find(arc => arc.rival === 1) : null;
+		const rivalArc = V.rival.state === 2 ? V.arcologies.find(arc => arc.rival === 1) : null;
 		V.fcnn.push("...evidence also suggests that the Daughters of Liberty had also planned a terrorist attack on...");
 
 		if (V.mercenaries > 3) {
@@ -31,12 +25,12 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 		r.push(`perform the grisly task of disposing of the bodies of the Daughters killed in the assault. They strip them of anything that might be of use in cleaning up after the attempted coup — communication devices, PDAs, computers, even handwritten notes. The raw intel is scanned and passed to ${V.assistant.name}. Most of it is rubbish.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(`Some of it is not. There is evidence of payments from a ${V.rivalSet === 0 ? "nearby Free City" : "neighboring arcology"} to the leadership of the Daughters. ${capFirstChar(V.assistant.name)} is silent for a long time, crosschecking records to assemble a complete picture despite your enemies' attempts to disguise the transactions. Finally, ${V.assistant.name} finishes and displays a picture, using nearly the entire surface of your desk for effect.`);
+		r.push(`Some of it is not. There is evidence of payments from a ${V.rival.state < 2 ? "nearby Free City" : "neighboring arcology"} to the leadership of the Daughters. ${capFirstChar(V.assistant.name)} is silent for a long time, crosschecking records to assemble a complete picture despite your enemies' attempts to disguise the transactions. Finally, ${V.assistant.name} finishes and displays a picture, using nearly the entire surface of your desk for effect.`);
 		if (V.assistant.personality > 0) {
 			r.push(`"This," ${heA} says in a tone of satisfaction, "is the`);
-			if (V.rivalGender === 2) {
+			if (V.rival.gender === 2) {
 				r.push(`bastard`);
-			} else if (V.rivalGender === 1) {
+			} else if (V.rival.gender === 1) {
 				r.push(`bitch`);
 			} else {
 				r.push(`cunt`);
@@ -47,9 +41,9 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 		}
 
 		r.push(`The face is vigorous, determined, and`);
-		if (V.rivalGender === 2) {
+		if (V.rival.gender === 2) {
 			r.push(`masculine. The very stereotype of the male arcology owner.`);
-		} else if (V.rivalGender === 1) {
+		} else if (V.rival.gender === 1) {
 			r.push(`feminine. The very stereotype of the female arcology owner.`);
 		} else {
 			r.push(`androgynous. The very stereotype of the dissolute arcology owner.`);
@@ -57,7 +51,7 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 		if (rivalArc) {
 			r.push(
 				`And, as you suspected, it's one of your neighbors. It's the individual who owns`,
-				App.UI.DOM.makeElement("span", `${rivalArc.name}.`, "bold")
+				App.UI.DOM.makeElement("span", `${rivalArc.name}.`, ["bold"])
 			);
 			App.Events.addParagraph(node, r);
 			r = [];
@@ -70,8 +64,8 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 		App.Events.addParagraph(node, r);
 		r = [];
 		r.push(`You inquire as to whether there's any identifiable cause for the evident dislike.`);
-		if (V.rivalryFS !== 0) {
-			r.push(`"Definitely," says your assistant. "The most cursory review of the recent history of this Free City shows that divergence began with your selection of ${V.rivalryFS} as a society model for the future. They immediately went the opposite direction."`);
+		if (V.rival.FS.name !== "") {
+			r.push(`"Definitely," says your assistant. "The most cursory review of the recent history of this Free City shows that divergence began with your selection of ${V.rival.FS.name} as a society model for the future. They immediately went the opposite direction."`);
 		} else {
 			r.push(`"No," says your assistant. "It may be that giving the Daughters an alternative target was necessary and you were simply unlucky. Alternatively, this may be envy of your success; of rising arcology owners, you have come farthest, fastest."`);
 		}
@@ -102,14 +96,14 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 			r.push(`Free Cities society is understandably reluctant to condemn, never mind depose, arcology owners. The precedent of removing one would be bad, even if the public brought enough strength together to accomplish it. Your evidence looks quite bad, but isn't so incontrovertible as to cause your fellow aristocrats to take such a drastic measure. Nonetheless, the public is aghast at the spectacle of an arcology owner funding an attack on another. Opinion <span class="rep inc">rallies</span> around you, and you even receive some discreet <span class="cash inc">donations,</span> delivered with the intimation that they are to be used against your enemy. There is stony silence from the Daughters' backer; today, you began a real inter-arcology war.`);
 			repX(1000, "war");
 			cashX(10000, "war");
-			V.rivalryPower = 1;
+			V.rival.power = 1;
 			if (rivalArc) {
 				rivalArc.embargo = 2;
 				rivalArc.embargoTarget = 0;
 				rivalArc.influenceTarget = 0;
-				V.rivalOwner = rivalArc.prosperity;
+				V.rival.prosperity = rivalArc.prosperity;
 			} else {
-				V.rivalOwner = V.arcologies[0].prosperity;
+				V.rival.prosperity = V.arcologies[0].prosperity;
 			}
 			App.Events.addParagraph(frag, r);
 			return frag;
@@ -121,14 +115,14 @@ App.Events.PCoupAftermath = class PCoupAftermath extends App.Events.BaseEvent {
 			unlock();
 			r.push(`The money flows out, and the information flows in. You are rewarded with a reasonably complete picture of your rival's operations. The intelligence will be extremely useful going forward, since by gathering it, you sent an unmistakable signal that you do not consider the matter closed. There is stony silence from the Daughters' backer; today, you began a real inter-arcology war. But, with this information, you can maintain it from a position of advantage.`);
 			cashX(-cashTrace, "war");
-			V.rivalryPower = 5;
+			V.rival.power = 5;
 			if (rivalArc) {
 				rivalArc.embargo = 3;
 				rivalArc.embargoTarget = 0;
 				rivalArc.influenceTarget = 0;
-				V.rivalOwner = rivalArc.prosperity;
+				V.rival.prosperity = rivalArc.prosperity;
 			} else {
-				V.rivalOwner = V.arcologies[0].prosperity;
+				V.rival.prosperity = V.arcologies[0].prosperity;
 			}
 			App.Events.addParagraph(frag, r);
 			return frag;
diff --git a/src/events/nonRandom/mercs/pMercsHelpCorp.js b/src/events/nonRandom/mercs/pMercsHelpCorp.js
index e49dc499966..f4fe0b6264e 100644
--- a/src/events/nonRandom/mercs/pMercsHelpCorp.js
+++ b/src/events/nonRandom/mercs/pMercsHelpCorp.js
@@ -2,7 +2,7 @@ App.Events.PMercsHelpCorp = class PMercsHelpCorp extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
 			() => V.corp.Incorporated > 0,
-			() => V.rivalOwnerEnslaved > 0,
+			() => V.rival.state === 5,
 			() => V.mercenaries >= 3,
 			() => V.mercenariesHelpCorp === 0,
 			() => V.corp.DivExtra > 0,
diff --git a/src/events/nonRandom/peacekeepers/pPeacekeepersIndependence.js b/src/events/nonRandom/peacekeepers/pPeacekeepersIndependence.js
index 53ba6e64a48..7ef26c08b3e 100644
--- a/src/events/nonRandom/peacekeepers/pPeacekeepersIndependence.js
+++ b/src/events/nonRandom/peacekeepers/pPeacekeepersIndependence.js
@@ -3,7 +3,7 @@ App.Events.PPeacekeepersIndependence = class PPeacekeepersIndependence extends A
 		return [
 			() => App.Events.effectiveWeek() > 75,
 			() => V.peacekeepers.state === 2 && V.peacekeepers.strength < 50,
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 		];
 	}
 
diff --git a/src/events/nonRandom/rival/pHostageAcquisition.js b/src/events/nonRandom/rival/pHostageAcquisition.js
index 8d88ff92be7..bcf3cdcdcd0 100644
--- a/src/events/nonRandom/rival/pHostageAcquisition.js
+++ b/src/events/nonRandom/rival/pHostageAcquisition.js
@@ -118,13 +118,13 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 		}
 		r.push(`from before you were an arcology owner, and then a pawn in your rival arcology owner's campaign of psychological warfare against you, is now one of your slaves. Your hired mercenaries are en route now with your precious cargo.`);
 
-		switch (V.rivalryFS) {
+		switch (V.rival.FS.name) {
 			case "Racial Subjugationism":
 				if (V.hostage.preg > 0) {
 					WombFatherRace(V.hostage, V.arcologies[0].FSSubjugationistRace);
 				}
 				setHealth(V.hostage, 50, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -134,7 +134,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They kept trying to rape me with ${V.arcologies[0].FSSubjugationistRace} slaves!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s nearly the same as you remember ${him}, albeit a bit more hateful towards ${V.arcologies[0].FSSubjugationistRace} people.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -143,11 +143,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					}
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They raped me with ${V.arcologies[0].FSSubjugationistRace} slaves!" ${He}'s nearly the same as you remember ${him}, albeit with a slight ${V.arcologies[0].FSSubjugationistRace} fetish.`));
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					r.push(Spoken(V.hostage, `"Can I spend some time with the ${V.arcologies[0].FSSubjugationistRace} slaves?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} bluntly asks`);
 					r.push(Spoken(V.hostage, `"Can I get fucked by some ${V.arcologies[0].FSSubjugationistRace} studs?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -168,7 +168,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						App.Utils.getRaceArrayWithoutParamRace(V.arcologies[0].FSSupremacistRace).random()
 					);
 				}
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -184,7 +184,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						setHealth(V.hostage, 0, Math.max(V.hostage.health.shortDamage, 10), Math.max(V.hostage.health.longDamage, 10), 0, 100);
 					}
 					V.hostage.custom.tattoo = "$He has slight scarring from being beaten under your rival's rule.";
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} walks into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -200,7 +200,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						setHealth(V.hostage, 0, Math.max(V.hostage.health.shortDamage, 20), Math.max(V.hostage.health.longDamage, 20), 1, 100);
 					}
 					V.hostage.custom.tattoo = "$He has noticeable scarring from being beaten under your rival's rule.";
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shuffles into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -226,7 +226,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						setHealth(V.hostage, -10, 25, Math.max(V.hostage.health.longDamage, 25), 2, 100);
 					}
 					V.hostage.custom.tattoo = "$He has heavy scarring from being beaten under your rival's rule.";
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} attempts to stumble into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -273,7 +273,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 			case "Repopulation Focus":
 				setHealth(V.hostage, 50, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 5);
 				WombFlush(V.hostage);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -283,7 +283,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They took my eggs away!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember, though a medical scan reveals that ${his} ovaries contain absolutely zero egg cells.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -293,11 +293,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They took my fertility away!"`));
 					r.push(`${He}'s exactly as you remember, though a medical scan reveals that ${his} ovaries contain absolutely zero egg cells.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
 					r.push(Spoken(V.hostage, `"You don't have to worry about knocking me up, I'm sterile!"`));
 					r.push(`with a wink. While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} bluntly says`);
 					r.push(Spoken(V.hostage, `"I won't let you ruin my body with a child!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -312,7 +312,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 			case "Eugenics":
 				setHealth(V.hostage, 50, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 20);
 				if (V.seeHyperPreg !== 1) {
-					if (V.rivalryDuration <= 5) {
+					if (V.rival.duration <= 5) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 						if (V.PC.boobs >= 650) {
 							r.push(`ample bust,`);
@@ -322,7 +322,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`sobbing,`);
 						r.push(Spoken(V.hostage, `"They filled me with cum! I think I'm pregnant!"`));
 						r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember, though a medical scan reveals that ${he} is carrying ${pregNumberName(V.hostage.pregType, 2)}.`);
-					} else if (V.rivalryDuration <= 10) {
+					} else if (V.rival.duration <= 10) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 						if (V.PC.boobs >= 650) {
 							r.push(`ample bust`);
@@ -332,11 +332,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`as ${he} breaks down in tears, ${his} rounded middle pressing into your own.`);
 						r.push(Spoken(V.hostage, `"They knocked me up!"`));
 						r.push(`${He}'s exactly as you remember, though a medical scan reveals that ${he} is carrying ${pregNumberName(V.hostage.pregType, 2)}.`);
-					} else if (V.rivalryDuration <= 15) {
+					} else if (V.rival.duration <= 15) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} gravid bulk back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
 						r.push(Spoken(V.hostage, `"Please don't take them from me, I love them..."`));
 						r.push(`While ${he} looks the same as you remember, albeit rather pregnant, ${he} certainly doesn't think the same anymore.`);
-					} else if (V.rivalryDuration <= 20) {
+					} else if (V.rival.duration <= 20) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} gravid bulk back and forth, unsure of what to make of you. As you step forward, ${he} carefully steps back. After several steps, ${he} bluntly says`);
 						r.push(Spoken(V.hostage, `"I won't let you hurt them!"`));
 						r.push(`as ${he} covers ${his} pregnant belly. While ${he} looks the same as you remember, albeit very pregnant, ${he} definitely doesn't think the same anymore.`);
@@ -348,7 +348,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`The mercenary captain quickly gags ${him}, "My apologies, I did warn you ${he} was a handful. Please be careful when you unbind ${him}, ${he} may try to do something stupid," he says as he and his group exit your penthouse, leaving you with the enraged ${V.hostage.slaveName}. ${He} looks the same as you remember, but ${he} acts nothing like the ${girl} you used to know. Odds are high that ${he}'ll cause problems for you in the future, especially when ${he} realizes ${his} babies didn't follow ${him} here.`);
 					}
 				} else {
-					if (V.rivalryDuration <= 5) {
+					if (V.rival.duration <= 5) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 						if (V.PC.boobs >= 650) {
 							r.push(`ample bust,`);
@@ -358,7 +358,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`sobbing,`);
 						r.push(Spoken(V.hostage, `"They filled me with cum! I think I'm pregnant!"`));
 						r.push(`You gently wrap your arms around ${him} in a comforting embrace, yet you can't help but notice how distended ${his} belly is. ${He}'s exactly as you remember, maybe a little heftier, but a medical scan reveals, horrifyingly, that ${he} is carrying over two dozen babies in ${his} womb.`);
-					} else if (V.rivalryDuration <= 10) {
+					} else if (V.rival.duration <= 10) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You try to pull ${him} into your`);
 						if (V.PC.boobs >= 650) {
 							r.push(`ample bust,`);
@@ -368,11 +368,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`but ${his} huge pregnant belly prevents you. As ${he} breaks down in tears, ${he} moans`);
 						r.push(Spoken(V.hostage, `"My womb is soo full..."`));
 						r.push(`${He}'s nearly the same as you remember ${him}, save for ${his} huge pregnant belly, which a medical scan reveals contains over two dozen children.`);
-					} else if (V.rivalryDuration <= 15) {
+					} else if (V.rival.duration <= 15) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} super gravid bulk back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough for ${his} monstrous belly to bump into your own, ${he} says`);
 						r.push(Spoken(V.hostage, `"It feels so good to be stuffed completely full of life. You'll let me enjoy this, won't you?"`));
 						r.push(`While ${he} looks the same as you remember, albeit grossly pregnant, ${he} certainly doesn't think the same anymore. A medical exam, much to ${his} enjoyment, reveals ${his} overfilled womb contains nearly two dozen children.`);
-					} else if (V.rivalryDuration <= 20) {
+					} else if (V.rival.duration <= 20) {
 						r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} hyper gravid bulk back and forth, unsure of what to make of you. As you step forward, ${he} carefully steps back. After several steps, ${he} bluntly says`);
 						r.push(Spoken(V.hostage, `"Unless you want to put more babies in me, get back!"`));
 						r.push(`as ${he} attempts to cover ${his} super-sized pregnant belly. While ${he} looks the same as you remember, albeit grotesquely pregnant, ${he} certainly doesn't think the same anymore. A medical exam, much to ${his} delight, reveals ${his} near bursting womb contains nearly two dozen children.`);
@@ -387,7 +387,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Gender Radicalism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 20);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -397,7 +397,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They acted so weird!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember, if not slightly more attached to you.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -407,11 +407,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"Will you be as kind to me as they were?"`));
 					r.push(`${He}'s exactly as you remember, if not slightly more attached to you.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					r.push(Spoken(V.hostage, `"Will you love me too?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} bluntly shouts`);
 					r.push(Spoken(V.hostage, `"Stay away from me you rapist!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -425,7 +425,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Gender Fundamentalism":
 				setHealth(V.hostage, 20, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 20);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -435,7 +435,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They did such terrible things to my butt!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember, if not a little curious about anal.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -445,14 +445,14 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They broke my butthole!"`));
 					r.push(`${He}'s exactly as you remember, minus ${his} loose rear.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
 					r.push(Spoken(V.hostage, `"Do you want to fuck my butt?`));
 					if (V.seeDicks !== 0) {
 						r.push(`Maybe touch my penis?`);
 					}
 					r.push(Spoken(V.hostage, `" While ${he} looks the same as you remember, minus ${his} very loose butthole${(V.seeDicks !== 0) ? ` and minuscule dick` : ``}, ${he} certainly doesn't think the same anymore.`));
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 60;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} bluntly says`);
 					r.push(Spoken(V.hostage, `"Piss off vagina fucker, slaves' asses are for pounding!"`));
@@ -475,7 +475,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				}
 				break;
 			case "Paternalism":
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -489,7 +489,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (V.hostage.health.health > -20) {
 						setHealth(V.hostage, 0, Math.max(V.hostage.health.shortDamage, 10), Math.max(V.hostage.health.longDamage, 10), 0, 70);
 					}
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} tries to crawl to you. You help ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -504,7 +504,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (V.hostage.health.health > -40) {
 						setHealth(V.hostage, 0, Math.max(V.hostage.health.shortDamage, 20), Math.max(V.hostage.health.longDamage, 20), 0, 80);
 					}
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} tries to crawl to you. You help ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -517,7 +517,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (V.hostage.health.health > -60) {
 						setHealth(V.hostage, -10, 25, Math.max(V.hostage.health.longDamage, 25), 1, 90);
 					}
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon being placed in your office, ${V.hostage.slaveName} curls into a fetal position and begins sobbing,. You help ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -543,7 +543,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Degradationism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 0);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -553,7 +553,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They acted so weird!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember, if not slightly more attached to you.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -563,11 +563,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"Will you be as kind to me as they were?"`));
 					r.push(`${He}'s exactly as you remember, if not slightly more attached to you.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					r.push(Spoken(V.hostage, `"Will you love me too?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} bluntly says`);
 					r.push(Spoken(V.hostage, `"Stay away from me you rapist!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -585,7 +585,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Body Purism":
 				setHealth(V.hostage, 0, Math.max(V.hostage.health.shortDamage, 15), Math.max(V.hostage.health.longDamage, 15), 0, 20);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} attempts to dive into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust.`);
@@ -595,7 +595,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`The weight of ${his} huge ${V.hostage.boobs}cc fake tits knocks the wind out of you. You embrace ${him} as best you can as ${he} sobs`);
 					r.push(Spoken(V.hostage, `"Look what they did to my chest! They ruined it!"`));
 					r.push(`${He} looks similar to how you remember, minus ${his} huge chest of course.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${his} massive ${V.hostage.boobs}cc fake tits into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -605,11 +605,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"Why do these tit balloons feel so good?!"`));
 					r.push(`${He} looks similar to how you remember, minus ${his} massive chest of course.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} massive weight back and forth, unsure of what to make of you. As you step forward, ${he} attempts to move closer, only to fall to the ground under the weight of ${his} obscene ${V.hostage.boobs}cc fake tits. You kneel beside ${him}, a hand on ${his} huge fake ass, as ${he} asks`);
 					r.push(Spoken(V.hostage, `"Do you like them? I think they should be bigger..."`));
 					r.push(`The ${girl} you used to know is barely recognizable under those implants and ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`${V.hostage.slaveName}'s impressive bulk is placed in your office. Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth atop ${his} ${V.hostage.boobs}cc implants, unsure of what to make of you. As you step forward, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Don't pop my implants!"`));
 					r.push(`The ${girl} you used to know is barely recognizable under those implants and ${he} certainly doesn't think the same anymore.`);
@@ -623,7 +623,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Transformation Fetishism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -633,7 +633,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They told me such horrible things about you!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -642,11 +642,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					}
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"You aren't going to force implants into me, are you?" While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`));
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} states`);
 					r.push(Spoken(V.hostage, `"Please don't make me into a blow up doll..."`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want balloons on my chest!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -660,7 +660,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Youth Preferentialism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -670,7 +670,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"This old ${woman2} tried to make me ${his2} pet!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -680,7 +680,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me make out with an old lady!"`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					if (V.PC.visualAge >= 50) {
 						r.push(Spoken(V.hostage, `"Were you always that attractive?"`));
@@ -688,7 +688,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(Spoken(V.hostage, `"Can I hang out with some MILFs?"`));
 					}
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} says`);
 					if (V.PC.visualAge >= 50) {
@@ -709,7 +709,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Maturity Preferentialism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -719,7 +719,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"This young ${girl2} kept molesting me!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -729,7 +729,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me make out with some young harlot!"`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					if (V.PC.visualAge < 35) {
 						r.push(Spoken(V.hostage, `"Were you always that attractive?"`));
@@ -737,7 +737,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(Spoken(V.hostage, `"Can I hang out with the rest of the young ladies?"`));
 					}
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} says`);
 					if (V.PC.visualAge < 35) {
@@ -759,7 +759,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 			case "Slimness Enthusiasm":
 				setHealth(V.hostage, -30, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 40);
 				V.hostage.chem = 100;
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} attempts to dive into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust.`);
@@ -769,7 +769,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`The weight of ${his} huge ${V.hostage.boobs}cc tits knocks the wind out of you. You embrace ${him} as best you can, you hands sinking into ${his} soft butt, as ${he} sobs`);
 					r.push(Spoken(V.hostage, `"Look what they did to my chest and ass! They ruined them!"`));
 					r.push(`${He} looks similar to how you remember, minus ${his} huge assets of course.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${his} massive ${V.hostage.boobs}cc breasts into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -779,11 +779,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"Why do these meat balloons feel so good?!"`));
 					r.push(`${He} looks similar to how you remember, minus ${his} massive assets of course.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`${V.hostage.slaveName}'s impressive bulk is placed in your office. Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth atop ${his} ${V.hostage.boobs}cc breasts, causing ${his} chubby body and fat ass to jiggle, unsure of what to make of you. As you step forward, ${he} asks`);
 					r.push(Spoken(V.hostage, `"Can you make my tits bigger?"`));
 					r.push(`The ${girl} you used to know is barely recognizable under those massive tits and ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`${V.hostage.slaveName}'s impressive bulk is placed in your office. Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth atop ${his} ${V.hostage.boobs}cc implants, causing ${his} plump body and huge ass to jiggle, unsure of what to make of you. As you step forward, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Don't take my breasts away!"`));
 					r.push(`The ${girl} you used to know is barely recognizable under those immense tits and ${he} certainly doesn't think the same anymore.`);
@@ -797,7 +797,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Asset Expansionism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -807,7 +807,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They told me such horrible things about you!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -817,11 +817,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"You aren't going to make my tits huge, are you?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} pleads`);
 					r.push(Spoken(V.hostage, `"Please don't turn me into a big boobed freak..."`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want tits bigger than my body!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -835,7 +835,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Pastoralism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 70);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -848,7 +848,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`);
 					}
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -861,11 +861,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`);
 					}
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
 					r.push(Spoken(V.hostage, `"I don't want to ever be so heavy again..."`));
 					r.push(`${He} is noticeably thinner and much more muscular than you remember; ${he} certainly doesn't think the same anymore, either.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want ever want to be a fat cow again!"`));
 					r.push(`${He} is thin and extremely muscular, a stark difference from the soft, chubby ${girl} you used to know; ${he} certainly doesn't think the same anymore, either.`);
@@ -881,7 +881,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Cummunism":
 				setHealth(V.hostage, -30, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} attempts to dive into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust.`);
@@ -891,7 +891,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`The weight of ${his} huge ${V.hostage.boobs}cc tits knocks the wind out of you. You embrace ${him} as best you can, you hands sinking into ${his} soft butt, as ${he} sobs`);
 					r.push(Spoken(V.hostage, `"They made me fat! My nipples won't stop leaking milk!"`));
 					r.push(`${He} looks similar to how you remember, minus ${his} huge milky assets of course.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${his} massive ${V.hostage.boobs}cc milky breasts into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -901,11 +901,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"Why did they make me into a cow, I don't understand..."`));
 					r.push(`${He} looks similar to how you remember, minus ${his} massive assets of course.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`${V.hostage.slaveName}'s impressive bulk is placed in your office. Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth atop ${his} ${V.hostage.boobs}cc breasts, causing ${his} chubby body and fat ass to jiggle, unsure of what to make of you. As you step forward, ${he} asks`);
 					r.push(Spoken(V.hostage, `"Can you milk me?"`));
 					r.push(`The ${girl} you used to know is barely recognizable under all that fat and ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`${V.hostage.slaveName}'s impressive bulk is placed in your office. Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth atop ${his} ${V.hostage.boobs}cc breasts, causing ${his} fat body and huge ass to jiggle, unsure of what to make of you. As you step forward, ${he} asks`);
 					r.push(Spoken(V.hostage, `"I hear a baby will make my milk better, would you like to try?"`));
@@ -919,7 +919,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				}
 				break;
 			case "Physical Idealism":
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -930,7 +930,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(Spoken(V.hostage, `"They made me fat! I'm so glad those guys let me puke up all that food; I don't even want to think how big I'd be otherwise!"`));
 					r.push(`${He} looks similar to how you remember, thanks to the pudge, though that can be easily rectified.`);
 					setHealth(V.hostage, 0, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 0);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${his} meaty body into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -941,12 +941,12 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(Spoken(V.hostage, `"Why did they make me into a sow, I don't understand..."`));
 					r.push(`${He} looks similar to how you remember, minus ${his} added weight of course.`);
 					setHealth(V.hostage, -10, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 0);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth causing ${his} plump body, big breasts and fat ass to jiggle, unsure of what to make of you. As you step forward, ${he} asks`);
 					r.push(Spoken(V.hostage, `"Can I have some food?"`));
 					r.push(`The ${girl} you used to know is barely recognizable under all that fat and ${he} certainly doesn't think the same anymore.`);
 					setHealth(V.hostage, -30, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 0);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth causing ${his} fat body to jiggle, unsure of what to make of you. As you step forward, ${he} stumbles back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want to work out! Stuffing my face and holes whenever I please is too much fun!"`));
 					r.push(`The ${girl} you used to know is barely recognizable under that obese body; ${he} certainly doesn't think the same anymore, either.`);
@@ -962,7 +962,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Hedonistic Decadence":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 70);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -975,7 +975,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`);
 					}
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -988,11 +988,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`);
 					}
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
 					r.push(Spoken(V.hostage, `"I don't want to ever be so heavy again..."`));
 					r.push(`${He} is noticeably thinner and much more muscular than you remember; ${he} certainly doesn't think the same anymore, either.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want ever want to be a fat sow again!"`));
 					r.push(`${He} is thin and extremely muscular, a stark difference from the soft, chubby ${girl} you used to know; ${he} certainly doesn't think the same anymore, either.`);
@@ -1008,7 +1008,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Chattel Religionism":
 				setHealth(V.hostage, 50, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1018,7 +1018,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They told me such horrible things about you!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1028,11 +1028,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"You aren't trying to make some crazy religion, are you?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} pleads`);
 					r.push(Spoken(V.hostage, `"Please don't turn me into a disciple of your religion..."`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want to be part of your cult!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -1046,7 +1046,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Multiculturalism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1056,7 +1056,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They said such crazy things!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1066,11 +1066,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me pray for your arcology; why is that?"`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} prays`);
 					r.push(Spoken(V.hostage, `"Please pardon this arcology..."`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} drops to ${his}`);
 					if (hasBothLegs(V.hostage)) {
@@ -1091,7 +1091,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Intellectual Dependency":
 				setHealth(V.hostage, 80, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 5);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1101,7 +1101,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They tried to teach me the most obscene things!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1111,13 +1111,13 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me a whore. I feel so disgusting..."`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					V.hostage.devotion = 40;
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} stiffens up and waits for you to make a move. ${He} holds completely still, even as you place a hand on ${his} shoulder. ${He} stutters out a quiet`);
 					r.push(Spoken(V.hostage, `"${Master}? W-what may I do f-for you?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.devotion = 65;
 					V.hostage.trust = 65;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} graciously bows, giving you a lovely view down ${his} cleavage. ${He} holds this position, before stating`);
@@ -1133,7 +1133,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Slave Professionalism":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 0);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1143,7 +1143,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They did things to me! My head hurts so much..."`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1153,11 +1153,11 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"I can barely remember things anymore; who were you again? I hate to ask, but... I need a good fuck right now..."`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly can't think the same anymore.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} bounces into your arms.`);
 					r.push(Spoken(V.hostage, `"Wanna do it?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} wastes no time in`);
 					if (V.PC.dick !== 0) {
 						r.push(`unbuckling your pants`);
@@ -1172,7 +1172,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Petite Admiration":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1182,7 +1182,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"This giant ${woman2} tried to make me ${his2} pet!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1192,12 +1192,12 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me make out with a giant!"`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					/* player height check here */
 					r.push(Spoken(V.hostage, `"Can I hang out with someone taller than me?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} says`);
 					/* player height check here */
@@ -1213,7 +1213,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			case "Statuesque Glorification":
 				setHealth(V.hostage, 60, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1223,7 +1223,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"This midget kept molesting me!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1233,13 +1233,13 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"They made me get on ${(hasBothLegs(V.hostage)) ? `my knees` : `the ground`} and make out with some tiny harlot!"`));
 					r.push(`${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
 					/* player height check here */
 
 					r.push(Spoken(V.hostage, `"Is there anyone shorter I can hang out with around here?"`));
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					V.hostage.trust = 40;
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} says`);
 					/* player height check here */
@@ -1256,7 +1256,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 				break;
 			default:
 				setHealth(V.hostage, 40, V.hostage.health.shortDamage, V.hostage.health.longDamage, 0, 10);
-				if (V.rivalryDuration <= 5) {
+				if (V.rival.duration <= 5) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} dives into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust,`);
@@ -1266,7 +1266,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					r.push(`sobbing,`);
 					r.push(Spoken(V.hostage, `"They told me such horrible things about you!"`));
 					r.push(`You gently wrap your arms around ${him} in a comforting embrace. ${He}'s exactly as you remember.`);
-				} else if (V.rivalryDuration <= 10) {
+				} else if (V.rival.duration <= 10) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
@@ -1274,21 +1274,21 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						r.push(`chest`);
 					}
 					r.push(`as ${he} breaks down in tears.`);
-					if (V.rivalryFS !== 0) {
+					if (V.rival.FS.name !== "") {
 						r.push(Spoken(V.hostage, `"You aren't trying to make some crazy old-timey society, are you?"`));
 					} else {
 						r.push(Spoken(V.hostage, `"You aren't going to try to make me... do things to you, right?"`));
 					}
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 15) {
+				} else if (V.rival.duration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`);
-					if (V.rivalryFS !== 0) {
+					if (V.rival.FS.name !== "") {
 						r.push(Spoken(V.hostage, `"Please don't make me play along..."`));
 					} else {
 						r.push(Spoken(V.hostage, `"I don't want to be your plaything..."`));
 					}
 					r.push(`While ${he} looks the same as you remember, ${he} certainly doesn't think the same anymore.`);
-				} else if (V.rivalryDuration <= 20) {
+				} else if (V.rival.duration <= 20) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} quickly steps back. After several steps, ${he} screams`);
 					r.push(Spoken(V.hostage, `"Keep away from me! I don't want to be part of your crazy society!"`));
 					r.push(`While ${he} looks the same as you remember, ${he} definitely doesn't think the same anymore.`);
@@ -1296,26 +1296,26 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 					V.hostage.trust = 80;
 					r.push(`Your mercenaries radio you upon arrival. "This one's got quite some spunk in ${him}, you better ready yourself. We're coming in now."`);
 					r.push(`Upon seeing you, ${V.hostage.slaveName}'s eyes fill with a distinct hatred. As you step forward, ${he} stands ${his} ground. After several steps, ${he} shouts`);
-					r.push(Spoken(V.hostage, `"Stay away from me, you crazy psycho! ${(V.rivalryFS !== 0) ? `Remaking a fallen empire, madness! You think yourself a king —"` : `You think you can just take whatever you want from people — Fuck, I don't even know if you even THINK of them as people anymore! How dare you even think I —"`}`));
+					r.push(Spoken(V.hostage, `"Stay away from me, you crazy psycho! ${V.rival.FS.name !== "" ? `Remaking a fallen empire, madness! You think yourself a king —"` : `You think you can just take whatever you want from people — Fuck, I don't even know if you even THINK of them as people anymore! How dare you even think I —"`}`));
 					r.push(`The mercenary captain quickly gags ${him}, "My apologies, I did warn you ${he} was a handful. Please be careful when you unbind ${him}, ${he} may try to do something stupid," he says as he and his group exit your penthouse, leaving you with the enraged ${V.hostage.slaveName}. ${He} looks the same as you remember, but ${he} acts nothing like the ${girl} you used to know. Odds are high that ${he}'ll cause problems for you in the future.`);
 				}
 		}
 
-		if (V.rivalryDuration <= 10 || (V.rivalryFS === "Racial Supremacism" && V.rivalryDuration <= 20) || (V.rivalryFS === "Paternalism" && V.rivalryDuration <= 20)) {
+		if (V.rival.duration <= 10 || (V.rival.FS.name === "Racial Supremacism" || V.rival.FS.name === "Paternalism") && V.rival.duration <= 20) {
 			r.push(`${He} considers you ${his} rescuer, since ${his} previous owner subjected ${him} to unremitting horror in an attempt`);
-			if (V.rivalryFS !== 0) {
-				r.push(`to offend your philosophy of ${V.rivalryFS}.`);
+			if (V.rival.FS.name !== "") {
+				r.push(`to offend your philosophy of ${V.rival.FS.name}.`);
 			} else {
 				r.push(`turn ${him} against you.`);
 			}
 			r.push(`${He}'s overjoyed to be your slave.`);
-		} else if ((V.rivalryFS === "Racial Supremacism" && V.rivalryDuration > 20) || (V.rivalryFS === "Paternalism" && V.rivalryDuration > 20)) {
-			r.push(`${His} mind and body were destroyed in an attempt to offend your philosophy of ${V.rivalryFS}. If ${he} ever recovers, ${he}'d consider you ${his} savior and be overjoyed to be your slave.`);
-		} else if (V.rivalryFS === "Slave Professionalism") {
+		} else if ((V.rival.FS.name === "Racial Supremacism" || V.rival.FS.name === "Paternalism") && V.rival.duration > 20) {
+			r.push(`${His} mind and body were destroyed in an attempt to offend your philosophy of ${V.rival.FS.name}. If ${he} ever recovers, ${he}'d consider you ${his} savior and be overjoyed to be your slave.`);
+		} else if (V.rival.FS.name === "Slave Professionalism") {
 			r.push(`${His} mind was ravaged and perverted by rampant use of psychosuppressants and aphrodisiacs. There is no coming back from the damages done.`);
-		} else if (V.rivalryFS === "Intellectual Dependency") {
+		} else if (V.rival.FS.name === "Intellectual Dependency") {
 			r.push(`${He} has undergone so much slave training that ${he} considers this turn of events ultimately meaningless. You are just ${his} new owner and ${he} will serve you to the best of ${his} abilities; as a slave should.`);
-		} else if (V.rivalryDuration > 20) {
+		} else if (V.rival.duration > 20) {
 			r.push(`You took everything from ${him} and ${he} hates you as much as ${he} possibly can for it. You ripped ${him} away from heaven to sentence ${him} to a living hell, and ${he} swears to do everything ${he} can to hurt you.`);
 		} else {
 			r.push(`${He} is horrified by this turn of events. Your rival taught ${him} a great deal about slave life in your arcology and indulged ${his} deepest fantasies. ${V.hostage.slaveName} considers becoming your slave little better than a condemnation to purgatory.`);
diff --git a/src/events/nonRandom/rival/pRivalInitiation.js b/src/events/nonRandom/rival/pRivalInitiation.js
index ce21beb6783..f655fbccb81 100644
--- a/src/events/nonRandom/rival/pRivalInitiation.js
+++ b/src/events/nonRandom/rival/pRivalInitiation.js
@@ -1,16 +1,14 @@
 App.Events.PRivalInitiation = class PRivalInitiation extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === -1,
-			() => !!getSlave(V.rivalID)
+			() => V.rival.state === 3,
+			() => !!getSlave(V.rival.ID)
 		];
 	}
 
 	execute(node) {
-		V.rivalOwner = 0;
-		V.rivalOwnerEnslaved = 1;
-
-		const slave = getSlave(V.rivalID);
+		V.rival.state = 5;
+		const slave = getSlave(V.rival.ID);
 		const {
 			He, His,
 			he, him, his, himself
@@ -34,9 +32,7 @@ App.Events.PRivalInitiation = class PRivalInitiation extends App.Events.BaseEven
 		}
 		App.Events.addResponses(node, choices);
 
-		// reset event trigger
-		V.rivalID = 0;
-
+		delete V.rival.ID;
 		function tour() {
 			const frag = new DocumentFragment();
 			let r = [];
diff --git a/src/events/nonRandom/rival/pRivalryActions.js b/src/events/nonRandom/rival/pRivalryActions.js
index 946c3ddea7e..947cf058a7c 100644
--- a/src/events/nonRandom/rival/pRivalryActions.js
+++ b/src/events/nonRandom/rival/pRivalryActions.js
@@ -7,17 +7,17 @@ App.Events.pRivalryActions = function() {
 		if (V.hostageAnnounced === 1 && V.hostage) {
 			App.Events.drawEventArt(node, V.hostage);
 		}
-		V.rivalryDuration += 1;
+		V.rival.duration++;
 
 		const {
 			HisR, HeR,
 			hisR, himR
-		} = getPronouns({pronoun: (V.rivalGender === 2) ? 1 : 0}).appendSuffix("R");
+		} = getPronouns({pronoun: (V.rival.gender === 2) ? 1 : 0}).appendSuffix("R");
 		const {girlU, hisU, himU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
 		const {heA, hisA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 		const {woman2, he2, his2, him2, mother2, wife2} = getPronouns(V.hostageWife || {pronoun: 0}).appendSuffix("2");
 
-		r.push(`Your inter-arcology war with the arcology owner behind the Daughters of Liberty has dragged on for ${V.rivalryDuration} ${(V.rivalryDuration > 1) ? `weeks` : `week`}. The tone of your arcology is a bit more somber than usual. You have enhanced security in place, and the populace has caught the mood.`);
+		r.push(`Your inter-arcology war with the arcology owner behind the Daughters of Liberty has dragged on for ${V.rival.duration} ${(V.rival.duration > 1) ? `weeks` : `week`}. The tone of your arcology is a bit more somber than usual. You have enhanced security in place, and the populace has caught the mood.`);
 
 		if (V.hostageAnnounced === 1 && V.hostage) {
 			const {
@@ -26,13 +26,13 @@ App.Events.pRivalryActions = function() {
 			} = getPronouns(V.hostage);
 			const seed = random(1, 100);
 
-			if (V.rivalryDuration >= 30) {
+			if (V.rival.duration >= 30) {
 				r.push(`The latest message from your rival is a live communication.`);
 			} else {
 				r.push(`The latest message from your rival recently arrived, showing ${SlaveFullName(V.hostage)}`);
 			}
-			if (V.rivalryDuration === 1) {
-				switch (V.rivalryFS) {
+			if (V.rival.duration === 1) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						V.hostage.trust -= 5;
 						V.hostage.devotion -= 5;
@@ -72,7 +72,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 4;
 							V.hostage.pregType = 8;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 2;
@@ -89,7 +89,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 4;
 							V.hostage.pregType = 40;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 2;
@@ -315,8 +315,8 @@ App.Events.pRivalryActions = function() {
 						V.hostage.sexualFlaw = "repressed";
 						r.push(`bound and being introduced to ${his} new lifestyle.`);
 				}
-			} else if (V.rivalryDuration === 6) {
-				switch (V.rivalryFS) {
+			} else if (V.rival.duration === 6) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						V.hostage.trust -= 5;
 						V.hostage.devotion -= 5;
@@ -361,7 +361,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 11;
 							V.hostage.pregType = 8;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.counter.oral += 50;
@@ -376,7 +376,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 11;
 							V.hostage.pregType = 40;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.boobs += 100;
@@ -701,8 +701,8 @@ App.Events.pRivalryActions = function() {
 						V.hostage.fetishStrength = 10;
 						r.push(`questioning why ${he} is yearning to be a part of this society.`);
 				}
-			} else if (V.rivalryDuration === 11) {
-				switch (V.rivalryFS) {
+			} else if (V.rival.duration === 11) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						V.hostage.trust -= 5;
 						V.hostage.devotion -= 5;
@@ -770,7 +770,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 21;
 							V.hostage.pregType = 8;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 3;
@@ -794,7 +794,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 21;
 							V.hostage.pregType = 40;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 3;
@@ -1146,8 +1146,8 @@ App.Events.pRivalryActions = function() {
 						V.hostage.sexualQuirk = "caring";
 						r.push(`eagerly getting ready to spend some time in the city.`);
 				}
-			} else if (V.rivalryDuration === 16) {
-				switch (V.rivalryFS) {
+			} else if (V.rival.duration === 16) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						V.hostage.trust -= 5;
 						V.hostage.devotion -= 5;
@@ -1200,7 +1200,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 31;
 							V.hostage.pregType = 8;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 4;
@@ -1220,7 +1220,7 @@ App.Events.pRivalryActions = function() {
 							V.hostage.preg = 31;
 							V.hostage.pregType = 40;
 							V.hostage.pregKnown = 1;
-							V.hostage.pregWeek = V.rivalryDuration;
+							V.hostage.pregWeek = V.rival.duration;
 							WombImpregnate(V.hostage, V.hostage.pregType, 0, V.hostage.preg);
 							SetBellySize(V.hostage);
 							V.hostage.vagina = 4;
@@ -1512,8 +1512,8 @@ App.Events.pRivalryActions = function() {
 						V.hostage.fetishStrength = 100;
 						r.push(`chatting with a group of fresh slaves, explaining how nice it is to live in this arcology.`);
 				}
-			} else if (V.rivalryDuration === 21) {
-				switch (V.rivalryFS) {
+			} else if (V.rival.duration === 21) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						V.hostage.counter.oral += 50;
 						V.hostage.counter.vaginal += 50;
@@ -1826,9 +1826,9 @@ App.Events.pRivalryActions = function() {
 						V.hostage.counter.vaginal += 1;
 						r.push(`giving an interview. ${He} gushes over how great it is to experience all manners of class and culture, both physically and spiritually.`);
 				}
-			} else if (V.rivalryDuration >= 30) {
+			} else if (V.rival.duration >= 30) {
 				V.hostageAnnounced = 0;
-				switch (V.rivalryFS) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
 						r.push(`"Looking for ${SlaveFullName(V.hostage)}? Too bad, I couldn't bear to think of you ever getting your rotten little hands on ${him}, so I sent ${him} and ${his} lovers someplace far away. Someplace you'll never find them. Bet tha"`);
 						break;
@@ -1910,9 +1910,9 @@ App.Events.pRivalryActions = function() {
 				r.push(`- You end the call.`);
 			} else {
 				const hostageAction = [];
-				switch (V.rivalryFS) {
+				switch (V.rival.FS.name) {
 					case "Racial Subjugationism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 10;
@@ -1921,7 +1921,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`struggling to escape the grasp of a pair of ${V.arcologies[0].FSSubjugationistRace} ${girlU}s.`);
 							hostageAction.push(`struggling to avoid giving ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU} oral.`);
 							hostageAction.push(`screaming as ${he} gets fucked by ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU}.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -1931,7 +1931,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying gently while a pair of ${V.arcologies[0].FSSubjugationistRace} ${girlU}s fondle ${him}.`);
 							hostageAction.push(`reluctantly giving ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU} oral.`);
 							hostageAction.push(`crying as ${he} gets fucked by ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU}.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -1941,7 +1941,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`fooling around with a pair of ${V.arcologies[0].FSSubjugationistRace} ${girlU}s.`);
 							hostageAction.push(`giving ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU} oral.`);
 							hostageAction.push(`panting as ${he} gets fucked by ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU}.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 40;
@@ -1960,7 +1960,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Racial Supremacism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.weight -= 5;
@@ -1971,7 +1971,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`desperately struggling in a stockade, alongside several other ${V.arcologies[0].FSSupremacistRace} slaves, while a man tries to get it in ${him}.`);
 							hostageAction.push(`struggling against ${his} bindings in a line of ${V.arcologies[0].FSSupremacistRace} slaves, having ${his} bruised holes checked.`);
 							hostageAction.push(`weeping as a dispassionate slave assayer goes down a line of ${V.arcologies[0].FSSupremacistRace} slaves, reciting prices.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.weight -= 5;
@@ -1983,7 +1983,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`meekly taking it in the cunt by a man while bound in a stockade alongside several other ${V.arcologies[0].FSSupremacistRace} girls.`);
 							hostageAction.push(`tied up with a defeated look in a line of ${V.arcologies[0].FSSupremacistRace} slaves, having ${his} stretched holes checked.`);
 							hostageAction.push(`crying as a dispassionate slave assayer goes down a line of ${V.arcologies[0].FSSupremacistRace} slaves, reciting prices.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.weight -= 5;
@@ -2000,7 +2000,7 @@ App.Events.pRivalryActions = function() {
 								hostageAction.push(`tied up with a downtrodden look in a line of ${V.arcologies[0].FSSupremacistRace} slaves, having ${his} overworked holes examined.`);
 							}
 							hostageAction.push(`silently staring at ${his} feet as a dispassionate slave assayer goes down a line of ${V.arcologies[0].FSSupremacistRace} slaves, reciting prices.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.weight -= 5;
@@ -2032,7 +2032,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Repopulation Focus":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 5;
@@ -2042,7 +2042,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`desperately trying to avoid reading the reports on pregnancy in your arcology.`);
 							hostageAction.push(`crying while gently rubbing ${his} infertile stomach.`);
 							hostageAction.push(`sobbing as an autosurgery reads out the details of ${his} infertility.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 5;
@@ -2052,7 +2052,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`carefully reading the reports on pregnancy in your arcology.`);
 							hostageAction.push(`staring at ${his} midriff, contemplating why someone would take ${his} fertility away.`);
 							hostageAction.push(`pondering the health benefits being given to ${him}.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 5;
@@ -2062,7 +2062,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`gently crying while reading the reports on pregnancy in your arcology.`);
 							hostageAction.push(`relaxing, knowing ${he} will never deal with menstruation again.`);
 							hostageAction.push(`accepting that ${his} body will never be ruined by pregnancy.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 5;
@@ -2083,7 +2083,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Eugenics":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 50;
@@ -2099,7 +2099,7 @@ App.Events.pRivalryActions = function() {
 								hostageAction.push(`weeping at the results of a pregnancy test.`);
 								hostageAction.push(`sobbing as ${he} tries to coax the cum out of ${his} womb.`);
 							}
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2116,7 +2116,7 @@ App.Events.pRivalryActions = function() {
 								hostageAction.push(`cringing at a report of the obscene number of babies stretching ${his} womb.`);
 								hostageAction.push(`crying as ${he} cradles ${his} full-sized pregnancy.`);
 							}
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2136,7 +2136,7 @@ App.Events.pRivalryActions = function() {
 								hostageAction.push(`smilingly slightly seeing ${his} many babies via ultrasound.`);
 								hostageAction.push(`doing yoga with helpers to prepare ${his} bloated body for mass childbirth.`);
 							}
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.boobs += 50;
@@ -2175,13 +2175,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Gender Radicalism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`being dragged along by ${his} owner on their rounds around their arcology.`);
 							hostageAction.push(`being forced into a pretty dress as to not embarrass ${his} owner, though ${his} tantrum will do just that.`);
 							hostageAction.push(`viciously slapping ${his} owner's hand away.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2189,7 +2189,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly following ${his} owner along on their rounds around their arcology.`);
 							hostageAction.push(`reluctantly allowing ${himself} to be dressed to present a good appearance alongside ${his} owner.`);
 							hostageAction.push(`reluctantly holding ${his} owner's hand.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2198,7 +2198,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`politely accompanying ${his} owner on their rounds around their arcology.`);
 							hostageAction.push(`allowing ${himself} to be dressed to present a good appearance alongside ${his} owner.`);
 							hostageAction.push(`holding ${his} owner's hand.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -2219,14 +2219,14 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Gender Fundamentalism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.anal += 10;
 							hostageAction.push(`struggling not to orgasm to the dick up ${his} ass.`);
 							hostageAction.push(`screaming in terror as a hot shaft slips into ${his} rectum.`);
 							hostageAction.push(`crying in the shower as ${he} attempts to soothe ${his} throbbing rectum.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2234,7 +2234,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly pleasuring a man with ${his} ass.`);
 							hostageAction.push(`groaning in discomfort as yet another dick slides into ${his} ass.`);
 							hostageAction.push(`groaning in the shower as ${he} soothes ${his} sore ass.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2248,7 +2248,7 @@ App.Events.pRivalryActions = function() {
 								hostageAction.push(`letting off a moan as a penis slides into ${his} asspussy.`);
 								hostageAction.push(`cleaning ${his} rear while fondling ${his} asspussy.`);
 							}
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.anal += 10;
@@ -2275,7 +2275,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Paternalism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.counter.oral += 50;
@@ -2289,7 +2289,7 @@ App.Events.pRivalryActions = function() {
 							}
 							hostageAction.push(`screaming as ${he} has the soles of ${his} feet whipped.`);
 							hostageAction.push(`tearfully begging someone not to cut ${him}.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.fetishStrength += 5;
@@ -2304,7 +2304,7 @@ App.Events.pRivalryActions = function() {
 							}
 							hostageAction.push(`crying out as ${his} back is lashed.`);
 							hostageAction.push(`tearfully crying on the ground after someone tripped ${him} and stole ${his} heels for the sole purpose of denying ${him} the ability to walk.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.fetishStrength += 5;
@@ -2319,7 +2319,7 @@ App.Events.pRivalryActions = function() {
 							}
 							hostageAction.push(`sobbing as ${he} is mercilessly beaten.`);
 							hostageAction.push(`panicking as ${he} attempts to mime a plea to not get cut by ${his} aggressor.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.counter.oral += 50;
@@ -2346,13 +2346,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Degradationism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`refusing to be touched by ${his} owner.`);
 							hostageAction.push(`refusing to even look at ${his} owner.`);
 							hostageAction.push(`getting mad when asked about ${his} sexual exploits.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2360,7 +2360,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly allowing ${his} owner to play with ${his} body.`);
 							hostageAction.push(`gingerly looking at ${his} owner as they approach.`);
 							hostageAction.push(`blushing and avoiding the question when asked about ${his} sexual exploits.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2368,7 +2368,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`making love with ${his} owner.`);
 							hostageAction.push(`curiously watching ${his} owner as they approach.`);
 							hostageAction.push(`blurting it out and burying ${his} face in ${his} hands when asked about ${his} sexual exploits with ${his} owner.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -2389,7 +2389,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Body Purism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.boobs += 2000;
@@ -2400,7 +2400,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying desperately to stand despite ${his} massive ${V.hostage.boobs}cc fake tits.`);
 							hostageAction.push(`crying while trying to get comfortable with ${his} ${V.hostage.boobs}cc fake tits.`);
 							hostageAction.push(`sobbing as an autosurgery reads out how much ${his} ${V.hostage.boobs}cc implants can be expanded this week.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2412,7 +2412,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly exploring ${his} new massive ${V.hostage.boobs}cc implants.`);
 							hostageAction.push(`reluctantly exploring new resting positions due to ${his} ${V.hostage.boobs}cc implants.`);
 							hostageAction.push(`crying as an autosurgery reads out how much ${his} ${V.hostage.boobs}cc implants can be expanded this week.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2424,7 +2424,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`happily playing with ${his} truly immense ${V.hostage.boobs}cc breast implants and huge butt implants.`);
 							hostageAction.push(`happily resting ${his} head on ${his} ${V.hostage.boobs}cc breast implants.`);
 							hostageAction.push(`blushing as an autosurgery reads out how much ${his} ${V.hostage.boobs}cc implants can be expanded this week.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.boobs += 1000;
@@ -2443,13 +2443,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Transformation Fetishism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`attempting to refute a report on surgical side effects in your arcology.`);
 							hostageAction.push(`refusing to believe pictures of surgeries performed in your arcology are real.`);
 							hostageAction.push(`wondering why these maniacs care if ${his} body is unaltered or not.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2457,7 +2457,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`refusing to believe a report on surgical side effects in your arcology.`);
 							hostageAction.push(`gaping in surprise at pictures of surgeries performed in your arcology.`);
 							hostageAction.push(`admiring how natural ${his} body truly is.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2465,7 +2465,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`gasping at a report on surgical side effects in your arcology.`);
 							hostageAction.push(`gasping in horror at pictures of surgeries performed in your arcology.`);
 							hostageAction.push(`beginning to understand how beautiful ${his} pure body is.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -2480,7 +2480,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Youth Preferentialism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 1;
@@ -2489,7 +2489,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`struggling to escape the grasp of a motherly ${woman2}.`);
 							hostageAction.push(`hiding from ${his} MILF partner, sobbing quietly.`);
 							hostageAction.push(`struggling to escape being mothered by ${his} older partner.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2499,7 +2499,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying gently while a ${mother2}ly ${woman2} fondles ${him}.`);
 							hostageAction.push(`cringing as ${he} massages ${his} MILF partner's back.`);
 							hostageAction.push(`cautiously tasting ${his} MILF partner's milk.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2509,7 +2509,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`resting in the arms of ${his} MILF friend.`);
 							hostageAction.push(`carefully giving ${his} MILF lover a back massage.`);
 							hostageAction.push(`carefully suckling ${his} MILF friend's nipple.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 10;
@@ -2528,7 +2528,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Maturity Preferentialism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 1;
@@ -2537,7 +2537,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`struggling to escape the grasp of an energetic young $woman2}.`);
 							hostageAction.push(`shouting profanity at ${his} young partner.`);
 							hostageAction.push(`rebuking ${his} young partner's advances.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2547,7 +2547,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying gently while a young ${woman2} eagerly fondles ${him}.`);
 							hostageAction.push(`shying away from ${his} young partner.`);
 							hostageAction.push(`curiously fondling ${his} young partner's dick.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2557,7 +2557,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying to catch a break as ${his} young friend begs to have some more fun.`);
 							hostageAction.push(`resting alongside ${his} young friend.`);
 							hostageAction.push(`cautiously rubbing ${his} energetic young friend's cock.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 10;
@@ -2576,7 +2576,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Slimness Enthusiasm":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2584,7 +2584,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying desperately to stand despite ${his} massive ${V.hostage.boobs}cc tits.`);
 							hostageAction.push(`crying over ${his} swollen breasts and butt.`);
 							hostageAction.push(`weeping as the breast injections swell ${his} breasts to ${V.hostage.boobs}ccs.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2593,7 +2593,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly exploring ${his} new massive ${V.hostage.boobs}cc tits, bigger bottom, and softer body.`);
 							hostageAction.push(`cringing as ${he} feels ${his} huge soft tits and ass.`);
 							hostageAction.push(`cringing as the breast injections swell ${his} breasts to ${V.hostage.boobs}ccs along with ${his} butt.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -2602,7 +2602,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`happily playing with ${his} truly immense ${V.hostage.boobs}cc breasts and huge butt.`);
 							hostageAction.push(`giggling as ${he} gropes ${his} soft body.`);
 							hostageAction.push(`smiling as the breast injections swell ${his} breasts to ${V.hostage.boobs}ccs. ${He} runs ${his} hand across ${his} huge butt and softening body.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2618,27 +2618,27 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Asset Expansionism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`attempting to refute a report on drug side effects in your arcology.`);
 							hostageAction.push(`refusing to believe pictures of excessively expanded slaves in your arcology are real.`);
 							hostageAction.push(`refusing to show off ${his} natural body.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
 							hostageAction.push(`refusing to believe a report on drug side effects in your arcology.`);
 							hostageAction.push(`gasping in surprise at pictures of excessively expanded slaves in your arcology.`);
 							hostageAction.push(`reluctantly doing a series of stretching exercises to show off ${his} natural body.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
 							hostageAction.push(`gasping at a report on drug side effects in your arcology.`);
 							hostageAction.push(`gasping in horror at pictures of excessively expanded slaves in your arcology.`);
 							hostageAction.push(`doing a series of stretching exercises to show off ${his} natural body.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -2653,7 +2653,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Pastoralism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -2661,7 +2661,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`angrily jogging on a treadmill, ${his} fat body and big tits jiggling constantly.`);
 							hostageAction.push(`trying to catch ${his} breath and stop ${his} fat body from sweating.`);
 							hostageAction.push(`struggling to run ${his} overweight body around a track.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -2671,7 +2671,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly doing sit-ups, ${his} plush body struggling to manage.`);
 							hostageAction.push(`checking ${himself} out in the mirror, gawking at how much weight ${he}'s lost.`);
 							hostageAction.push(`attempting to run a lap around the track despite ${his} overweight body.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -2681,7 +2681,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`lifting weights, ${his} soft body barely hiding ${his} bulging muscles.`);
 							hostageAction.push(`pinching ${his} remaining flab and making a disgusted face.`);
 							hostageAction.push(`running laps around the track to burn off ${his} excess bodyfat.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -2698,7 +2698,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Cummunism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2708,7 +2708,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying desperately to extract the milk from ${his} massive ${V.hostage.boobs}cc tits. ${He} appears to have gained some weight.`);
 							hostageAction.push(`sobbing as ${he} massages ${his} sore ${V.hostage.boobs}cc udders.`);
 							hostageAction.push(`sobbing as the milkers drain ${his} ${V.hostage.boobs}cc udders.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2719,7 +2719,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly asking for ${his} massive ${V.hostage.boobs}cc tits to be milked. ${He}'s certainly getting soft.`);
 							hostageAction.push(`crying as rubs ${his} uncomfortably massive ${V.hostage.boobs}cc udders and softening belly.`);
 							hostageAction.push(`sighing as the milkers drain ${his} big ${V.hostage.boobs}cc udders while ${he} massages ${his} softening belly.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2730,7 +2730,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`happily asking for ${his} truly immense ${V.hostage.boobs}cc breasts to be milked. ${His} body has become notably plush.`);
 							hostageAction.push(`humming as ${he} soothes ${his} truly immense sore ${V.hostage.boobs}cc udders. ${He} lets off a content sigh as ${he} jiggles ${his} soft belly.`);
 							hostageAction.push(`sighing with relief as the milkers drain ${his} huge ${V.hostage.boobs}cc udders while ${he} massages ${his} jiggly belly.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2749,7 +2749,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Physical Idealism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2758,7 +2758,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying desperately to vomit up all the food forced into ${his} bloated stomach while being thwarted by a specialized gag. ${He} appears to have gained some weight.`);
 							hostageAction.push(`sobbing as ${he} is forcibly raped and broken in.`);
 							hostageAction.push(`sobbing as ${he} is forced is experience all manner of perversion in an effort to reveal ${his} fetishes.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2818,7 +2818,7 @@ App.Events.pRivalryActions = function() {
 									hostageAction.push(`struggling to hold back ${his} joy as another huge load shoots into ${his} fertile womb.`);
 									break;
 							}
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -2878,7 +2878,7 @@ App.Events.pRivalryActions = function() {
 									hostageAction.push(`humming softly as ${he} caresses ${his} early pregnancy.`);
 									break;
 							}
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight += 5;
@@ -3004,7 +3004,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Hedonistic Decadence":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -3012,7 +3012,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`angrily jogging on a treadmill, ${his} fat body and big tits jiggling constantly.`);
 							hostageAction.push(`trying to catch ${his} breath and stop ${his} fat body from sweating.`);
 							hostageAction.push(`struggling to run ${his} overweight body around a track.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -3022,7 +3022,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly doing sit-ups, ${his} plush body struggling to manage.`);
 							hostageAction.push(`checking ${himself} out in the mirror, gawking at how much weight ${he}'s lost.`);
 							hostageAction.push(`attempting to run a lap around the track despite ${his} overweight body.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -3032,7 +3032,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`lifting weights, ${his} soft body barely hiding ${his} bulging muscles.`);
 							hostageAction.push(`pinching ${his} remaining flab and making a disgusted face.`);
 							hostageAction.push(`running laps around the track to burn off ${his} excess bodyfat.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.weight -= 5;
@@ -3049,13 +3049,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Chattel Religionism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`attempting to refute a report on what's expected of slaves as part of your new religion.`);
 							hostageAction.push(`refusing to believe a video of a religious service in your arcology is real.`);
 							hostageAction.push(`refusing to socialize with other slaves.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3063,7 +3063,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`refusing to believe a report on what's expected of slaves as part of your new religion.`);
 							hostageAction.push(`questioning the validity of a video of a religious service in your arcology.`);
 							hostageAction.push(`reluctantly spending time in ${his} arcology's cosmopolitan public spaces.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3071,7 +3071,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`gasping at a report on what's expected of slaves as part of your new religion.`);
 							hostageAction.push(`gasping at the absurdity of a video of a religious service in your arcology.`);
 							hostageAction.push(`cautiously chatting with a group of slaves in ${his} arcology's cosmopolitan public spaces.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -3086,13 +3086,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Multiculturalism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`refusing the tenets of ${his} new religion.`);
 							hostageAction.push(`refusing to pray for your arcology's salvation.`);
 							hostageAction.push(`freaking out as several men approach ${him} for sex.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3103,7 +3103,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly following the tenets of ${his} new religion.`);
 							hostageAction.push(`questioning why ${he} is made to pray for your arcology's salvation.`);
 							hostageAction.push(`crying as ${he} is forced to service three dicks at once.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3114,7 +3114,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`praying for the souls of the citizens and slaves of your arcology.`);
 							hostageAction.push(`trying to pray for your arcology's salvation.`);
 							hostageAction.push(`attempting to please the three dicks in ${him} as quickly as possible.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 50;
@@ -3135,13 +3135,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Intellectual Dependency":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`refusing to pay attention to ${his} lessons.`);
 							hostageAction.push(`refusing to act like a proper ${girl}.`);
 							hostageAction.push(`forced into remedial training after threatening ${his} owner's reputation.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3157,7 +3157,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying silently while being positioned to properly please ${his} partner.`);
 							hostageAction.push(`reluctantly balancing a book on ${his} head to perfect ${his} posture.`);
 							hostageAction.push(`reluctantly practicing enunciation to not risk angering ${his} owner.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3173,7 +3173,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`attempting to pass an exam on sexual satisfaction.`);
 							hostageAction.push(`trying to show no reaction as ${he} is felt up by ${his} owner's client.`);
 							hostageAction.push(`attempting to please ${his} owner's friends and not be a failure.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 10;
@@ -3198,7 +3198,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Slave Professionalism":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.counter.vaginal += 10;
@@ -3210,7 +3210,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`sobbing as ${he} struggles to not masturbate after a large hit of aphrodisiacs.`);
 							hostageAction.push(`holding ${his} head and struggling to recite ${his} favorite poem.`);
 							hostageAction.push(`refusing to put on the makeup presented to ${him}.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.fetishStrength += 5;
@@ -3225,7 +3225,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying as ${he} rides a dick to orgasm.`);
 							hostageAction.push(`trying not to lose the memories of ${his} life before being captured.`);
 							hostageAction.push(`hesitantly trying on clothes and admiring ${his} figure in the mirror.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.fetishStrength += 5;
@@ -3240,7 +3240,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`being presented with a selection of amusements and instead opting for the one between ${hisU} legs.`);
 							hostageAction.push(`walking around with ${his} breasts bouncing out of ${his} top and ${his} short skirt revealing ${his} lack of panties.`);
 							hostageAction.push(`admiring ${himself} in the mirror.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust += 5;
 							V.hostage.devotion += 5;
 							V.hostage.intelligenceImplant = Math.clamp(V.hostage.intelligenceImplant - 5, 0, 30);
@@ -3286,7 +3286,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Petite Admiration":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 1;
@@ -3295,7 +3295,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`struggling in vain as ${he} is carried around by ${his} towering partner.`);
 							hostageAction.push(`crammed under a bed to escape ${his} much larger partner.`);
 							hostageAction.push(`struggling to pull ${his} head away from ${his} much larger partner's crotch.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3305,7 +3305,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying to ${himself} in the arms of ${his} towering partner as ${he} is carried around one of the arcology's public spaces.`);
 							hostageAction.push(`cringing as ${his} much larger partner sits ${him} in ${his2} lap and paws at ${him}.`);
 							hostageAction.push(`crying gently as ${his} much larger partner forces ${his} face to ${his2} crotch.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3315,7 +3315,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`calmly letting ${his} towering partner carry ${him} around one of the arcology's public spaces.`);
 							hostageAction.push(`carefully sitting in ${his} much larger partner's lap and letting ${him2} fondle ${his} body.`);
 							hostageAction.push(`carefully putting ${his} mouth to use on ${his} much larger partner's crotch.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 15;
@@ -3334,7 +3334,7 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					case "Statuesque Glorification":
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 1;
@@ -3343,7 +3343,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`sitting on a table, out of reach of a shorter ${woman2} and swearing at ${him2}.`);
 							hostageAction.push(`keeping ${his} smaller partner from reaching ${him}.`);
 							hostageAction.push(`rebuking ${his} smaller partner's advances.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3353,7 +3353,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`crying gently as a shorter ${woman2} eagerly fondles ${him}.`);
 							hostageAction.push(`shying away from ${his} shorter partner.`);
 							hostageAction.push(`curiously exploring ${his} shorter partner's body.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3363,7 +3363,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`trying to catch a break from ${his} shorter partner's tongue in ${his} pussy.`);
 							hostageAction.push(`spooning ${his} shorter partner.`);
 							hostageAction.push(`cautiously giving ${his} shorter partner a full body massage.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.oral += 7;
@@ -3382,13 +3382,13 @@ App.Events.pRivalryActions = function() {
 						}
 						break;
 					default:
-						if (V.rivalryDuration <= 5) {
+						if (V.rival.duration <= 5) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							hostageAction.push(`refusing to believe what happens to slaves who don't fit into your arcology's revivalist culture.`);
 							hostageAction.push(`refusing to believe a video of your arcology's revivalist public events is real.`);
 							hostageAction.push(`refusing to socialize with other slaves.`);
-						} else if (V.rivalryDuration <= 10) {
+						} else if (V.rival.duration <= 10) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3396,7 +3396,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`reluctantly reading a report on what happens to slaves who don't fit into your arcology's revivalist culture.`);
 							hostageAction.push(`questioning the validity of a video of your arcology's revivalist public events.`);
 							hostageAction.push(`reluctantly spending time in ${his} arcology's modern public spaces.`);
-						} else if (V.rivalryDuration <= 15) {
+						} else if (V.rival.duration <= 15) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.fetishStrength += 5;
@@ -3404,7 +3404,7 @@ App.Events.pRivalryActions = function() {
 							hostageAction.push(`gasping at a report on what happens to slaves who don't fit into your arcology's revivalist culture.`);
 							hostageAction.push(`gasping at the absurdity of a video of your arcology's revivalist public events.`);
 							hostageAction.push(`cautiously chatting with a group of slaves in ${his} arcology's modern public spaces.`);
-						} else if (V.rivalryDuration <= 20) {
+						} else if (V.rival.duration <= 20) {
 							V.hostage.trust -= 5;
 							V.hostage.devotion -= 5;
 							V.hostage.counter.vaginal += 1;
@@ -3424,18 +3424,18 @@ App.Events.pRivalryActions = function() {
 
 		App.Events.addParagraph(node, r);
 
-		App.UI.DOM.appendNewElement("p", node, `You remind yourself that success in this conflict will not be defined by the traditional measures of impending victory and defeat. The primary concern here is the weight of your holdings against those of your opponent. Improving your arcology's prosperity will move you closer to victory${(V.rivalSet === 1) ? `, and so will attacking the prosperity of your rival's neighboring arcology through economic means` : ``}. Of course, you can also take more direct action.`);
+		App.UI.DOM.appendNewElement("p", node, `You remind yourself that success in this conflict will not be defined by the traditional measures of impending victory and defeat. The primary concern here is the weight of your holdings against those of your opponent. Improving your arcology's prosperity will move you closer to victory${V.rival.state === 2 ? `, and so will attacking the prosperity of your rival's neighboring arcology through economic means` : ``}. Of course, you can also take more direct action.`);
 
 		r = [];
 
 		r.push(`${capFirstChar(V.assistant.name)} collates several options for directly attacking your rival. This is a corporate war, not a military one; your peers would not tolerate a direct attack on ${himR}. You must bankrupt your opponent so they are no longer able to hide within the physical and intangible fortress that is their arcology. Your rival`);
-		if ((V.rivalOwner - V.rivalryPower) / V.arcologies[0].prosperity < 0.6) {
+		if ((V.rival.prosperity - V.rival.power) / V.arcologies[0].prosperity < 0.6) {
 			r.push(`is on their economic knees, putting them on the verge of defeat.`);
-		} else if ((V.rivalOwner - V.rivalryPower) / V.arcologies[0].prosperity < 0.7) {
+		} else if ((V.rival.prosperity - V.rival.power) / V.arcologies[0].prosperity < 0.7) {
 			r.push(`is in a bad financial state, well on the way to final dissolution and defeat.`);
-		} else if ((V.rivalOwner - V.rivalryPower) / V.arcologies[0].prosperity < 0.8) {
+		} else if ((V.rival.prosperity - V.rival.power) / V.arcologies[0].prosperity < 0.8) {
 			r.push(`has taken some hard corporate blows but is still standing.`);
-		} else if ((V.rivalOwner - V.rivalryPower) / V.arcologies[0].prosperity < 0.9) {
+		} else if ((V.rival.prosperity - V.rival.power) / V.arcologies[0].prosperity < 0.9) {
 			r.push(`is starting to feel the pressure.`);
 		} else {
 			r.push(`is essentially undamaged; you have hard work ahead of you.`);
@@ -3449,10 +3449,10 @@ App.Events.pRivalryActions = function() {
 			() => {
 				cashX(-10000, "war");
 				if (random(1, 100) > 50) {
-					V.rivalryPower += 2;
+					V.rival.power += 2;
 					jQuery(result).empty().append(`Money is your infantry, your weapon, your ammunition in one. Last century, your soldiers would have died taking the enemy's positions. Today, your ¤ die <span class="positive">taking</span> ${hisR} holdings. Once more unto the breach.`);
 				} else {
-					V.rivalryPower += 1;
+					V.rival.power++;
 					jQuery(result).empty().append(`Money is your infantry, your weapon, your ammunition in one. Last century, your soldiers would have died before the enemy's machine guns. Today, your ¤ die <span class="red">failing to take</span> ${hisR} holdings. Once more unto the breach.`);
 				}
 			}
@@ -3464,11 +3464,11 @@ App.Events.pRivalryActions = function() {
 				cashX(-10000, "war");
 				if (random(1, 100) > 70) {
 					repX(-100, "war");
-					V.rivalryPower += 5;
+					V.rival.power += 5;
 					jQuery(result).empty().append(`Since you are not so uncouth as to, for example, help fund a coup attempt, you fund traditional acts of corporate sabotage, including hacking, slander, and actual, physical thievery. There are some <span class="reputation dec">minor rumors</span> that you are to blame, but they're outweighed by the <span class="positive">great pressure</span> these incidents put on your enemy.`);
 				} else {
 					repX(-500, "war");
-					V.rivalryPower += 2;
+					V.rival.power += 2;
 					jQuery(result).empty().append(`Since you are not so uncouth as to, for example, help fund a coup attempt, you fund traditional acts of corporate sabotage, including hacking, slander, and actual, physical thievery. Unfortunately, you seem to be a step behind this week. Your enemy <span class="red">prevents</span> many of your attacks, and even manages to turn a few minor players into public confessions that <span class="reputation dec">damage</span> your reputation.`);
 				}
 			}
@@ -3477,7 +3477,7 @@ App.Events.pRivalryActions = function() {
 			`Use ${cashFormat(25000)} creating local shortages`,
 			() => {
 				cashX(-25000, "war");
-				V.rivalryPower += 3;
+				V.rival.power += 3;
 				jQuery(result).empty().append(`With enough money, it's entirely possible to temporarily overwhelm even the advanced free market of the Free Cities. You choose a few critical items — pharmaceutical materials, electronic components, and other physical items — and purchase shipments intended for your rival's arcology. ${HisR} tenants are <span class="positive">seriously inconvenienced</span> and blame their difficulties on their hapless landlord.`);
 			}
 		));
@@ -3486,7 +3486,7 @@ App.Events.pRivalryActions = function() {
 			`Devote ${cashFormat(50000)} to purchasing the support of your peers`,
 			() => {
 				cashX(-50000, "war");
-				V.rivalryPower += 5;
+				V.rival.power += 5;
 				jQuery(result).empty().append(`Your fellow arcology owners have an interest in seeing the funder of the Daughters' attempt on you destroyed, but few of them are willing to spend any money or real effort on the matter. You do a few of them the favor of making the money and effort spent yours. Your rival finds ${hisR} dealings with your mutual peers becoming <span class="positive">strangely difficult.</span> Market opinion is swinging your way.`);
 			}
 		));
@@ -3495,7 +3495,7 @@ App.Events.pRivalryActions = function() {
 				const link = App.UI.DOM.appendNewElement("div", result, App.UI.DOM.link(
 					`Use your connections to throttle your rival's arcology`,
 					() => {
-						V.rivalryPower += 10;
+						V.rival.power += 10;
 						jQuery(result).empty().append(`With every external, and several internal, supply lines severed, ${hisR} tenants are faced with imminent destruction and <span class="positive">rise up</span> against their hapless landlord. ${HeR} will not be able to weather such a siege for long.`);
 					}
 				));
@@ -3510,9 +3510,9 @@ App.Events.pRivalryActions = function() {
 						const el = new DocumentFragment();
 						const r = [];
 						r.push(`One night, you're working late in your office, ${V.assistant.name}'s avatar glowing companionably beside you. Without preamble, ${heA} reports to you in ${hisA} normal tones, "Team One reports ${nickname()} EKIA. Confirm, E. K. I. A. No other casualties, team exfiltrating."`);
-						V.rivalOwner = 0;
-						V.rivalryPower = 0;
-						if (V.rivalSet !== 0) {
+						V.rival.prosperity = 0;
+						V.rival.power = 0;
+						if (V.rival.state === 2) {
 							for (const arc of V.arcologies) {
 								if (arc.rival === 1) {
 									arc.embargo = 0;
@@ -3524,6 +3524,7 @@ App.Events.pRivalryActions = function() {
 								}
 							}
 						}
+						V.rival.state = 4;
 						if (V.hostageAnnounced === 1) {
 							r.push(`${V.assistant.name} pauses. "Also confirm package is secure."`);
 							V.hostageRescued = 1;
@@ -3552,9 +3553,9 @@ App.Events.pRivalryActions = function() {
 							r.push(`EKIA. Confirm, E. K. I. A. No other`);
 						}
 						r.push(`casualties, team exfiltrating."`);
-						V.rivalOwner = 0;
-						V.rivalryPower = 0;
-						if (V.rivalSet !== 0) {
+						V.rival.prosperity = 0;
+						V.rival.power = 0;
+						if (V.rival.state === 2) {
 							for (const arc of V.arcologies) {
 								if (arc.rival === 1) {
 									arc.embargo = 0;
@@ -3562,15 +3563,21 @@ App.Events.pRivalryActions = function() {
 									arc.influenceTarget = -1;
 									arc.rival = 0;
 									arc.government = "direct democracy";
-									if (rivalCaptured && arc.FSSupremacist > 20) {
-										V.rivalRace = arc.FSSupremacistRace;
-									} else if (rivalCaptured && arc.FSSubjugationist > 20) {
-										V.rivalRace = Array.from(App.Data.misc.filterRacesPublic.keys()).filter(race => race !== arc.FSSubjugationistRace).random();
+									if (rivalCaptured) {
+										V.rival.state = 3;
+										if (arc.FSSupremacist > 20) {
+											V.rival.race = arc.FSSupremacistRace;
+										} else if (arc.FSSubjugationist > 20) {
+											V.rival.race = Array.from(App.Data.misc.filterRacesPublic.keys()).filter(race => race !== arc.FSSubjugationistRace).random();
+										}
 									}
 									break;
 								}
 							}
 						}
+						if (!rivalCaptured) {
+							V.rival.state = 4;
+						}
 						if (V.hostageAnnounced === 1) {
 							r.push(`${V.assistant.name} pauses. "Also confirm package is secure."`);
 							V.hostageRescued = 1;
@@ -3593,7 +3600,7 @@ App.Events.pRivalryActions = function() {
 		}
 		return node;
 		function nickname() {
-			switch (V.rivalryFS) {
+			switch (V.rival.FS.name) {
 				case "Racial Subjugationism":
 					return `Racemixer`;
 				case "Racial Supremacism":
diff --git a/src/events/nonRandom/rival/pRivalryCapture.js b/src/events/nonRandom/rival/pRivalryCapture.js
index b9df8079739..1dff371f2e3 100644
--- a/src/events/nonRandom/rival/pRivalryCapture.js
+++ b/src/events/nonRandom/rival/pRivalryCapture.js
@@ -5,9 +5,10 @@ globalThis.pRivalryCapture = function(condition) {
 	const slave = createRival();
 	const {his, he, him, He} = getPronouns(slave);
 	let r = [];
-	V.rivalOwner = -1;
-	V.rivalRace = 0;
-	V.rivalGender = 0;
+	V.rival.state = 3; // trigger P Rival Initiation
+	V.rival.prosperity = 0;
+	V.rival.power = 0;
+	delete V.rival.gender;
 
 	App.Events.drawEventArt(el, slave);
 
@@ -60,7 +61,7 @@ globalThis.pRivalryCapture = function(condition) {
 	}
 	el.append(r.join(" "));
 
-	V.rivalID = slave.ID; // trigger P Rival Initiation
+	V.rival.ID = slave.ID;
 	el.append(App.UI.newSlaveIntro(slave));
 
 	return el;
@@ -76,7 +77,7 @@ globalThis.pRivalryCapture = function(condition) {
 		let minAge;
 		let maxAge;
 		let pedo;
-		if (V.rivalGender === 2) {
+		if (V.rival.gender === 2) {
 			rivalTypeArray.push("expansionist shemale");
 			rivalTypeArray.push("masculine");
 			rivalTypeArray.push("micropenis");
@@ -98,8 +99,8 @@ globalThis.pRivalryCapture = function(condition) {
 		}
 		rivalType = rivalTypeArray.random();
 
-		if (V.rivalRace && App.Data.misc.filterRacesPublic.has(V.rivalRace)) {
-			race = V.rivalRace;
+		if (V.rival.race && App.Data.misc.filterRacesPublic.has(V.rival.race)) {
+			race = V.rival.race;
 		}
 		switch (rivalType) {
 			case "expansionist shemale":
diff --git a/src/events/nonRandom/rival/pRivalryDispatch.js b/src/events/nonRandom/rival/pRivalryDispatch.js
index a5711c58776..929511327de 100644
--- a/src/events/nonRandom/rival/pRivalryDispatch.js
+++ b/src/events/nonRandom/rival/pRivalryDispatch.js
@@ -2,19 +2,19 @@ App.Events.PRivalryDispatch = class PRivalryDispatch extends App.Events.BaseEven
 	eventPrerequisites() {
 		return [
 			() => V.plot > 0,
-			() => V.rivalOwner > 0,
+			() => V.rival.prosperity > 0,
 			() => (V.eventResults.rivalActionWeek || 0) < V.week
 		];
 	}
 
 	execute(node) {
-		if (V.hostageAnnounced === 0 && V.rivalSet !== 0) {
+		if (V.hostageAnnounced === 0 && V.rival.state === 2) {
 			V.eventResults.rivalActionWeek = V.week; // that's all for this week
 			node.append(App.Events.pRivalryHostage());
-		} else if ((V.rivalOwner - V.rivalryPower + 10) / V.arcologies[0].prosperity < 0.5) {
+		} else if ((V.rival.prosperity - V.rival.power + 10) / V.arcologies[0].prosperity < 0.5) {
 			V.eventResults.rivalActionWeek = V.week; // that's all for this week
 			node.append(App.Events.pRivalryVictory());
-		} else if (V.peacekeepers.state === 2 && V.peacekeepers.attitude > 5 && V.rivalryDuration > 1 && !V.eventResults.peacekeeperHelp) {
+		} else if (V.peacekeepers.state === 2 && V.peacekeepers.attitude > 5 && V.rival.duration > 1 && !V.eventResults.peacekeeperHelp) {
 			// can fire this event again to trigger victory or rival actions in the same week
 			node.append(App.Events.PRivalryPeacekeepers());
 		} else {
diff --git a/src/events/nonRandom/rival/pRivalryHostage.js b/src/events/nonRandom/rival/pRivalryHostage.js
index 96768bcce2d..d277755a8b5 100644
--- a/src/events/nonRandom/rival/pRivalryHostage.js
+++ b/src/events/nonRandom/rival/pRivalryHostage.js
@@ -7,7 +7,7 @@ App.Events.pRivalryHostage = function() {
 		V.hostage = createHostage();
 		App.Events.drawEventArt(node, V.hostage);
 
-		switch (V.rivalryFS) {
+		switch (V.rival.FS.name) {
 			case "Maturity Preferentialism":
 			case "Petite Admiration":
 			case "Statuesque Glorification":
@@ -22,7 +22,7 @@ App.Events.pRivalryHostage = function() {
 		const {
 			HeR,
 			heR, hisR
-		} = getPronouns({pronoun: (V.rivalGender === 2) ? 1 : 0}).appendSuffix("R");
+		} = getPronouns({pronoun: (V.rival.gender === 2) ? 1 : 0}).appendSuffix("R");
 		const {girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
 		const {womanP, girlP} = getPronouns(V.PC).appendSuffix("P");
 		const {woman2, girl2, he2, his2} = getPronouns(V.hostageWife || {pronoun : 0}).appendSuffix("2");
@@ -237,7 +237,7 @@ App.Events.pRivalryHostage = function() {
 		r = [];
 
 		r.push(`"Hello, ${PlayerName()}," your rival sneers. "Sorry to pull you away from`);
-		switch (V.rivalryFS) {
+		switch (V.rival.FS.name) {
 			case "Racial Subjugationism":
 				r.push(`whipping some poor ${V.arcologies[0].FSSubjugationistRace} ${girlU}'s back bloody,`);
 				break;
@@ -329,7 +329,7 @@ App.Events.pRivalryHostage = function() {
 				r.push(`whatever it is you do with your spare time,`);
 		}
 		r.push(`but look what I have here! I just acquired ${him} recently. Lovely, isn't ${he}? I know ${he} wasn't important to you, but ${he} <em>is</em> a reminder of who you were. I think ${he} must have been your type." Your rival turns to the slave and continues. "While we have our little war,`);
-		switch (V.rivalryFS) {
+		switch (V.rival.FS.name) {
 			case "Racial Subjugationism":
 				r.push(`I'm going to treat ${him} well. Train ${him}. ${He}'s a fine Head Girl prospect, don't you think? ${He}'ll have lots of nice ${V.arcologies[0].FSSubjugationistRace} girls to make love to whenever ${he} wants. Isn't that right, ${SlaveFullName(V.hostage)}?" The slave nods uncertainly.`);
 				break;
@@ -412,7 +412,7 @@ App.Events.pRivalryHostage = function() {
 				break;
 			default:
 				r.push(`${he}'s shaping up to be a good slave. I'm keeping ${him} informed of your`);
-				if (V.rivalryFS !== 0) {
+				if (V.rival.FS.name !== "") {
 					r.push(`revisionist`);
 				}
 				r.push(`nonsense, and what your slaves suffer because of it. Isn't that right, ${SlaveFullName(V.hostage)}?" The slave nods uncertainly.`);
@@ -774,7 +774,7 @@ App.Events.pRivalryHostage = function() {
 			slave.pubertyXX = 1;
 			resyncSlaveHight(slave);
 
-			switch (V.rivalryFS) {
+			switch (V.rival.FS.name) {
 				case "Repopulation Focus":
 					slave.preg = -3;
 					break;
diff --git a/src/events/nonRandom/rival/pRivalryPeacekeepers.js b/src/events/nonRandom/rival/pRivalryPeacekeepers.js
index 4be9cf0159f..e05e8975487 100644
--- a/src/events/nonRandom/rival/pRivalryPeacekeepers.js
+++ b/src/events/nonRandom/rival/pRivalryPeacekeepers.js
@@ -20,7 +20,7 @@ App.Events.PRivalryPeacekeepers = (function() {
 		function yes() {
 			V.eventResults.peacekeeperHelp = 1;
 			V.peacekeepers.attitude = 5;
-			V.rivalryPower += 10;
+			V.rival.power += 10;
 			return `You thank him for the offer, and agree. He nods and ends the call, noting that he now has a short-fuse operation to lie on. You didn't pay him or give him anything of value, but it would be childish to assume that the progress that will be made tonight in your ongoing struggle to overthrow your rival was free. The general now considers all or almost all of your accumulated influence with him to be discharged. That said, his reluctance to do business with the Free Cities seems to have diminished markedly.`;
 		}
 
diff --git a/src/events/nonRandom/rival/pRivalryVictory.js b/src/events/nonRandom/rival/pRivalryVictory.js
index 07e132b6172..a704464df90 100644
--- a/src/events/nonRandom/rival/pRivalryVictory.js
+++ b/src/events/nonRandom/rival/pRivalryVictory.js
@@ -6,11 +6,10 @@ App.Events.pRivalryVictory = function() {
 		const {
 			HisR, HeR,
 			hisR, heR
-		} = getPronouns({pronoun: (V.rivalGender === 2) ? 1 : 0}).appendSuffix("R");
+		} = getPronouns({pronoun: (V.rival.gender === 2) ? 1 : 0}).appendSuffix("R");
 		V.nextButton = " "; // hide button until user makes a selection
-		V.rivalOwner = 0;
-		V.rivalryPower = 0;
-		V.rivalRace = 0;
+		V.rival.prosperity = 0;
+		V.rival.power = 0;
 		const rivalArc = V.arcologies.find(a => a.rival === 1);
 
 		App.Events.addParagraph(node, [`For the first time, you receive a direct call from your rival. You pictured the moment as feeling grander than this, sitting at your desk as usual looking into ${hisR} downcast face. You're the victor in a new form of warfare in which bankruptcy has replaced surrender. If the world survives in its present state, you may one day be remembered as an innovator in the evolution of (nearly) bloodless war. Today, your reputation has <span class="green">greatly improved.</span> But today all you have that's tangible is a view of a still-dignified arcology owner, self-possessed despite the situation.`]);
@@ -26,7 +25,7 @@ App.Events.pRivalryVictory = function() {
 				const r = [];
 				unlockContinue();
 				r.push(`You accept, magnanimous in victory. "I don't think I would have done that," your rival replies. "Thank you. When they write the book, I'll make sure you look good."`);
-				if (V.rivalSet !== 0) {
+				if (V.rival.state === 2) {
 					r.push(`${HisR} remaining liquid assets will go to satisfy ${hisR} great debts, but ${hisR} <span class="yellowgreen">arcology holdings are yours.</span>`);
 					if (rivalArc) {
 						updateArc();
@@ -52,7 +51,7 @@ App.Events.pRivalryVictory = function() {
 				const r = [];
 				unlockContinue();
 				r.push(`You coldly decline. "That was a mistake," your rival replies, entering a computer command.`);
-				if (V.rivalSet !== 0) {
+				if (V.rival.state === 2) {
 					r.push(`"All my remaining liquid assets have just been <span class="red">carefully dispersed to deny you control of my arcology.</span> You'll get nothing from me." It's true. The financial self-destruction ensures that the fiscal wreckage goes to the arcology's citizens, not you.`);
 					if (rivalArc) {
 						updateArc();
@@ -68,7 +67,7 @@ App.Events.pRivalryVictory = function() {
 				jQuery(result).empty().append(el);
 			}
 		));
-		if (V.rivalryDuration >= 30 && V.hostageAnnounced === 0 && V.rivalSet !== 0) {
+		if (V.rival.duration >= 30 && V.hostageAnnounced === 0 && V.rival.state === 2) {
 			App.UI.DOM.appendNewElement("div", result, App.UI.DOM.link(
 				`Refuse, and place a bounty of ${cashFormat(50000)} on your rival's death`,
 				() => {
@@ -95,14 +94,14 @@ App.Events.pRivalryVictory = function() {
 				const r = [];
 				unlockContinue();
 				r.push(`You coldly decline. "That was a mistake," your rival replies, entering a computer command.`);
-				if (V.rivalSet !== 0) {
+				if (V.rival.state === 2) {
 					r.push(`"All my remaining liquid assets have just been <span class="red">carefully dispersed to deny you control of my arcology.</span> You'll get nothing from me." It's true. The financial self-destruction ensures that the fiscal wreckage goes to the arcology's citizens, not you.`);
 					if (rivalArc) {
 						updateArc();
 						if (rivalArc.FSSupremacist > 20) {
-							V.rivalRace = rivalArc.FSSupremacistRace;
+							V.rival.race = rivalArc.FSSupremacistRace;
 						} else if (rivalArc.FSSubjugationist > 20) {
-							V.rivalRace = Array.from(App.Data.misc.filterRacesPublic.keys()).filter(race => race !== rivalArc.FSSubjugationistRace).random();
+							V.rival.race = Array.from(App.Data.misc.filterRacesPublic.keys()).filter(race => race !== rivalArc.FSSubjugationistRace).random();
 						}
 					}
 					if (V.hostageAnnounced === 1) {
diff --git a/src/events/scheduled/seFCNNstation.js b/src/events/scheduled/seFCNNstation.js
index 41c9f465455..8f87cfd72c7 100644
--- a/src/events/scheduled/seFCNNstation.js
+++ b/src/events/scheduled/seFCNNstation.js
@@ -1,7 +1,7 @@
 App.Events.SEFcnnStation = class SEFcnnStation extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rivalOwner === 0,
+			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.seeFCNN === 1,
 			() => V.FCNNstation === 0,
 			() => V.week > 95,
diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js
index 86cb4b40626..a43f65ae91f 100644
--- a/src/futureSocieties/fsPassage.js
+++ b/src/futureSocieties/fsPassage.js
@@ -38,84 +38,84 @@ App.UI.fsPassage = function() {
 	 * FIRST FS STORING FOR RIVALRY
 	 */
 	function setup() {
-		if (V.rivalryFS === 0) {
+		if (V.rival.FS.name === "") {
 			if (arc.FSSubjugationist !== "unset") {
-				V.rivalryFS = "Racial Subjugationism";
-				V.rivalryFSRace = arc.FSSubjugationistRace;
+				V.rival.FS.name = "Racial Subjugationism";
+				V.rival.FS.race = arc.FSSubjugationistRace;
 			}
 			if (arc.FSSupremacist !== "unset") {
-				V.rivalryFS = "Racial Supremacism";
-				V.rivalryFSRace = arc.FSSupremacistRace;
+				V.rival.FS.name = "Racial Supremacism";
+				V.rival.FS.race = arc.FSSupremacistRace;
 			}
 			if (arc.FSGenderRadicalist !== "unset") {
-				V.rivalryFS = "Gender Radicalism";
+				V.rival.FS.name = "Gender Radicalism";
 			} else if (arc.FSGenderFundamentalist !== "unset") {
-				V.rivalryFS = "Gender Fundamentalism";
+				V.rival.FS.name = "Gender Fundamentalism";
 			}
 			if (arc.FSRepopulationFocus !== "unset") {
-				V.rivalryFS = "Repopulation Focus";
+				V.rival.FS.name = "Repopulation Focus";
 			} else if (arc.FSRestart !== "unset") {
-				V.rivalryFS = "Eugenics";
+				V.rival.FS.name = "Eugenics";
 			}
 			if (arc.FSPaternalist !== "unset") {
-				V.rivalryFS = "Paternalism";
+				V.rival.FS.name = "Paternalism";
 			} else if (arc.FSDegradationist !== "unset") {
-				V.rivalryFS = "Degradationism";
+				V.rival.FS.name = "Degradationism";
 			}
 			if (arc.FSBodyPurist !== "unset") {
-				V.rivalryFS = "Body Purism";
+				V.rival.FS.name = "Body Purism";
 			} else if (arc.FSTransformationFetishist !== "unset") {
-				V.rivalryFS = "Transformation Fetishism";
+				V.rival.FS.name = "Transformation Fetishism";
 			}
 			if (arc.FSYouthPreferentialist !== "unset") {
-				V.rivalryFS = "Youth Preferentialism";
+				V.rival.FS.name = "Youth Preferentialism";
 			} else if (arc.FSMaturityPreferentialist !== "unset") {
-				V.rivalryFS = "Maturity Preferentialism";
+				V.rival.FS.name = "Maturity Preferentialism";
 			}
 			if (arc.FSSlimnessEnthusiast !== "unset") {
-				V.rivalryFS = "Slimness Enthusiasm";
+				V.rival.FS.name = "Slimness Enthusiasm";
 			} else if (arc.FSAssetExpansionist !== "unset") {
-				V.rivalryFS = "Asset Expansionism";
+				V.rival.FS.name = "Asset Expansionism";
 			}
 			if (arc.FSPastoralist !== "unset") {
-				V.rivalryFS = "Pastoralism";
+				V.rival.FS.name = "Pastoralism";
 			} else if (arc.FSCummunism !== "unset") {
-				V.rivalryFS = "Cummunism";
+				V.rival.FS.name = "Cummunism";
 			}
 			if (arc.FSHedonisticDecadence !== "unset") {
-				V.rivalryFS = "Hedonistic Decadence";
+				V.rival.FS.name = "Hedonistic Decadence";
 			} else if (arc.FSPhysicalIdealist !== "unset") {
-				V.rivalryFS = "Physical Idealism";
+				V.rival.FS.name = "Physical Idealism";
 			}
 			if (arc.FSIntellectualDependency !== "unset") {
-				V.rivalryFS = "Intellectual Dependency";
+				V.rival.FS.name = "Intellectual Dependency";
 			} else if (arc.FSSlaveProfessionalism !== "unset") {
-				V.rivalryFS = "Slave Professionalism";
+				V.rival.FS.name = "Slave Professionalism";
 			}
 			if (arc.FSPetiteAdmiration !== "unset") {
-				V.rivalryFS = "Petite Admiration";
+				V.rival.FS.name = "Petite Admiration";
 			} else if (arc.FSStatuesqueGlorification !== "unset") {
-				V.rivalryFS = "Statuesque Glorification";
+				V.rival.FS.name = "Statuesque Glorification";
 			}
 			if (arc.FSChattelReligionist !== "unset") {
-				V.rivalryFS = "Chattel Religionism";
+				V.rival.FS.name = "Chattel Religionism";
 			} else if (arc.FSNull !== "unset") {
-				V.rivalryFS = "Multiculturalism";
+				V.rival.FS.name = "Multiculturalism";
 			}
 			if (arc.FSRomanRevivalist !== "unset") {
-				V.rivalryFS = "Roman Revivalism";
+				V.rival.FS.name = "Roman Revivalism";
 			} else if (arc.FSNeoImperialist !== "unset") {
-				V.rivalryFS = "Neo-Imperialism";
+				V.rival.FS.name = "Neo-Imperialism";
 			} else if (arc.FSAztecRevivalist !== "unset") {
-				V.rivalryFS = "Aztec Revivalism";
+				V.rival.FS.name = "Aztec Revivalism";
 			} else if (arc.FSEgyptianRevivalist !== "unset") {
-				V.rivalryFS = "Egyptian Revivalism";
+				V.rival.FS.name = "Egyptian Revivalism";
 			} else if (arc.FSEdoRevivalist !== "unset") {
-				V.rivalryFS = "Edo Revivalism";
+				V.rival.FS.name = "Edo Revivalism";
 			} else if (arc.FSArabianRevivalist !== "unset") {
-				V.rivalryFS = "Arabian Revivalism";
+				V.rival.FS.name = "Arabian Revivalism";
 			} else if (arc.FSChineseRevivalist !== "unset") {
-				V.rivalryFS = "Chinese Revivalism";
+				V.rival.FS.name = "Chinese Revivalism";
 			}
 		}
 	}
-- 
GitLab