Skip to content
Snippets Groups Projects
rulesAssistantOptions.js 117 KiB
Newer Older
  • Learn to ignore specific revisions
  • DCoded's avatar
    DCoded committed
    
    
    ezsh's avatar
    ezsh committed
    	class DickChastityList extends RadioSelector {
    
    		constructor() {
    			const items = [
    
    				["none", 0],
    				["chastity cage", 1],
    
    ezsh's avatar
    ezsh committed
    			super("Penile chastity", items, true);
    
    			this.setValue(current_rule.set.chastityPenis);
    			this.onchange = (value) => current_rule.set.chastityPenis = value;
    		}
    
    klorpa's avatar
    klorpa committed
    	}
    
    vas's avatar
    vas committed
    
    
    	class DickAccVirginsList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    vas's avatar
    vas committed
    			super("Dick accessories for anal virgins", setup.dickAccessories.map(i => [i.name, i.value]));
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.aVirginDickAccessory);
    			this.onchange = (value) => current_rule.set.aVirginDickAccessory = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    	class DickAccOtherList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    
    vas's avatar
    vas committed
    			super("Dick accessories for other slaves", setup.dickAccessories.map(i => [i.name, i.value]));
    
    vas's avatar
    vas committed
    			this.setValue(current_rule.set.dickAccessory);
    			this.onchange = (value) => current_rule.set.dickAccessory = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class AnalChastityList extends RadioSelector {
    
    		constructor() {
    			const items = [
    
    				["none", 0],
    				["chastity", 1],
    
    ezsh's avatar
    ezsh committed
    			super("Anal chastity", items, true);
    
    			this.setValue(current_rule.set.chastityAnus);
    			this.onchange = (value) => current_rule.set.chastityAnus = value;
    		}
    
    klorpa's avatar
    klorpa committed
    	}
    
    	class ButtplugsVirginsList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const accs = [];
    
    			setup.buttplugs.forEach(acc => {
    
    DCoded's avatar
    DCoded committed
    				if (acc.fs === undefined && acc.rs === undefined) {
    
    					accs.push([acc.name, acc.value]);
    
    DCoded's avatar
    DCoded committed
    				} else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) {
    
    Skriv's avatar
    Skriv committed
    					accs.push([`${acc.name} (Purchased)`, acc.value]);
    
    Skriv's avatar
    Skriv committed
    				}
    
    vas's avatar
    vas committed
    			});
    
    vas's avatar
    vas committed
    			super("Buttplugs for anal virgins", accs);
    
    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() {
    			const accs = [];
    
    			setup.buttplugs.forEach(acc => {
    
    DCoded's avatar
    DCoded committed
    				if (acc.fs === undefined && acc.rs === undefined) {
    
    					accs.push([acc.name, acc.value]);
    
    DCoded's avatar
    DCoded committed
    				} else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) {
    
    Skriv's avatar
    Skriv committed
    					accs.push([`${acc.name} (Purchased)`, acc.value]);
    
    Skriv's avatar
    Skriv committed
    				}
    
    vas's avatar
    vas committed
    			});
    
    vas's avatar
    vas committed
    			super("Buttplugs for other slaves", accs);
    
    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 {
    
    			setup.buttplugAttachments.forEach(acc => {
    
    DCoded's avatar
    DCoded committed
    				if (acc.fs === undefined && acc.rs === undefined) {
    
    					accs.push([acc.name, acc.value]);
    
    DCoded's avatar
    DCoded committed
    				} else if (acc.rs === "buyTails" && V.toysBoughtButtPlugTails === 1) {
    
    Skriv's avatar
    Skriv committed
    					accs.push([`${acc.name} (Purchased)`, acc.value]);
    
    Skriv's avatar
    Skriv committed
    				}
    
    			});
    			super("Buttplug attachments for slaves with buttplugs", accs);
    			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() {
    
    			[this.breasts, this.butts, this.lips, this.dicks, this.balls].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 CurrativesList 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, false, 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 = [
    
    				["contraceptives", true],
    				["fertile", 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 ListSelector {
    
    Pregmodder's avatar
    Pregmodder committed
    		constructor() {
    			const pairs = [
    
    				["abort all", "all"],
    
    			if (V.pregnancyMonitoringUpgrade === 1 && V.geneticMappingUpgrade >= 1) {
    
    				pairs.push(["abort boys", "male"]);
    				pairs.push(["abort girls", "female"]);
    
    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 = [["none"]];
    
    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
    			}
    
    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
    			];
    			if (V.medicalEnema === 1) {
    				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
    	}
    
    
    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);
    
    vas's avatar
    vas committed
    			this.setValue(this.value2string(current_rule.set.dietCum, current_rule.set.dietMilk));
    
    			this.onchange = (value) => {
    				current_rule.set.dietCum = value.cum;
    				current_rule.set.dietMilk = value.milk;
    
    kopareigns's avatar
    kopareigns committed
    				this.setValue(this.value2string(current_rule.set.dietCum, current_rule.set.dietMilk));
    
    vas's avatar
    vas committed
    			};
    		}
    
    klorpa's avatar
    klorpa committed
    
    
    vas's avatar
    vas committed
    		value2string(cum, milk) {
    			return `cum: ${cum}, milk: ${milk}`;
    		}
    
    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
    	}
    
    
    	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 ReleaseList extends ListSelector {
    
    vas's avatar
    vas committed
    		constructor() {
    			const pairs = [
    
    				["permissive"],
    				["sapphic"],
    				["masturbation"],
    				["restrictive"],
    				["chastity"]
    
    vas's avatar
    vas committed
    			];
    			super("Release rules", pairs);
    
    Pregmodder's avatar
    Pregmodder committed
    			this.setValue(current_rule.set.releaseRules);
    			this.onchange = (value) => current_rule.set.releaseRules = 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
    	}
    
    
    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
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class LensesList extends List {
    
    vas's avatar
    vas committed
    		constructor() {
    
    ezsh's avatar
    ezsh committed
    			super("Eye coloring");
    			this.colorlist = new LensesColorList(this);
    			this.shapelist = new LensesShapeList(this);
    			this.colorlist.onchange = () => this.setValue(undefined);
    			this.shapelist.onchange = () => this.setValue(undefined);
    			this.setValue(current_rule.set.eyeColor);
    			this.onchange = (value) => current_rule.set.eyeColor = value;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    
    
    ezsh's avatar
    ezsh committed
    		_appendContentTo(container) {
    			super._appendContentTo(container);
    			this.colorlist._appendContentTo(container);
    			this.shapelist._appendContentTo(container);
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		combine() {
    			const lst = [];
    
    Skriv's avatar
    Skriv committed
    			if (this.colorlist.getData() !== null) { lst.push(this.colorlist.getData()); }
    			if (this.shapelist.getData() !== null) { lst.push(this.shapelist.getData()); }
    			return (lst.length === 0) ? null : lst.join(" ");
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    
    
    vas's avatar
    vas committed
    		setValue(val) {
    
    ezsh's avatar
    ezsh committed
    			if (val === undefined) {
    				val = this.combine();
    			} else {
    				if (val === noDefaultSetting.value) {
    					this.colorlist.setValue(val);
    					this.shapelist.setValue(val);
    				} else {
    					//
    				}
    			}
    			super.setValue(val);
    
    vas's avatar
    vas committed
    			current_rule.set.eyeColor = val;
    
    vas's avatar
    vas committed
    		}
    
    vas's avatar
    vas committed
    	}
    
    
    ezsh's avatar
    ezsh committed
    	class LensesColorList extends List {
    		constructor(parent) {
    			const items =
    				[
    					"blue",
    					"black",
    					"brown",
    					"green",
    					"turquoise",
    					"sky-blue",
    					"hazel",
    					"pale-grey",
    					"white",
    					"pink",
    					"yellow",
    					"orange",
    					"amber",
    					"red"
    				];
    			super("Color", items);
    			this.labelElement_.className = "ra-sub-label";
    			this.parent = parent;
    		}
    
    		createValueElement() {
    			return null;
    		}
    	}
    
    	class LensesShapeList extends List {
    		constructor(parent) {
    			const items =
    				[
    					"catlike",
    					"serpent-like",
    					"goat-like",
    					"devilish",
    					"demonic",
    					"hypnotic",
    					"heart-shaped",
    					"star-shaped",
    					"wide-eyed",
    					"almond-shaped",
    					"bright",
    					"teary",
    					"vacant"
    				];
    			super("Shape", items);
    			this.labelElement_.className = "ra-sub-label";
    			this.parent = parent;
    		}
    
    		createValueElement() {
    			return null;
    
    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]
    
    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],