From 089aaa9f365eea8fc07ed40069c78daa04bc933a Mon Sep 17 00:00:00 2001
From: ezsh <ezsh.junk@gmail.com>
Date: Sat, 22 Feb 2020 13:59:57 +0100
Subject: [PATCH] Add pregnancy termination based on race to RA

---
 devTools/FC.d.ts                |   2 +-
 src/js/DefaultRules.js          | 164 ++++++++++++++++++--------------
 src/js/datatypeCleanupJS.js     |   3 +
 src/js/rulesAssistantOptions.js |  14 ++-
 4 files changed, 105 insertions(+), 78 deletions(-)

diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index f1186870e85..19c0f79fbcc 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -199,7 +199,7 @@ declare namespace App {
 			XX: number;
 			gelding: number;
 			preg: boolean;
-			abortion: string;
+			abortion: string[];
 			growth: RuleGrowthSetters;
 			hyper_drugs: number;
 			aphrodisiacs: number;
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 1f1636d69e2..d50b1b87a63 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1024,89 +1024,107 @@ window.DefaultRules = (function() {
 	 */
 	function ProcessAbortions(slave, rule) {
 		if ((rule.abortion !== undefined) && (rule.abortion !== null)) {
-			if (rule.abortion === "all") {
-				if (slave.preg < 4 || (slave.fetish === "mindbroken" || slave.fuckdoll !== 0)) {
-					r += `<br>${slave.slaveName}'s pregnancy has been terminated.`;
-				} else {
-					r += `<br>${slave.slaveName}'s pregnancy has been terminated; `;
-					if (slave.sexualFlaw === "breeder") {
-						r += `it broke ${his} mind.`;
-						slave.fetish = "mindbroken";
-						slave.behavioralQuirk = "none";
-						slave.behavioralFlaw = "none";
-						slave.sexualQuirk = "none";
-						slave.sexualFlaw = "none";
-						slave.devotion = 0;
-						slave.trust = 0;
-					} else if (slave.devotion < -50) {
-						r += `${he} did not handle it well.`;
-						slave.trust -= 10;
-						slave.devotion -= 25;
-					} else if (slave.devotion < -20) {
-						r += `${he} did not handle it well.`;
-						slave.trust -= 10;
-						slave.devotion -= 10;
-					} else if (slave.fetish === "pregnancy") {
-						r += `${he} did not handle it well.`;
-						let fetishModifier = slave.fetishStrength / 2;
-						slave.devotion -= fetishModifier;
-						slave.trust -= fetishModifier;
-					} else if (slave.devotion <= 20) {
-						r += `${he} did not handle it well.`;
-						slave.trust -= 10;
-						slave.devotion -= 5;
-					} else if (slave.devotion <= 50) {
-						r += `${he} did not handle it well.`;
-						slave.trust -= 10;
+			for (const ar of rule.abortion) {
+				if (ar === "all") {
+					if (slave.preg < 4 || (slave.fetish === "mindbroken" || slave.fuckdoll !== 0)) {
+						r += `<br>${slave.slaveName}'s pregnancy has been terminated.`;
 					} else {
-						r += "it had little mental effect.";
+						r += `<br>${slave.slaveName}'s pregnancy has been terminated; `;
+						if (slave.sexualFlaw === "breeder") {
+							r += `it broke ${his} mind.`;
+							slave.fetish = "mindbroken";
+							slave.behavioralQuirk = "none";
+							slave.behavioralFlaw = "none";
+							slave.sexualQuirk = "none";
+							slave.sexualFlaw = "none";
+							slave.devotion = 0;
+							slave.trust = 0;
+						} else if (slave.devotion < -50) {
+							r += `${he} did not handle it well.`;
+							slave.trust -= 10;
+							slave.devotion -= 25;
+						} else if (slave.devotion < -20) {
+							r += `${he} did not handle it well.`;
+							slave.trust -= 10;
+							slave.devotion -= 10;
+						} else if (slave.fetish === "pregnancy") {
+							r += `${he} did not handle it well.`;
+							let fetishModifier = slave.fetishStrength / 2;
+							slave.devotion -= fetishModifier;
+							slave.trust -= fetishModifier;
+						} else if (slave.devotion <= 20) {
+							r += `${he} did not handle it well.`;
+							slave.trust -= 10;
+							slave.devotion -= 5;
+						} else if (slave.devotion <= 50) {
+							r += `${he} did not handle it well.`;
+							slave.trust -= 10;
+						} else {
+							r += "it had little mental effect.";
+						}
 					}
-				}
 
-				if (lastPregRule(slave, V.defaultRules)) {
-					slave.preg = -1;
-				} else {
-					slave.preg = 0;
-				}
-				if (slave.abortionTat > -1) {
-					slave.abortionTat++;
-					cashX(forceNeg(V.modCost), "slaveMod", slave);
-				}
-				V.reservedChildren = FetusGlobalReserveCount("incubator");
-				V.reservedChildrenNursery = FetusGlobalReserveCount("nursery");
-				TerminatePregnancy(slave);
-			} else if (rule.abortion === "male") {
-				if (slave.preg < 4) {
-					let WL = slave.womb.length;
-					for (let index = 0; index < WL; index++) {
-						if (slave.womb[index].genetics.gender === "XY") {
-							WombRemoveFetus(slave, index);
-							index--;
-							WL--;
-						}
+					if (lastPregRule(slave, V.defaultRules)) {
+						slave.preg = -1;
+					} else {
+						slave.preg = 0;
 					}
-					if (WL === 0) {
-						TerminatePregnancy(slave);
+					if (slave.abortionTat > -1) {
+						slave.abortionTat++;
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
 					}
-					r += `<br>${slave.slaveName}'s male fetuses have been terminated.`;
-				}
-			} else if (rule.abortion === "female") {
-				if (slave.preg < 4) {
-					let WL = slave.womb.length;
-					for (let index = 0; index < WL; index++) {
-						if (slave.womb[index].genetics.gender === "XX") {
-							WombRemoveFetus(slave, index);
-							index--;
-							WL--;
+					V.reservedChildren = FetusGlobalReserveCount("incubator");
+					V.reservedChildrenNursery = FetusGlobalReserveCount("nursery");
+					TerminatePregnancy(slave);
+				} else if (ar === "male") {
+					if (slave.preg < 4) {
+						let WL = slave.womb.length;
+						for (let index = 0; index < WL; index++) {
+							if (slave.womb[index].genetics.gender === "XY") {
+								WombRemoveFetus(slave, index);
+								index--;
+								WL--;
+							}
+						}
+						if (WL === 0) {
+							TerminatePregnancy(slave);
+						}
+						r += `<br>${slave.slaveName}'s male fetuses have been terminated.`;
+					}
+				} else if (ar === "female") {
+					if (slave.preg < 4) {
+						let WL = slave.womb.length;
+						for (let index = 0; index < WL; index++) {
+							if (slave.womb[index].genetics.gender === "XX") {
+								WombRemoveFetus(slave, index);
+								index--;
+								WL--;
+							}
 						}
+						if (WL === 0) {
+							TerminatePregnancy(slave);
+						}
+						r += `<br>${slave.slaveName}'s female fetuses have been terminated.`;
 					}
-					if (WL === 0) {
-						TerminatePregnancy(slave);
+				} else if (ar.startsWith("race:")){ // ar is the race name in the notation "race:<lowercase_race_name>"
+					const race = ar.substr("race:".length);
+					if (slave.preg < 4) {
+						let WL = slave.womb.length;
+						for (let index = 0; index < WL; index++) {
+							if (slave.womb[index].genetics.race === race) {
+								WombRemoveFetus(slave, index);
+								index--;
+								WL--;
+							}
+						}
+						if (WL === 0) {
+							TerminatePregnancy(slave);
+						}
+						r += `<br>${slave.slaveName}'s ${race} fetuses have been terminated.`;
 					}
-					r += `<br>${slave.slaveName}'s female fetuses have been terminated.`;
 				}
+				SetBellySize(slave);
 			}
-			SetBellySize(slave);
 		}
 	}
 
diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js
index 0e7768d253f..c0163d48b3c 100644
--- a/src/js/datatypeCleanupJS.js
+++ b/src/js/datatypeCleanupJS.js
@@ -2494,6 +2494,9 @@ App.Entity.Utils.RARuleDatatypeCleanup = function() {
 		if (set.removeLabel === "") {
 			set.removeLabel = null;
 		}
+		if (typeof (set.abortion) === "string") {
+			set.abortion = [set.abortion];
+		}
 	}
 }();
 
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index e892c47b231..65bb52811f0 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -499,6 +499,9 @@ window.rulesAssistantOptions = (function() {
 
 		setValue(what) {
 			what = what || [];
+			if (!Array.isArray(what)) {
+				what = [what];
+			}
 			const vs = new Set(what);
 			for (const opt of this.value.options) {
 				opt.selected = vs.has(this.values_.get(opt.value));
@@ -2285,14 +2288,17 @@ window.rulesAssistantOptions = (function() {
 		}
 	}
 
-	class AbortionList extends ListSelector {
+	class AbortionList extends MultiListSelector {
 		constructor() {
 			const pairs = [
-				["abort all", "all"],
+				["all", "all"],
 			];
 			if (V.pregnancyMonitoringUpgrade === 1 && V.geneticMappingUpgrade >= 1) {
-				pairs.push(["abort boys", "male"]);
-				pairs.push(["abort girls", "female"]);
+				pairs.push(["boys", "male"]);
+				pairs.push(["girls", "female"]);
+				for (let i = 0; i < App.Data.misc.filterRaces.length; ++i) {
+					pairs.push([App.Data.misc.filterRaces[i], "race:" + App.Data.misc.filterRacesLowercase[i]]);
+				}
 			}
 			super("Pregnancy termination", pairs);
 			this.setValue(current_rule.set.abortion);
-- 
GitLab