diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts index f1186870e854dd6e4b17419c2ab133371eae910d..19c0f79fbcc87ee64d8e3b3912141584e2d10edc 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 1f1636d69e297e3badf34a6b4238ad1694a8269f..bd0a2bed181a70e3615958ba6347d681ebf3d89a 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1023,90 +1023,94 @@ window.DefaultRules = (function() { * @param {App.RA.RuleSetters} rule */ 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; - } else { - r += "it had little mental effect."; + function conditionalTermination(slave, predicate) { + let res = false; + if (slave.preg < 4) { + let WL = slave.womb.length; + for (let index = 0; index < WL; index++) { + if (predicate(slave.womb[index])) { + WombRemoveFetus(slave, index); + index--; + WL--; + res = true; } } - - if (lastPregRule(slave, V.defaultRules)) { - slave.preg = -1; - } else { - slave.preg = 0; - } - if (slave.abortionTat > -1) { - slave.abortionTat++; - cashX(forceNeg(V.modCost), "slaveMod", slave); + if (WL === 0) { + TerminatePregnancy(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--; + } + return res; + } + + if ((rule.abortion !== undefined) && (rule.abortion !== null)) { + 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 += `<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 (WL === 0) { - TerminatePregnancy(slave); + + if (lastPregRule(slave, V.defaultRules)) { + slave.preg = -1; + } else { + slave.preg = 0; } - 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--; - } + if (slave.abortionTat > -1) { + slave.abortionTat++; + cashX(forceNeg(V.modCost), "slaveMod", slave); + } + V.reservedChildren = FetusGlobalReserveCount("incubator"); + V.reservedChildrenNursery = FetusGlobalReserveCount("nursery"); + TerminatePregnancy(slave); + } else if (ar === "male") { + if (conditionalTermination(slave, fetus => fetus.genetics.gender === "XY")) { + r += `<br>${slave.slaveName}'s male fetuses have been terminated.`; } - if (WL === 0) { - TerminatePregnancy(slave); + } else if (ar === "female") { + if (conditionalTermination(slave, fetus => fetus.genetics.gender === "XX")) { + r += `<br>${slave.slaveName}'s female fetuses have been terminated.`; + } + } else if (ar.startsWith("race:")){ // ar is the race name in the notation "race:<lowercase_race_name>" + const race = ar.substr("race:".length); + if (conditionalTermination(slave, fetus => fetus.genetics.race === race)) { + 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 448d27fe8c5c63dcd63e301ebed4ec183fcced21..a6c5a77347071fb9ff4a0a6b890087a4e3e1c975 100644 --- a/src/js/datatypeCleanupJS.js +++ b/src/js/datatypeCleanupJS.js @@ -2521,6 +2521,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 9799022ae69c31845bcf36314ca3aa5bc62438c6..65bb52811f031f5b92b3e6319515ff3e57f63eaf 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -475,6 +475,40 @@ window.rulesAssistantOptions = (function() { } } + /** + * Displays the <select> element with multiple choices + */ + class MultiListSelector extends ListSelector { + constructor(prefix, data = []) { + super(prefix, data, false); + } + + render(data, allowNullValue) { + const res = super.render(data, allowNullValue); + this.value.multiple = true; + return res; + } + + getData() { + const res = []; + for (const opt of this.value.selectedOptions) { + res.push(this.values_.get(opt.value)); + } + return res; + } + + 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)); + } + } + } + class RadioSelector extends ElementWithLabel { /** * @@ -2254,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);