Skip to content
Snippets Groups Projects
rulesAssistantOptions.js 113 KiB
Newer Older
  • Learn to ignore specific revisions
  • vas's avatar
    vas committed
    			this.setValue(current_rule.set.aVirginButtplug);
    			this.onchange = (value) => current_rule.set.aVirginButtplug = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ButtplugsOtherList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    			super("Buttplugs for other slaves", isItemAccessible.array(App.Data.slaveWear.buttplugs));
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.buttplug);
    			this.onchange = (value) => current_rule.set.buttplug = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ButtplugAttachmentsList extends ListSelector {
    
    			super("Buttplug attachments for slaves with buttplugs", isItemAccessible.array(App.Data.slaveWear.buttplugAttachments));
    
    			this.setValue(current_rule.set.buttplugAttachment);
    			this.onchange = (value) => current_rule.set.buttplugAttachment = value;
    		}
    	}
    
    klorpa's avatar
    klorpa committed
    
    
    	class ImplantVolumeList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["no changes", -1],
    				["empty implant", 0],
    				["early pregnancy", 1500],
    				["second trimester pregnancy", 5000],
    				["full-term pregnancy", 15000],
    				["full-term with twins", 30000],
    				["full-term with triplets", 45000],
    				["full-term with quadruplets", 60000],
    				["full-term with quintuplets", 75000],
    				["full-term with sextuplets", 90000],
    				["full-term with septuplets", 105000],
    				["full-term with octuplets", 120000]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Belly implant target volume (if present)", pairs, false);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.bellyImplantVol);
    			this.onchange = (value) => current_rule.set.bellyImplantVol = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    
    	class AutosurgerySwitch extends BooleanSwitch {
    
    vas's avatar
    vas committed
    		constructor() {
    
    			super("Assistant-applied implants (Autosurgery global switch)", [0, 1]);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.autoSurgery);
    			this.onchange = (value) => current_rule.set.autoSurgery = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    vas's avatar
    vas committed
    
    
    	class IntensiveGrowthSwitch extends BooleanSwitch {
    
    ezsh's avatar
    ezsh committed
    		constructor() {
    
    			super("Use intensive growth drugs for healthy slaves", [0, 1]);
    
    			this.setValue(current_rule.set.growth.intensity);
    			this.onchange = (value) => current_rule.set.growth.intensity = value;
    
    	class HyperGrowthSwitch extends BooleanSwitch {
    
    kopareigns's avatar
    kopareigns committed
    		constructor() {
    
    			super("Use hyper growth drugs", [0, 1]);
    
    kopareigns's avatar
    kopareigns committed
    			this.setValue(current_rule.set.hyper_drugs);
    			this.onchange = (value) => current_rule.set.hyper_drugs = value;
    		}
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class GrowthList extends OptionsWithLabel {
    
    vas's avatar
    vas committed
    		constructor() {
    
    ezsh's avatar
    ezsh committed
    			super("Growth hormone regimes for healthy slaves");
    
    vas's avatar
    vas committed
    			this.sublists = [];
    			const pairs = [
    
    				[capFirstChar(noDefaultSetting.text), () => this.nds()],
    
    vas's avatar
    vas committed
    				["Girlish figure", () => this.girlish()],
    				["Stacked figure", () => this.stacked()],
    				["Huge but functional", () => this.huge()],
    				["Unlimited", () => this.unlimited()],
    				["None", () => this.none()]
    			];
    			pairs.forEach(pair => this.appendChild(new OptionsItem(...pair)));
    
    			this.breasts = new BreastGrowthList();
    			this.butts = new ButtGrowthList();
    			this.lips = new LipGrowthList();
    			this.sublists.push(this.breasts, this.butts, this.lips);
    
    			if (V.seeDicks > 0 || V.makeDicks > 0) {
    				this.dicks = new DickGrowthList();
    				this.balls = new BallGrowthList();
    				this.sublists.push(this.dicks, this.balls);
    			}
    		}
    
    vas's avatar
    vas committed
    
    
    ezsh's avatar
    ezsh committed
    		_appendContentTo(container) {
    			super._appendContentTo(container);
    			this.sublists.forEach(i => i._appendContentTo(container));
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		nds() {
    
    wkwk's avatar
    wkwk committed
    			this.sublists.forEach(i => {
    
    ezsh's avatar
    ezsh committed
    				i.setValue(null);
    
    				i.propagateChange();
    
    vas's avatar
    vas committed
    			});
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		girlish() {
    
    ezsh's avatar
    ezsh committed
    			this.breasts.setValue(App.RA.makeTarget('<=', 350));
    			this.butts.setValue(App.RA.makeTarget('<=', 2));
    			this.lips.setValue(App.RA.makeTarget('<=', 25));
    
    Skriv's avatar
    Skriv committed
    			if (this.dicks) { this.dicks.setValue(App.RA.makeTarget('==', 0)); }
    			if (this.balls) { this.balls.setValue(App.RA.makeTarget('==', 0)); }
    
    vas's avatar
    vas committed
    			this.sublists.forEach(i => i.propagateChange());
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		stacked() {
    
    ezsh's avatar
    ezsh committed
    			this.breasts.setValue(App.RA.makeTarget('>=', 1000));
    			this.butts.setValue(App.RA.makeTarget('>=', 5));
    			this.lips.setValue(App.RA.makeTarget('>=', 25));
    
    Skriv's avatar
    Skriv committed
    			if (this.dicks) { this.dicks.setValue(App.RA.makeTarget('>=', 4)); }
    			if (this.balls) { this.balls.setValue(App.RA.makeTarget('>=', 4)); }
    
    vas's avatar
    vas committed
    			this.sublists.forEach(i => i.propagateChange());
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		huge() {
    
    ezsh's avatar
    ezsh committed
    			this.breasts.setValue(App.RA.makeTarget('>=', 9000));
    			this.butts.setValue(App.RA.makeTarget('>=', 10));
    			this.lips.setValue(App.RA.makeTarget('>=', 45));
    
    Skriv's avatar
    Skriv committed
    			if (this.dicks) { this.dicks.setValue(App.RA.makeTarget('>=', 6)); }
    			if (this.balls) { this.balls.setValue(App.RA.makeTarget('>=', 6)); }
    
    vas's avatar
    vas committed
    			this.sublists.forEach(i => i.propagateChange());
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		unlimited() {
    
    ezsh's avatar
    ezsh committed
    			this.breasts.setValue(App.RA.makeTarget('>=', 48000));
    			this.butts.setValue(App.RA.makeTarget('>=', 20));
    			this.lips.setValue(App.RA.makeTarget('>=', 100));
    
    Skriv's avatar
    Skriv committed
    			if (this.dicks) { this.dicks.setValue(App.RA.makeTarget('>=', 30)); }
    			if (this.balls) { this.balls.setValue(App.RA.makeTarget('>=', 125)); }
    
    vas's avatar
    vas committed
    			this.sublists.forEach(i => i.propagateChange());
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		none() {
    
    			this.sublists.forEach(i => {
    
    ezsh's avatar
    ezsh committed
    				i.setValue(App.RA.makeTarget('==', 0));
    
    				i.propagateChange();
    
    vas's avatar
    vas committed
    			});
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class BreastGrowthList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    klorpa's avatar
    klorpa committed
    				["B-Cup", 350],
    				["D-Cup", 1000],
    
    				["monstrous", 9000],
    				["unlimited", 48000],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Breasts", pairs, true, 0, 48000, true);
    
    			this.setValue(current_rule.set.growth.boobs);
    			this.onchange = (value) => current_rule.set.growth.boobs = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ButtGrowthList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["cute", 2],
    				["big", 4],
    				["huge", 6],
    				["unlimited", 20],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Butts", pairs, true, 0, 20, true);
    
    			this.setValue(current_rule.set.growth.butt);
    			this.onchange = (value) => current_rule.set.growth.butt = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class LipGrowthList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["plump", 25],
    				["beestung", 45],
    				["facepussy", 100],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Lips", pairs, true, 0, 100, true);
    
    			this.setValue(current_rule.set.growth.lips);
    			this.onchange = (value) => current_rule.set.growth.lips = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class DickGrowthList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["above average", 4],
    				["pornstar", 6],
    				["unlimited", 30],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Dicks, if present", pairs, true, 0, 30, true);
    
    			this.setValue(current_rule.set.growth.dick);
    			this.onchange = (value) => current_rule.set.growth.dick = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class BallGrowthList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["sizable", 4],
    				["cumslave", 6],
    				["unlimited", 125],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Balls, if present", pairs, true, 0, 125, true);
    
    			this.setValue(current_rule.set.growth.balls);
    			this.onchange = (value) => current_rule.set.growth.balls = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	class CurativesList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["none", 0],
    				["preventatives", 1],
    				["curatives", 2],
    
    vas's avatar
    vas committed
    			];
    
    			super("Health drugs", pairs, true);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.curatives);
    			this.onchange = (value) => current_rule.set.curatives = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class AphrodisiacList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["none", 0],
    				["standard", 1],
    				["extreme", 2],
    				["anaphrodisiacs", -1]
    
    vas's avatar
    vas committed
    			];
    			super("Aphrodisiacs", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.aphrodisiacs);
    			this.onchange = (value) => current_rule.set.aphrodisiacs = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class ContraceptiveList extends RadioSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    klorpa's avatar
    klorpa committed
    			const drugs = [
    
    				["yes", true],
    				["no", false],
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Contraceptives for fertile slaves", drugs, true);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.preg);
    			this.onchange = (value) => current_rule.set.preg = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class AbortionList extends MultiListSelector {
    
    Pregmodder's avatar
    Pregmodder committed
    		constructor() {
    			const pairs = [
    
    Pregmodder's avatar
    Pregmodder committed
    				["none"],
    
    				["all", "all"],
    
    			if (V.pregnancyMonitoringUpgrade === 1 && V.geneticMappingUpgrade >= 1) {
    
    				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]]);
    				}
    
    Skriv's avatar
    Skriv committed
    			}
    
    Pregmodder's avatar
    Pregmodder committed
    			super("Pregnancy termination", pairs);
    			this.setValue(current_rule.set.abortion);
    			this.onchange = (value) => current_rule.set.abortion = value;
    		}
    	}
    
    
    	class PregDrugsList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["none"],
    				["fast gestation", "fast"],
    				["slow gestation", "slow"],
    				["birth suppressors", "suppress"],
    				["birth stimulators", "stimulate"]
    
    vas's avatar
    vas committed
    			];
    			super("Pregnancy control agents for pregnant slaves", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.pregSpeed);
    			this.onchange = (value) => current_rule.set.pregSpeed = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class FemaleHormonesList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    vas's avatar
    vas committed
    				["Intensive Female", 2],
    				["Female", 1],
    				["None", 0],
    				["Male", -1],
    				["Intensive Male", -2]
    
    vas's avatar
    vas committed
    			];
    			super("Hormones for female slaves", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.XX);
    			this.onchange = (value) => current_rule.set.XX = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class GeldingHormonesList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    vas's avatar
    vas committed
    				["Intensive Female", 2],
    				["Female", 1],
    				["None", 0],
    				["Male", -1],
    				["Intensive Male", -2]
    
    vas's avatar
    vas committed
    			];
    			super("Hormones for geldings", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.gelding);
    			this.onchange = (value) => current_rule.set.gelding = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ShemaleHormonesList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    vas's avatar
    vas committed
    				["Intensive Female", 2],
    				["Female", 1],
    				["None", 0],
    				["Male", -1],
    
    vas's avatar
    vas committed
    				["Intensive Male", -2]
    
    vas's avatar
    vas committed
    			];
    			super("Hormones for shemales", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.XY);
    			this.onchange = (value) => current_rule.set.XY = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class OtherDrugsList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			const drugs = [["no drugs"]];
    
    vas's avatar
    vas committed
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			// Lips
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["lip atrophiers"]);
    
    DCoded's avatar
    DCoded committed
    			}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			drugs.push(["lip injections"]);
    
    			// Breasts
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["breast redistributors"]);
    			}
    			drugs.push(["breast injections"]);
    			drugs.push(["intensive breast injections"]);
    			if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
    				drugs.push(["hyper breast injections"]);
    
    vas's avatar
    vas committed
    			}
    
    Fake_Dev's avatar
    Fake_Dev committed
    				drugs.push(["nipple enhancers"]);
    			}
    
    DCoded's avatar
    DCoded committed
    			if (V.purchasedSagBGone === 1) {
    
    vas's avatar
    vas committed
    				drugs.push(["Sag-B-gone (Product)", "sag-B-gone"]);
    
    DCoded's avatar
    DCoded committed
    			}
    
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    
    Pregmodder's avatar
    Pregmodder committed
    				drugs.push(["nipple atrophiers"]);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			}
    
    			// Womb
    			drugs.push(["fertility drugs"]);
    			if (V.seeHyperPreg === 1 && V.superFertilityDrugs === 1) {
    				drugs.push(["Super fertility drugs", "super fertility drugs"]);
    			}
    			if (V.precociousPuberty === 1 && V.pubertyHormones) {
    				drugs.push(["Female hormone injections (Research)", "female hormone injections"]);
    			}
    
    			// Vagina
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    
    Pregmodder's avatar
    Pregmodder committed
    				drugs.push(["labia atrophiers"]);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				drugs.push(["clitoris atrophiers"]);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    
    			// Dicks
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["penis atrophiers"]);
    			}
    			drugs.push(["penis enhancement"]);
    			drugs.push(["intensive penis enhancement"]);
    
    			if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
    				drugs.push(["hyper penis enhancement"]);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			}
    			drugs.push(["Erectile dysfunction circumvention", "priapism agents"]);
    
    			// Balls
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["testicle atrophiers"]);
    			}
    			drugs.push(["testicle enhancement"]);
    			drugs.push(["intensive testicle enhancement"]);
    			if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
    
    				drugs.push(["hyper testicle enhancement"]);
    			}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			if (V.precociousPuberty === 1 && V.pubertyHormones) {
    				drugs.push(["Male hormone injections (Research)", "male hormone injections"]);
    			}
    
    			// Butt
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["butt redistributors"]);
    			}
    			drugs.push(["butt injections"]);
    			drugs.push(["intensive butt injections"]);
    			if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
    				drugs.push(["hyper butt injections"]);
    			}
    
    			// Body
    			if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
    				drugs.push(["Weight loss pills (FS)", "appetite suppressors"]);
    			}
    			drugs.push(["steroids"]);
    			if (V.growthStim === 1) {
    				drugs.push(["Growth Stimulants (Research)", "growth stimulants"]);
    			}
    
    			// Mind
    			drugs.push(["psychosuppressants"]);
    
    			if (V.arcologies[0].FSSlaveProfessionalismResearch === 1) {
    				drugs.push(["Mental stimulants (FS)", "psychostimulants"]);
    			}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    
    			// Hormones
    			drugs.push(["hormone blockers"]);
    			drugs.push(["Natural hormone enhancers", "hormone enhancers"]);
    
    			// Age
    
    DCoded's avatar
    DCoded committed
    			if (V.arcologies[0].FSYouthPreferentialistResearch === 1) {
    
    vas's avatar
    vas committed
    				drugs.push(["Anti-aging cream (FS)", "anti-aging cream"]);
    
    DCoded's avatar
    DCoded committed
    			}
    
    vas's avatar
    vas committed
    			super("Other drugs", drugs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.drug);
    			this.onchange = (value) => current_rule.set.drug = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    
    	class EnemaList extends ListSelector {
    
    Pregmodder's avatar
    Pregmodder committed
    		constructor() {
    			const enemas = [
    
    				["none"],
    				["water"]
    
    Pregmodder's avatar
    Pregmodder committed
    			];
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			if (V.boughtItem.toys.medicalEnema === 1) {
    
    Pregmodder's avatar
    Pregmodder committed
    				enemas.push(
    
    					["aphrodisiac"],
    					["curative"],
    					["tightener"]
    
    Pregmodder's avatar
    Pregmodder committed
    				);
    			}
    
    klorpa's avatar
    klorpa committed
    			if (V.wcPiping === 1) {
    				enemas.push(["urine"]);
    			}
    
    Pregmodder's avatar
    Pregmodder committed
    			super("Enemas", enemas);
    			this.setValue(current_rule.set.inflationType);
    			this.onchange = (value) => current_rule.set.inflationType = value;
    		}
    	}
    
    
    	class WeightEditor extends NumericRangeEditor {
    		constructor() {
    
    			const hdp = V.arcologies[0].FSHedonisticDecadence !== "unset";
    
    				["emaciated", App.RA.makeRange(-100, -96)],
    				["very thin", App.RA.makeRange(-95, -31)],
    
    				["pleasingly thin", App.RA.makeRange(-30, -11)],
    				["healthy", App.RA.makeRange(-10, 10)],
    
    				["nicely plush", App.RA.makeRange(11, 30)],
    				[hdp ? "quite curvy" : "chubby", App.RA.makeRange(31, 95)],
    				[hdp ? "extremely curvy": "overweight", App.RA.makeRange(96, 130)],
    				[hdp ? "amazingly curvy": "very overweight", App.RA.makeRange(131, 160)],
    				[hdp ? "spectacularly curvy": "extremely overweight", App.RA.makeRange(161, 190)],
    				[hdp ? "perfectly curvy" : "dangerously overweight", App.RA.makeRange(191, 200)]
    
    			];
    			super("Weight", pairs, true, -100, 200);
    			this.setValue(current_rule.set.weight);
    			this.onchange = (value) => current_rule.set.weight = value;
    		}
    	}
    
    
    	class DietList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const diets = [
    
    vas's avatar
    vas committed
    				["Healthy diet", "healthy"],
    
    				["fix fat and skinny slaves", "attractive"],
    
    vas's avatar
    vas committed
    			];
    			if (V.feeder === 1) {
    				diets.push(
    
    					["feminine", "XX"],
    					["masculine", "XY"]
    
    vas's avatar
    vas committed
    				);
    
    DCoded's avatar
    DCoded committed
    				if (V.dietXXY === 1) {
    
    					diets.push(["futanari", "XXY"]);
    
    DCoded's avatar
    DCoded committed
    				}
    
    vas's avatar
    vas committed
    			}
    
    DCoded's avatar
    DCoded committed
    			if (V.dietCleanse === 1) {
    
    				diets.push(["cleansing"]);
    
    DCoded's avatar
    DCoded committed
    			}
    			if (V.dietFertility === 1) {
    
    				diets.push(["fertility"]);
    
    DCoded's avatar
    DCoded committed
    			}
    			if (V.cumProDiet === 1) {
    
    				diets.push(["cum production"]);
    
    vas's avatar
    vas committed
    			}
    
    vas's avatar
    vas committed
    
    
    			super("Special diets", diets);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.diet);
    			this.onchange = (value) => current_rule.set.diet = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	class DietGrowthList extends BooleanSwitch {
    
    vas's avatar
    vas committed
    		constructor() {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			super("Diet support for growth drugs", [0, 1]);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.dietGrowthSupport);
    			this.onchange = (value) => current_rule.set.dietGrowthSupport = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	const dietAddedText = function(value) {
    		switch(value) {
    			case 0:
    				return "None";
    			case 1:
    				return "Added";
    			case 2:
    				return "Based";
    			default:
    				return value;
    		}
    
    vas's avatar
    vas committed
    	class DietBaseList extends List {
    		constructor() {
    			// TODO: better data structure?
    			const pairs = [
    
    				[capFirstChar(noDefaultSetting.text), {cum: null, milk: null}],
    
    brickode's avatar
    brickode committed
    				["Normal Diet", {cum: 0, milk: 0}],
    				["Cum Added", {cum: 1, milk: 0}],
    				["Milk Added", {cum: 0, milk: 1}],
    				["Cum &amp; Milk Added", {cum: 1, milk: 1}],
    				["Cum-Based", {cum: 2, milk: 0}],
    				["Milk-Based", {cum: 0, milk: 2}],
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Diet base", pairs, false);
    
    			this.setValue({cum: current_rule.set.dietCum, milk: current_rule.set.dietMilk});
    
    			this.onchange = (value) => {
    				current_rule.set.dietCum = value.cum;
    				current_rule.set.dietMilk = value.milk;
    
    vas's avatar
    vas committed
    			};
    		}
    
    		setTextValue(what) {
    			if(what.cum == null && what.milk == null) {
    				super.setTextValue(capFirstChar(noDefaultSetting.text));
    
    			} else {
    
    				super.setTextValue(`Cum: ${dietAddedText(what.cum)}, Milk: ${dietAddedText(what.milk)}`);
    			}
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class DietSolidFoodList extends RadioSelector {
    
    Pregmodder's avatar
    Pregmodder committed
    		constructor() {
    			const pairs = [
    
    				["permitted", 0],
    				["forbidden", 1],
    
    Pregmodder's avatar
    Pregmodder committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Solid food access", pairs, true);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.onDiet);
    			this.onchange = (value) => current_rule.set.onDiet = value;
    		}
    	}
    
    
    	class MuscleList extends NumericTargetEditor {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["none", 0],
    				["toned", 20],
    				["ripped", 50],
    				["massive", 100],
    				["weak", -20]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Muscles", pairs, true, -20, 100, true);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.muscles);
    			this.onchange = (value) => current_rule.set.muscles = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class BraceList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["none"],
    				["straighten"],
    				["universal"]
    
    vas's avatar
    vas committed
    			];
    			super("Braces", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.teeth);
    			this.onchange = (value) => current_rule.set.teeth = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class LivingStandardList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["luxurious"],
    				["normal"],
    				["spare"]
    
    vas's avatar
    vas committed
    			];
    			super("Living standard", pairs);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.livingRules);
    			this.onchange = (value) => current_rule.set.livingRules = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    Pregmodder's avatar
    Pregmodder committed
    	class RestList extends ListSelector {
    		constructor() {
    			const pairs = [
    				["none"],
    				["permissive"],
    				["restrictive"],
    				["cruel"],
    				["mandatory"]
    			];
    			super("Sleep rules", pairs);
    			this.setValue(current_rule.set.restRules);
    			this.onchange = (value) => current_rule.set.restRules = value;
    		}
    	}
    
    
    	class PunishmentList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["confinement"],
    				["whipping"],
    				["chastity"],
    				["situational"]
    
    vas's avatar
    vas committed
    			];
    			super("Typical punishment", pairs);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.standardPunishment);
    			this.onchange = (value) => current_rule.set.standardPunishment = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class RewardList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["relaxation"],
    				["drugs"],
    				["orgasm"],
    				["situational"]
    
    vas's avatar
    vas committed
    			];
    			super("Typical reward", pairs);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.standardReward);
    			this.onchange = (value) => current_rule.set.standardReward = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ReleaseMasturbationSwitch extends RadioSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["Allowed", 1],
    				["Forbidden", 0],
    
    vas's avatar
    vas committed
    			];
    
    			super("Masturbation", pairs);
    			this.setValue(current_rule.set.releaseRules.masturbation);
    			this.onchange = (value) => current_rule.set.releaseRules.masturbation = value;
    		}
    	}
    
    	class ReleasePartnerSwitch extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["Allowed", 1],
    				["Forbidden", 0],
    			];
    			super("Sex with partner", pairs);
    			this.setValue(current_rule.set.releaseRules.partner);
    			this.onchange = (value) => current_rule.set.releaseRules.partner = value;
    		}
    	}
    
    
    	class ReleaseFacilityLeaderSwitch extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["Allowed", 1],
    				["Forbidden", 0],
    			];
    			super("Sex with development facility leaders", pairs);
    			this.setValue(current_rule.set.releaseRules.facilityLeader);
    			this.onchange = (value) => current_rule.set.releaseRules.facilityLeader = value;
    		}
    	}
    
    
    	class ReleaseFamilySwitch extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["Allowed", 1],
    				["Forbidden", 0],
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			];
    
    			super("Sex with family", pairs);
    			this.setValue(current_rule.set.releaseRules.family);
    			this.onchange = (value) => current_rule.set.releaseRules.family = value;
    		}
    	}
    
    	class ReleaseSlavesSwitch extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["Allowed", 1],
    				["Forbidden", 0],
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			];
    
    			super("Sex with other slaves", pairs);
    			this.setValue(current_rule.set.releaseRules.slaves);
    			this.onchange = (value) => current_rule.set.releaseRules.slaves = value;
    		}
    	}
    
    	class ReleaseMasterSwitch extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["Granted", 1],
    				["Denied", 0],
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			];
    
    			super(`Routine sex with ${properMaster()}`, pairs);
    			this.setValue(current_rule.set.releaseRules.master);
    			this.onchange = (value) => current_rule.set.releaseRules.master = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class ToyHoleList extends ListSelector {
    
    Pregmodder's avatar
    Pregmodder committed
    		constructor() {
    			const pairs = [
    
    				["all her holes"],
    				["mouth"],
    				["boobs"],
    				["pussy"],
    				["ass"],
    				["dick"]
    
    Pregmodder's avatar
    Pregmodder committed
    			];
    			super("Fucktoy use preference", pairs);
    			this.setValue(current_rule.set.toyHole);
    			this.onchange = (value) => current_rule.set.toyHole = value;
    		}
    	}
    
    
    	class SmartFetishList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["vanilla"],
    
    				["oral"],
    				["anal"],
    				["boobs"],
    
    vas's avatar
    vas committed
    				["Sub", "submissive"],
    
    				["dom"],
    				["humiliation"],
    
    vas's avatar
    vas committed
    				["Preg", "pregnancy"],
    				["Pain", "masochist"],
    				["Sadism", "sadist"]
    			];
    			super("Smart piercing fetish target", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.clitSetting);
    
    			this.onchange = (value) => current_rule.set.clitSetting = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    
    	class SmartXYAttractionList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["passionate", 100],
    				["attracted", 75],
    				["indifferent", 45],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    			super("Smart piercing XY attraction target", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.clitSettingXY);
    			this.onchange = (value) => current_rule.set.clitSettingXY = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class SmartXXAttractionList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["passionate", 100],
    				["attracted", 75],
    				["indifferent", 45],
    				["none", 0]
    
    vas's avatar
    vas committed
    			];
    			super("Smart piercing XX attraction target", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.clitSettingXX);
    			this.onchange = (value) => current_rule.set.clitSettingXX = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class SmartEnergyList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["nympho", 95],
    
    				["sex addict", 85],
    				["powerful", 65],
    				["healthy", 45],
    				["weak", 25],
    				["frigid", 0]
    
    vas's avatar
    vas committed
    			];
    			super("Smart piercing sex drive target", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.clitSettingEnergy);
    			this.onchange = (value) => current_rule.set.clitSettingEnergy = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class SpeechList extends RadioSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["permissive"],
    				["suppress accents", "accent elimination"],
    				["restrictive"]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Speech rules", pairs, true);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.speechRules);
    			this.onchange = (value) => current_rule.set.speechRules = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class RelationshipList extends RadioSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    brickode's avatar
    brickode committed
    			const pairs = [
    
    				["permissive"],
    				["just friends"],
    				["restrictive"]
    
    vas's avatar
    vas committed
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Relationship rules", pairs, true);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.relationshipRules);
    			this.onchange = (value) => current_rule.set.relationshipRules = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class LactationList extends RadioSelector {
    		constructor() {
    			const pairs = [
    				["none"],
    				["induce"],
    				["maintain"]
    			];
    			super("Lactation rules", pairs, true);
    			this.setValue(current_rule.set.lactationRules);
    			this.onchange = (value) => current_rule.set.lactationRules = value;
    		}
    	}
    
    
    Pregmodder's avatar
    Pregmodder committed
    	class MobilityDeviceList extends ListSelector {
    		constructor() {
    			const pairs = [
    				["restrictive"],
    				["permissive"],
    			];
    			super("Mobility device usage rules", pairs);
    			this.setValue(current_rule.set.mobilityRules);
    			this.onchange = (value) => current_rule.set.mobilityRules = value;
    		}
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class PornBroadcastStatus extends RadioSelector {
    
    				["disabled", 0],
    				["enabled", 1]
    
    ezsh's avatar
    ezsh committed
    			super("Porn Broadcasting Status", pairs, true);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.pornFeed);
    			this.onchange = (value) => current_rule.set.pornFeed = value;
    
    	class PornList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    Pregmodder's avatar
    Pregmodder committed
    				/* ["No broadcasting", -1], **This has changed, it would now use pornFeed** */
    
    				["no subsidy", 0],
    
    vas's avatar
    vas committed
    				["1000", 1000],
    				["2000", 2000],
    				["3000", 3000],
    				["4000", 4000],
    				["5000", 5000]
    
    vas's avatar
    vas committed
    			];
    			super("Weekly porn publicity subsidy", pairs);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.pornFameSpending);
    			this.onchange = (value) => current_rule.set.pornFameSpending = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    
    	class EyewearList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["correct with glasses"],
    
    vas's avatar
    vas committed
    				["correct with contacts"],
    				["universal glasses"],
    				["blur with glasses"],
    				["blur with contacts"]
    			];
    			super("Eyewear", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.eyewear);
    			this.onchange = (value) => current_rule.set.eyewear = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	class IrisColorList extends List {
    
    vas's avatar
    vas committed
    		constructor() {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			const items = App.Medicine.Modification.eyeColor.map(color => color.value);
    			super("Iris", items);
    			this.setValue(current_rule.set.iris);
    			this.onchange = (value) => current_rule.set.iris = value;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	}
    	class PupilShapeList extends List {
    		constructor() {
    			const items = ["none"].concat(App.Medicine.Modification.eyeShape.map(shape => shape.value));
    			super("Pupil", items);
    			this.setValue(current_rule.set.pupil);
    			this.onchange = (value) => current_rule.set.pupil = value;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	}
    	class ScleraColorList extends List {
    		constructor() {
    			const items = ["none"].concat(App.Medicine.Modification.eyeColor.map(color => color.value));
    			super("Sclera", items);
    			this.setValue(current_rule.set.sclera);
    			this.onchange = (value) => current_rule.set.sclera = value;
    
    vas's avatar
    vas committed
    		}
    	}
    
    klorpa's avatar
    klorpa committed
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	class EarwearList extends ListSelector {
    
    klorpa's avatar
    klorpa committed
    		constructor() {
    			const pairs = [
    
    klorpa's avatar
    klorpa committed
    				["correct with hearing aids"],
    				["muffle with ear plugs"],
    				["deafen with ear plugs"]
    			];
    
    ezsh's avatar
    ezsh committed
    			super("Earwear", pairs, true);
    
    klorpa's avatar
    klorpa committed
    			this.setValue(current_rule.set.earwear);
    			this.onchange = (value) => current_rule.set.earwear = value;
    		}
    	}
    
    vas's avatar
    vas committed
    
    
    	class MakeupList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    ezsh's avatar
    ezsh committed
    			const pairs = [
    
    vas's avatar
    vas committed
    				["makeup-free", 0],
    				["nice", 1],
    				["gorgeous", 2],
    				["color-coordinate with hair", 3],
    
    				["slutty", 4],
    				["neon", 5],
    				["neon color-coordinate with hair", 6],
    				["metallic", 7],
    				["metallic color-coordinate with hair", 8]
    
    ezsh's avatar
    ezsh committed
    			];
    			super("Makeup", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.makeup);
    			this.onchange = (value) => current_rule.set.makeup = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class NailsList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    ezsh's avatar
    ezsh committed
    			const pairs = [
    
    vas's avatar
    vas committed
    				["clipped", 0],
    				["extended", 1],
    				["color-coordinate with hair", 2],
    				["sharp and claw-like", 3],
    				["bright and glittery", 4],
    
    				["hooker nails", 5],
    				["neon colored", 6],
    				["neon color-coordinate with hair", 7],
    				["metallic painted", 8],
    				["metallic color-coordinate with hair", 9]
    
    ezsh's avatar
    ezsh committed
    			];
    			super("Nails", pairs);
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.nails);
    			this.onchange = (value) => current_rule.set.nails = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	class HairLengthList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    vas's avatar
    vas committed
    				["very short", 5],
    				["short", 10],
    				["shoulder length", 30],
    				["long", 60],
    				["very long", 100],