diff --git a/src/js/rulesAssistantOptions.tw b/src/js/rulesAssistantOptions.tw index 8f2a40553fc98c81853283c169437d6047445f92..77b930c73e4cbcb352db5e22d1ede3f75201545a 100644 --- a/src/js/rulesAssistantOptions.tw +++ b/src/js/rulesAssistantOptions.tw @@ -1,33 +1,34 @@ :: Rules Assistant Options [script] - +// jshint esversion: 6 +// jshint browser: true // rewrite of the rules assistant options page in javascript // uses an object-oriented widget pattern // wrapped in a closure so as not to polute the global namespace // the widgets are generic enough to be reusable; if similar user interfaces are ported to JS, we could move the classes to the global scope window.rulesAssistantOptions = (function() { - "use strict" + "use strict"; - let V - let r = "" + let V; + let r = ""; function rulesAssistantOptions(element) { - V = State.variables - V.nextButton = "Back to Main" - V.nextLink = "Main" - V.returnTo = "Main" - V.showEncyclopedia = 1 - V.encyclopedia = "Personal Assistant" - const root = new Root(element) + V = State.variables; + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.returnTo = "Main"; + V.showEncyclopedia = 1; + V.encyclopedia = "Personal Assistant"; + const root = new Root(element); } function onreturn(e, cb) { - if (e.keyCode === 13) cb() + if (e.keyCode === 13) cb(); } // create a new rule and reload function newRule(root) { - const id = generateNewID() + const id = generateNewID(); V.defaultRules.push({ ID: id, name: `Rule ${id}`, @@ -143,44 +144,44 @@ window.rulesAssistantOptions = (function() { pregSpeed: "no default setting", bellyImplantVol: -1, } - }) - V.currentRule = V.defaultRules[V.defaultRules.length-1] - reload(root) + }); + V.currentRule = V.defaultRules[V.defaultRules.length-1]; + reload(root); } function removeRule(root) { - const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID) - V.defaultRules.splice(idx, 1) - V.currentRule = idx < V.defaultRules.length ? idx : V.defaultRules.length - 1 - reload(root) + const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID); + V.defaultRules.splice(idx, 1); + V.currentRule = idx < V.defaultRules.length ? idx : V.defaultRules.length - 1; + reload(root); } function lowerPriority(root) { - if (V.defaultRules.length === 1) return // nothing to swap with - const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID) - if (idx === 0) return // no lower rule - arraySwap(V.defaultRules, idx, idx-1) - reload(root) + if (V.defaultRules.length === 1) return; // nothing to swap with + const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID); + if (idx === 0) return; // no lower rule + arraySwap(V.defaultRules, idx, idx-1); + reload(root); } function higherPriority(root) { - if (V.defaultRules.length === 1) return // nothing to swap with - const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID) - if (idx === V.defaultRules.length - 1) return // no higher rule - arraySwap(V.defaultRules, idx, idx+1) - reload(root) + if (V.defaultRules.length === 1) return; // nothing to swap with + const idx = V.defaultRules.findIndex(rule => rule.ID === V.currentRule.ID); + if (idx === V.defaultRules.length - 1) return; // no higher rule + arraySwap(V.defaultRules, idx, idx+1); + reload(root); } function changeName(name, root) { - if (name === V.currentRule.name) return - V.currentRule = name - reload(root) + if (name === V.currentRule.name) return; + V.currentRule = name; + reload(root); } // reload the passage function reload(root) { - root.element.remove() - rulesAssistantOptions() + root.element.remove(); + rulesAssistantOptions(); } // the Element class wraps around a DOM element and adds extra functionality @@ -188,20 +189,20 @@ window.rulesAssistantOptions = (function() { // it also turns DOM manipulation into an implementation detail class Element { constructor(...args) { - this.parent = null - this.element = this.render(...args) - this.children = [] + this.parent = null; + this.element = this.render(...args); + this.children = []; } appendChild(child) { - child.parent = this - this.children.push(child) - this.element.appendChild(child.element) + child.parent = this; + this.children.push(child); + this.element.appendChild(child.element); } // return the first argument to simplify creation of basic container items render(...args) { - return args[0] + return args[0]; } } @@ -211,124 +212,124 @@ window.rulesAssistantOptions = (function() { // it can be "bound" to a variable by setting its "onchange" method class List extends Element { constructor(prefix, data, textinput=false) { - super(prefix, textinput) - this.selectedItem = null - this.value = this.element.querySelector(".rajs-value") - data.forEach(item => this.appendChild(...item)) + super(prefix, textinput); + this.selectedItem = null; + this.value = this.element.querySelector(".rajs-value"); + data.forEach(item => this.appendChild(...item)); } render(prefix, textinput) { - const elem = document.createElement("div") - const label = document.createElement("span") - label.innerHTML = prefix - let value + const elem = document.createElement("div"); + const label = document.createElement("span"); + label.innerHTML = prefix; + let value; if (textinput) { - value = document.createElement("input") - value.classList.add("rajs-value") + value = document.createElement("input"); + value.classList.add("rajs-value"); // // call the variable binding when the input field is no longer being edited, and when the enter key is pressed - value.onfocusout = () => { this.inputEdited() } - value.onkeypress = (e) => { onreturn(e, () => { this.inputEdited() })} + value.onfocusout = () => { this.inputEdited(); }; + value.onkeypress = (e) => { onreturn(e, () => { this.inputEdited(); }); }; } else { - value = document.createElement("strong") + value = document.createElement("strong"); } - value.setAttribute("type", "text") - elem.appendChild(label) - elem.appendChild(value) - elem.classList.add("rajs-list") - return elem + value.setAttribute("type", "text"); + elem.appendChild(label); + elem.appendChild(value); + elem.classList.add("rajs-list"); + return elem; } inputEdited() { - if (this.selectedItem) this.selectedItem.deselect() - this.propagateChange() + if (this.selectedItem) this.selectedItem.deselect(); + this.propagateChange(); } selectItem(item) { - if (this.selectedItem) this.selectedItem.deselect() - this.selectedItem = item - setValue(item.data) - this.propagateChange() + if (this.selectedItem) this.selectedItem.deselect(); + this.selectedItem = item; + setValue(item.data); + this.propagateChange(); } selectValue(what) { this.children.some(child => { if (child.data === what) { - child.select() - return true + child.select(); + return true; } - else return false - }) + else return false; + }); } setValue(what) { if (this.value.tagName === "input") - this.value.value = what + this.value.value = what; else - this.value.innerHTML = what + this.value.innerHTML = what; } getData(what) { - return (this.value.tagName === "input" ? this.parse(this.value.value) : this.selectedItem.data) + return (this.value.tagName === "input" ? this.parse(this.value.value) : this.selectedItem.data); } // customisable input field parser / sanity checker - parse(what) { return what } + parse(what) { return what; } propagateChange() { if (this.onchange instanceof Function) - this.onchange(this.getData()) + this.onchange(this.getData()); } } const parse = { integer(string) { - let n = parseInt(string, 10) - return n === NaN? 0: n + let n = parseInt(string, 10); + return isNaN(n)? 0: n; }, boobs(string) { - return Math.clamp(parse.integer(string), 0, 48000) + return Math.clamp(parse.integer(string), 0, 48000); }, butt(string) { - return Math.clamp(parse.integer(string), 0, 10) + return Math.clamp(parse.integer(string), 0, 10); }, lips(string) { - return Math.clamp(parse.integer(string), 0, 100) + return Math.clamp(parse.integer(string), 0, 100); }, dick(string) { - return Math.clamp(parse.integer(string), 0, 10) + return Math.clamp(parse.integer(string), 0, 10); }, balls(string) { - return Math.clamp(parse.integer(string), 0, 10) + return Math.clamp(parse.integer(string), 0, 10); }, - } + }; // a clickable item of a list class ListItem extends Element { constructor(displayvalue, data) { - super(displayvalue) - this.data = data !== undefined ? data: displayvalue - this.selected = false + super(displayvalue); + this.data = data !== undefined ? data: displayvalue; + this.selected = false; } render(displayvalue) { - const elem = document.createElement("span") - elem.classList.add("rajs-listitem") - elem.innerHTML = displayvalue - elem.onclick = () => { return this.select() } - return elem + const elem = document.createElement("span"); + elem.classList.add("rajs-listitem"); + elem.innerHTML = displayvalue; + elem.onclick = () => { return this.select(); }; + return elem; } select() { - if (this.selected) return false - this.parent.selectItem(this) - this.elem.classList.add("selected") - this.selected = true - return true + if (this.selected) return false; + this.parent.selectItem(this); + this.elem.classList.add("selected"); + this.selected = true; + return true; } deselect() { - this.elem.classList.remove("selected") - this.selected = false + this.elem.classList.remove("selected"); + this.selected = false; } } @@ -336,130 +337,130 @@ window.rulesAssistantOptions = (function() { // children are bound to the master list class ListSubSection extends Element { constructor(label, pairs) { - super(label) - pairs.forEach(item => this.appendChild(new ListItem(...item))) + super(label); + pairs.forEach(item => this.appendChild(new ListItem(...item))); } render(label) { - const elem = document.createElement("em") - elem.innerText = label + ":" - return elem + const elem = document.createElement("em"); + elem.innerText = label + ":"; + return elem; } appendChild(child) { - super.appendChild(child) - child.parent = this.parent - this.parent.children.push(child) + super.appendChild(child); + child.parent = this.parent; + this.parent.children.push(child); } } // similar to list, but is just a collection of buttons class Options extends Element { constructor(elements=[]) { - elements.forEach(element => { this.appendChild(element) }) + elements.forEach(element => { this.appendChild(element); }); } render() { - const elem = document.createElement("div") - elem.classList.add("rajs-list") - return elem + const elem = document.createElement("div"); + elem.classList.add("rajs-list"); + return elem; } } // options equivalent of ListItem class OptionsItem extends Element { constructor(label, onclick) { - super(label) - this.label = label - this.onclick = onclick + super(label); + this.label = label; + this.onclick = onclick; } render(label, onclick) { - const elem = document.createElement("span") - elem.classList.add("rajs-listitem") - elem.innerHTML = label - elem.onclick = () => { return this.onclick(this) } - return elem + const elem = document.createElement("span"); + elem.classList.add("rajs-listitem"); + elem.innerHTML = label; + elem.onclick = () => { return this.onclick(this); }; + return elem; } } class ButtonList extends Element { render(label) { - const elem = document.createElement("div") - const labelel = document.createElement("span") - labelel.innerhTML = label += ":" - elem.appendChild(labelel) - return elem + const elem = document.createElement("div"); + const labelel = document.createElement("span"); + labelel.innerhTML = label += ":"; + elem.appendChild(labelel); + return elem; } getSelection() { return (this.children .filter(child => child.selected) .map(child => child.setvalue) - ) + ); } - onchange() { return } + onchange() { return; } } class ButtonItem extends Element { constructor(label, setvalue, selected=false) { - super(label, selected) - this.selected = selected - this.setvalue = setvalue ? setvalue : label + super(label, selected); + this.selected = selected; + this.setvalue = setvalue ? setvalue : label; } render(label, selected) { - const container = document.createElement("div") - container.classList.add("rajs-listitem") + const container = document.createElement("div"); + container.classList.add("rajs-listitem"); - const labelel = document.createElement("span") - labelel.innerHTML = label + const labelel = document.createElement("span"); + labelel.innerHTML = label; - const button = document.createElement("input") - button.setAttribute("type", "checkbox") - button.checked = selected - button.onchange = () => this.onchange(button.checked) + const button = document.createElement("input"); + button.setAttribute("type", "checkbox"); + button.checked = selected; + button.onchange = () => this.onchange(button.checked); - container.appendChild(labelel) - container.appendChild(button) + container.appendChild(labelel); + container.appendChild(button); - return container + return container; } onchange(value) { - this.selected = value - parent.onchange(this) + this.selected = value; + parent.onchange(this); } } // rule import field class NewRuleField extends Element { constructor(root) { - super() - this.root = root + super(); + this.root = root; } render() { - const container = document.createElement("div") - const textarea = document.createElmenet("textarea") - textarea.placeholder = "Paste your rule here" - container.appendChild(textarea) - this.textarea = textarea - const button = document.createElement("button") - button.name = "Load" - button.onclick = () => { this.loadNewRule() } - container.appendChild(button) - return container + const container = document.createElement("div"); + const textarea = document.createElmenet("textarea"); + textarea.placeholder = "Paste your rule here"; + container.appendChild(textarea); + this.textarea = textarea; + const button = document.createElement("button"); + button.name = "Load"; + button.onclick = () => { this.loadNewRule(); }; + container.appendChild(button); + return container; } loadNewRule() { - const text = this.textarea.value + const text = this.textarea.value; try { - const rule = JSON.parse(text) - if (!rule.ID) rule.ID = generateNewID() - reload(this.root) + const rule = JSON.parse(text); + if (!rule.ID) rule.ID = generateNewID(); + reload(this.root); } catch (e) { - alert(e) + alert(e); } } } @@ -467,35 +468,35 @@ window.rulesAssistantOptions = (function() { // the base element, parent of all elements class Root extends Element { constructor() { - super() + super(); if(V.defaultRules.length === 0) { - const paragraph = document.createElement("p") - paragraph.innerHTML = "<strong>No rules</strong>" - this.appendChild(new Element(paragraph)) - this.appendChild(new NoRules(this)) - return + const paragraph = document.createElement("p"); + paragraph.innerHTML = "<strong>No rules</strong>"; + this.appendChild(new Element(paragraph)); + this.appendChild(new NoRules(this)); + return; } - this.appendChild(new RuleSelector(this)) - this.appendChild(new RuleOptions(this)) + this.appendChild(new RuleSelector(this)); + this.appendChild(new RuleOptions(this)); } render(element) { - const greeting = document.createElement("p") - greeting.innerHTML = `<em>${properTitle()}, I will review your slaves and make changes that will have a beneficial effect. Apologies, ${properTitle()}, but this function is... not fully complete. It may have some serious limitations. Please use the 'no default setting' option to identify areas I should not address.</em>` - element.appendChild(greeting) - return element + const greeting = document.createElement("p"); + greeting.innerHTML = `<em>${properTitle()}, I will review your slaves and make changes that will have a beneficial effect. Apologies, ${properTitle()}, but this function is... not fully complete. It may have some serious limitations. Please use the 'no default setting' option to identify areas I should not address.</em>`; + element.appendChild(greeting); + return element; } } // optoins displayed when there are no rules class NoRules extends Options { constructor(root) { - super() - this.root = root - const newrule = new OptionsItem("Add a new rule", () => { newRule(this.root) }) - this.appendChild(newrule) - const importrule = new OptionsItem("Import a rule", () => { this.root.appendChild(new NewRuleField()) }) - this.appendChild(importrule) + super(); + this.root = root; + const newrule = new OptionsItem("Add a new rule", () => { newRule(this.root); }); + this.appendChild(newrule); + const importrule = new OptionsItem("Import a rule", () => { this.root.appendChild(new NewRuleField()); }); + this.appendChild(importrule); } } @@ -503,102 +504,102 @@ window.rulesAssistantOptions = (function() { class RuleSelector extends List { constructor(root) { if (!V.currentRule) - V.currentRule = V.defaultRules[0] - super("Current rule:", V.defaultRules.map(i => [i.name, i.name, i])) + V.currentRule = V.defaultRules[0]; + super("Current rule:", V.defaultRules.map(i => [i.name, i.name, i])); this.onchange = function (rule) { - V.currentRule = rule - reload(root) - } + V.currentRule = rule; + reload(root); + }; } } // buttons for doing transformations on rules class RuleOptions extends Options { constructor(root) { - super() - this.appendChild(new OptionsItem("New Rule", () => newRule(root))) - this.appendChild(new OptionsItem("Remove Rule", () => removeRule(root))) - this.appendChild(new OptionsItem("Apply rules", () => this.appendChild(new ApplicationLog()))) - this.appendChild(new OptionsItem("Lower Priotity", () => lowerPriority(root))) - this.appendChild(new OptionsItem("Higher Priority", () => higherPriority(root))) - this.appendChild(new OptionsItem("Rename", () => this.appendChild(new RenameField(root)))) - this.appendChild(new OptionsItem("Export this rule", () => this.appendChild(new ExportField()))) - this.appendChild(new OptionsItem("Export all rules", () => this.appendChild(new ExportField(true)))) - this.appendChild(new OptionsItem("Import a rule", () => this.appendChild(new NewRuleField()))) + super(); + this.appendChild(new OptionsItem("New Rule", () => newRule(root))); + this.appendChild(new OptionsItem("Remove Rule", () => removeRule(root))); + this.appendChild(new OptionsItem("Apply rules", () => this.appendChild(new ApplicationLog()))); + this.appendChild(new OptionsItem("Lower Priotity", () => lowerPriority(root))); + this.appendChild(new OptionsItem("Higher Priority", () => higherPriority(root))); + this.appendChild(new OptionsItem("Rename", () => this.appendChild(new RenameField(root)))); + this.appendChild(new OptionsItem("Export this rule", () => this.appendChild(new ExportField()))); + this.appendChild(new OptionsItem("Export all rules", () => this.appendChild(new ExportField(true)))); + this.appendChild(new OptionsItem("Import a rule", () => this.appendChild(new NewRuleField()))); } } class ApplicationLog extends Element { render() { - const elem = document.createElement("div") - elem.innerHTML = DefaultRules() - return elem + const elem = document.createElement("div"); + elem.innerHTML = DefaultRules(); + return elem; } } class RenameField extends Element { constructor(root) { - super() - this.element.onfocusout = () => changeName(this.element.value, root) - this.element.onkeypress = (e) => onreturn(e, () => changeName(this.element.value, root)) + super(); + this.element.onfocusout = () => changeName(this.element.value, root); + this.element.onkeypress = (e) => onreturn(e, () => changeName(this.element.value, root)); } render() { - const elem = document.createElement("div") - elem.setAttribute("type", "text") - elem.setAttribute("value", V.currentRule.name) + const elem = document.createElement("div"); + elem.setAttribute("type", "text"); + elem.setAttribute("value", V.currentRule.name); } } class ExportField extends Element { render(all=false) { - const element = document.createElement("textarea") - element.value = all ? JSON.stringify(V.currentRule) : map(i => JSON.stringify(i), V.defaultRules).join("\n\n") - return element + const element = document.createElement("textarea"); + element.value = all ? JSON.stringify(V.currentRule) : map(i => JSON.stringify(i), V.defaultRules).join("\n\n"); + return element; } } // parent section for condition editing class ConditionEditor extends Element { constructor() { - super() - this.appendChild(new ConditionFunction()) - this.appendChild(new AssignmentInclusion()) - this.appendChild(new FacilityInclusion()) - this.appendChild(new SpecialExclusion()) - this.appendChild(new SpecificInclusionExclusion()) + super(); + this.appendChild(new ConditionFunction()); + this.appendChild(new AssignmentInclusion()); + this.appendChild(new FacilityInclusion()); + this.appendChild(new SpecialExclusion()); + this.appendChild(new SpecificInclusionExclusion()); } render() { - const element = document.createElement("div") - return element + const element = document.createElement("div"); + return element; } } class ConditionFunction extends Element { constructor() { - super() - this.fnlist = new List("Activation function:") - this.fneditor = null - ["Never", "Always", "Custom"].forEach(i => this.fnlist.appendChild(i)) - ["Devotion", "Trust", "Health", "Sex drive", "Weight", "Age", "Body Age", "Visible Age", "Muscles", "Lactation", "Pregnancy", "Pregnancy Multiples", "Belly Implant", "Belly Size"].forEach(i => this.fnlist.appendChild(i, this.getAttribute(i))) - this.fnlist.onchange = () => this.fnchanged + super(); + this.fnlist = new List("Activation function:"); + this.fneditor = null; + ["Never", "Always", "Custom"].forEach(i => this.fnlist.appendChild(i)); + ["Devotion", "Trust", "Health", "Sex drive", "Weight", "Age", "Body Age", "Visible Age", "Muscles", "Lactation", "Pregnancy", "Pregnancy Multiples", "Belly Implant", "Belly Size"].forEach(i => this.fnlist.appendChild(i, this.getAttribute(i))); + this.fnlist.onchange = () => this.fnchanged; switch(V.currentRule.condition.function) { case "Never": case "Always": - break + break; case "Custom": - this.appendChild(new CustomEditor(V.currentRule.condition.data)) - break + this.appendChild(new CustomEditor(V.currentRule.condition.data)); + break; default: - this.appendChild(new RangeEditor(V.currentRule.condition.function, V.currentRule.condition.data)) - break + this.appendChild(new RangeEditor(V.currentRule.condition.function, V.currentRule.condition.data)); + break; } } render() { - return document.createElement("div") + return document.createElement("div"); } getAttribute(what) { @@ -617,108 +618,108 @@ window.rulesAssistantOptions = (function() { "Pregnancy Multiples": "pregType", "Belly implant": "bellyImplant", "Belly Size": "belly", - }[what] + }[what]; } fnchanged(value) { if (this.fneditor !== null) { - this.fneditor.element.remove() - this.fneditor = null + this.fneditor.element.remove(); + this.fneditor = null; } switch(value) { case "Never": - V.currentRule.condition.function = false - V.currentRule.condition.data = {} - break + V.currentRule.condition.function = false; + V.currentRule.condition.data = {}; + break; case "Always": - V.currentRule.condition.function = true - V.currentRule.condition.data = {} - break + V.currentRule.condition.function = true; + V.currentRule.condition.data = {}; + break; case "Custom": - V.currentRule.condition.function = "custom" - V.currentRule.condition.data = {} - this.appendChild(new CustomEditor(V.currentRule.condition.data)) - break + V.currentRule.condition.function = "custom"; + V.currentRule.condition.data = {}; + this.appendChild(new CustomEditor(V.currentRule.condition.data)); + break; default: - V.currentRule.condition.function = "between" - V.currentRule.condition.data = { attribute: value, value: [null, null] } - this.appendChild(new RangeEditor(V.currentRule.condition.data)) - break + V.currentRule.condition.function = "between"; + V.currentRule.condition.data = { attribute: value, value: [null, null] }; + this.appendChild(new RangeEditor(V.currentRule.condition.data)); + break; } } } class CustomEditor extends Element { constructor(data) { - if (data.length === 0) data = "function(slave) { return slave.slaveName === 'Fancy Name'; }" - super(data) - this.elem.onfocusout = () => V.currentRule.data = this.elem.value + if (data.length === 0) data = "function(slave) { return slave.slaveName === 'Fancy Name'; }"; + super(data); + this.elem.onfocusout = () => V.currentRule.data = this.elem.value; } render(data) { - const elem = document.createElement("textarea") - elem.setAttribute(value, data) - return elem + const elem = document.createElement("textarea"); + elem.setAttribute(value, data); + return elem; } } class RangeEditor extends Element { render(data) { - const elem = document.createElement("div") + const elem = document.createElement("div"); - const min = document.createElement("input") - min.setAttribute("type", "text") - min.value = data.between[0] - min.onkeypress = e => onreturn(e, () => this.setmin(min.value)) - min.onfocusout = e => this.setmin(min.value) - elem.appendChild(min) + const min = document.createElement("input"); + min.setAttribute("type", "text"); + min.value = data.between[0]; + min.onkeypress = e => onreturn(e, () => this.setmin(min.value)); + min.onfocusout = e => this.setmin(min.value); + elem.appendChild(min); - const max = document.createElement("input") - max.setAttribute("type", "text") - max.value = data.between[0] - max.onkeypress = e => onreturn(e, () => this.setmax(max.value)) - max.onfocusout = e => this.setmax(max.value) - elem.appendChild(max) + const max = document.createElement("input"); + max.setAttribute("type", "text"); + max.value = data.between[0]; + max.onkeypress = e => onreturn(e, () => this.setmax(max.value)); + max.onfocusout = e => this.setmax(max.value); + elem.appendChild(max); - const infobar = document.createElement("div") - infobar.innerHTML = this.info(data.attribute) - elem.appendChild(infobar) + const infobar = document.createElement("div"); + infobar.innerHTML = this.info(data.attribute); + elem.appendChild(infobar); - return elem + return elem; } parse(value) { - value = value.strip() - if (value === "null") value = null + value = value.strip(); + if (value === "null") value = null; else { - value = parseInt(value) - if (value === NaN) value = null + value = parseInt(value); + if (isNan(value)) value = null; } - return value + return value; } setmin(value) { - V.currentRule.data.between[0] = this.parse(value) + V.currentRule.data.between[0] = this.parse(value); } setmax(value) { - V.currentRule.data.between[1] = this.parse(value) + V.currentRule.data.between[1] = this.parse(value); } info(attribute) { - return "TODO" + return "TODO"; } } class AssignmentInclusion extends ButtonList() { constructor() { - super("Apply to assignments") + super("Apply to assignments"); ["Rest", "Fucktoy", "Subordinate Slave", "House Servant", "Confined", "Whore", "Public Servant", "Classes", "Milked", "Gloryhole"].forEach( - i => this.appendChild(new ButtonItem(i, this.getAttribute(i), V.currentRule.condition.assignment.includes(i)))) + i => this.appendChild(new ButtonItem(i, this.getAttribute(i), V.currentRule.condition.assignment.includes(i)))); } onchange() { - V.currentRule.condition.assignment = this.getSelection() + V.currentRule.condition.assignment = this.getSelection(); } getAttribute(what) { @@ -733,31 +734,31 @@ window.rulesAssistantOptions = (function() { "Classes": "take classes", "Milked": "get milked", "Gloryhole": "work a glory hole", - }[what] + }[what]; } } class FacilityInclusion extends ButtonList() { constructor() { - super("Apply to assignments") - const facilities = [] - if (V.HGSuite > 0) facilities.push("Head Girl Suite") - if (V.brothel > 0) facilities.push("Brothel") - if (V.club > 0) facilities.push("Club") - if (V.arcade > 0) facilities.push("Arcade") - if (V.dairy > 0) facilities.push("Dairy") - if (V.servantQuarters > 0) facilities.push("Servant Quarters") - if (V.masterSuite > 0) facilities.push("Master Suite") - if (V.schoolroom > 0) facilities.push("Schoolroom") - if (V.spa > 0) facilities.push("Spa") - if (V.clinic > 0) facilities.push("Clinic") - if (V.cellblock > 0) facilities.push("Cellblock") + super("Apply to assignments"); + const facilities = []; + if (V.HGSuite > 0) facilities.push("Head Girl Suite"); + if (V.brothel > 0) facilities.push("Brothel"); + if (V.club > 0) facilities.push("Club"); + if (V.arcade > 0) facilities.push("Arcade"); + if (V.dairy > 0) facilities.push("Dairy"); + if (V.servantQuarters > 0) facilities.push("Servant Quarters"); + if (V.masterSuite > 0) facilities.push("Master Suite"); + if (V.schoolroom > 0) facilities.push("Schoolroom"); + if (V.spa > 0) facilities.push("Spa"); + if (V.clinic > 0) facilities.push("Clinic"); + if (V.cellblock > 0) facilities.push("Cellblock"); facilities.forEach( - i => this.appendChild(new ButtonItem(i, this.getAttribute(i), V.currentRule.condition.facility.includes(i)))) + i => this.appendChild(new ButtonItem(i, this.getAttribute(i), V.currentRule.condition.facility.includes(i)))); } onchange(value) { - V.currentRule.condition.facility = this.getSelection() + V.currentRule.condition.facility = this.getSelection(); } getAttribute(what) { @@ -773,7 +774,7 @@ window.rulesAssistantOptions = (function() { "Spa": "rest in the spa", "Clinic": "get treatment in the clinic", "Cellblock": "be confined in the cellblock", - }[what] + }[what]; } } @@ -782,1616 +783,1616 @@ window.rulesAssistantOptions = (function() { const items = [ ["Yes", true], ["No", false] - ] - super("Exclude special slaves:", items) - this.setValue(V.currentRule.excludeSpecialSlaves) - this.onchange = (value) => V.currentRule.excludeSpecialSlaves = value + ]; + super("Exclude special slaves:", items); + this.setValue(V.currentRule.excludeSpecialSlaves); + this.onchange = (value) => V.currentRule.excludeSpecialSlaves = value; } } class SpecificInclusionExclusion extends Options { constructor() { - super() - this.appendChild(new OptionsItem("Limit to specific slaves", () => Engine.display("Rules Slave Select"))) - this.appendChild(new OptionsItem("Exclude specific slaveS", () => Engine.display("Rules Slave Exclude"))) + super(); + this.appendChild(new OptionsItem("Limit to specific slaves", () => Engine.display("Rules Slave Select"))); + this.appendChild(new OptionsItem("Exclude specific slaveS", () => Engine.display("Rules Slave Exclude"))); } } // parent section for effect editing class EffectEditor extends Element { constructor() { - super() - this.appendChild(new AppearanceSection()) - this.appendChild(new CosmeticSection()) - this.appendChild(new BodyModSection()) - this.appendChild(new AutosurgerySection()) - this.appendChild(new RegimenSection()) - this.appendChild(new BehaviourSection()) + super(); + this.appendChild(new AppearanceSection()); + this.appendChild(new CosmeticSection()); + this.appendChild(new BodyModSection()); + this.appendChild(new AutosurgerySection()); + this.appendChild(new RegimenSection()); + this.appendChild(new BehaviourSection()); } render() { - const element = document.createElement("div") - return element + const element = document.createElement("div"); + return element; } } class AppearanceSection extends Element { constructor() { - super() - this.appendChild(new ClothesList()) - this.appendChild(new CollarList()) - this.appendChild(new ShoeList()) - this.appendChild(new CorsetList()) - this.appendChild(new VagAccVirginsList()) - this.appendChild(new VagAccAVirginsList()) - this.appendChild(new VagAccOtherList()) + super(); + this.appendChild(new ClothesList()); + this.appendChild(new CollarList()); + this.appendChild(new ShoeList()); + this.appendChild(new CorsetList()); + this.appendChild(new VagAccVirginsList()); + this.appendChild(new VagAccAVirginsList()); + this.appendChild(new VagAccOtherList()); if (V.seeDicks !== 0 || V.makeDicks !== 0) { - this.appendChild(new DickAccVirginsList()) - this.appendChild(new DickAccOtherList()) + this.appendChild(new DickAccVirginsList()); + this.appendChild(new DickAccOtherList()); } - this.appendChild(new ButtplugsVirginsList()) - this.appendChild(new ButtplugsOtherList()) - this.appendChild(new ImplantVolumeList()) - this.appendChild(new AutosurgerySwitch()) + this.appendChild(new ButtplugsVirginsList()); + this.appendChild(new ButtplugsOtherList()); + this.appendChild(new ImplantVolumeList()); + this.appendChild(new AutosurgerySwitch()); } render() { - return document.createElement("div") + return document.createElement("div"); } } class RegimenSection extends Element { constructor() { - super() - this.appendChild(new GrowthList()) - this.appendChild(new CurrativesList()) - this.appendChild(new AphrodisiacList()) - this.appendChild(new ContraceptiveList()) + super(); + this.appendChild(new GrowthList()); + this.appendChild(new CurrativesList()); + this.appendChild(new AphrodisiacList()); + this.appendChild(new ContraceptiveList()); if (V.pregSpeedControl) - this.appendChild(new PregDrugsList()) - this.appendChild(new FemaleHormonesList()) - this.appendChild(new ShemaleHormonesList()) - this.appendChild(new GeldingHormonesList()) - this.appendChild(new OtherDrugsList()) - this.appendChild(new DietList()) - this.appendChild(new DietGrowthList()) - this.appendChild(new DietBaseList()) - this.appendChild(new MuscleList()) - this.appendChild(new BraceList()) + this.appendChild(new PregDrugsList()); + this.appendChild(new FemaleHormonesList()); + this.appendChild(new ShemaleHormonesList()); + this.appendChild(new GeldingHormonesList()); + this.appendChild(new OtherDrugsList()); + this.appendChild(new DietList()); + this.appendChild(new DietGrowthList()); + this.appendChild(new DietBaseList()); + this.appendChild(new MuscleList()); + this.appendChild(new BraceList()); } render() { - return document.createElement("div") + return document.createElement("div"); } } class BehaviourSection extends Element { constructor() { - super() - this.appendChild(new LivingStandardList()) - this.appendChild(new PunishmentList()) - this.appendChild(new RewardList()) - this.appendChild(new ReleaseList()) - this.appendChild(new SmartFetishList()) - this.appendChild(new SmartXYAttractionList()) - this.appendChild(new SmartXXAttractionList()) - this.appendChild(new SmartEnergyList()) - this.appendChild(new SpeechList()) - this.appendChild(new RelationshipList()) + super(); + this.appendChild(new LivingStandardList()); + this.appendChild(new PunishmentList()); + this.appendChild(new RewardList()); + this.appendChild(new ReleaseList()); + this.appendChild(new SmartFetishList()); + this.appendChild(new SmartXYAttractionList()); + this.appendChild(new SmartXXAttractionList()); + this.appendChild(new SmartEnergyList()); + this.appendChild(new SpeechList()); + this.appendChild(new RelationshipList()); if (V.studio === 1) - this.appendChild(new PornList()) + this.appendChild(new PornList()); } render() { - return document.createElement("div") + return document.createElement("div"); } } class CosmeticSection extends Element { constructor() { - super() - this.appendChild(new EyewearList()) - this.appendChild(new LensesList()) - this.appendChild(new MakeupList()) - this.appendChild(new NailsList()) - this.appendChild(new HairLengthList()) - this.appendChild(new HairColourList()) - this.appendChild(new HairStyleList()) - this.appendChild(new PubicHairColourList()) - this.appendChild(new PubicHairStyleList()) - this.appendChild(new ArmpitHairColourList()) - this.appendChild(new ArmpitHairStyleList()) + super(); + this.appendChild(new EyewearList()); + this.appendChild(new LensesList()); + this.appendChild(new MakeupList()); + this.appendChild(new NailsList()); + this.appendChild(new HairLengthList()); + this.appendChild(new HairColourList()); + this.appendChild(new HairStyleList()); + this.appendChild(new PubicHairColourList()); + this.appendChild(new PubicHairStyleList()); + this.appendChild(new ArmpitHairColourList()); + this.appendChild(new ArmpitHairStyleList()); } } class BodyModSection extends Element { constructor() { - super() - this.appendChild(new EarPiercingList()) - this.appendChild(new NosePiercingList()) - this.appendChild(new EyebrowPiercingList()) - this.appendChild(new NavelPiercingList()) - this.appendChild(new NipplePiercingList()) - this.appendChild(new AreolaPiercingList()) - this.appendChild(new LipPiercingList()) - this.appendChild(new TonguePiercingList()) - this.appendChild(new ClitPiercingList()) - this.appendChild(new LabiaPiercingList()) - this.appendChild(new ShaftPiercingList()) - this.appendChild(new PerineumPiercingList()) - this.appendChild(new CorsetPiercingList()) - - this.appendChild(new AutoBrandingList()) - this.appendChild(new BrandingLocationList()) - this.appendChild(new BrandDesignList()) - - this.appendChild(new FaceTattooList()) - this.appendChild(new ShoulderTattooList()) - this.appendChild(new ChestTattooList()) - this.appendChild(new ArmTattooList()) - this.appendChild(new UpperBackTattooList()) - this.appendChild(new LowerBackTattooList()) - this.appendChild(new AbdomenTattooList()) + super(); + this.appendChild(new EarPiercingList()); + this.appendChild(new NosePiercingList()); + this.appendChild(new EyebrowPiercingList()); + this.appendChild(new NavelPiercingList()); + this.appendChild(new NipplePiercingList()); + this.appendChild(new AreolaPiercingList()); + this.appendChild(new LipPiercingList()); + this.appendChild(new TonguePiercingList()); + this.appendChild(new ClitPiercingList()); + this.appendChild(new LabiaPiercingList()); + this.appendChild(new ShaftPiercingList()); + this.appendChild(new PerineumPiercingList()); + this.appendChild(new CorsetPiercingList()); + + this.appendChild(new AutoBrandingList()); + this.appendChild(new BrandingLocationList()); + this.appendChild(new BrandDesignList()); + + this.appendChild(new FaceTattooList()); + this.appendChild(new ShoulderTattooList()); + this.appendChild(new ChestTattooList()); + this.appendChild(new ArmTattooList()); + this.appendChild(new UpperBackTattooList()); + this.appendChild(new LowerBackTattooList()); + this.appendChild(new AbdomenTattooList()); if (V.seeDicks || V.makeDicks) - this.appendChild(new DickTattooList()) - this.appendChild(new ButtockTattooList()) - this.appendChild(new AnalTattooList()) - this.appendChild(new LegTattooList()) + this.appendChild(new DickTattooList()); + this.appendChild(new ButtockTattooList()); + this.appendChild(new AnalTattooList()); + this.appendChild(new LegTattooList()); } } class AutoSurgerySection extends Element { constructor() { - super() - this.appendChild(new VisionSurgeryList()) - this.appendChild(new LactationSurgeryList()) + super(); + this.appendChild(new VisionSurgeryList()); + this.appendChild(new LactationSurgeryList()); if (V.seeDicks || V.makeDicks) - this.appendChild(new SemenSurgeryList()) - this.appendChild(new CosmeticSurgeryList()) - this.appendChild(new LipSurgeryList()) - this.appendChild(new ButtSurgeryList()) - this.appendChild(new BreastSurgeryList()) - this.appendChild(new TighteningSurgeryList()) - this.appendChild(new BodyHairSurgeryList()) - this.appendChild(new HairSurgeryList()) - } -} - -class ClothesList extends List { - constructor() { - const items = [ - ["Select her own outfit", "choosing her own clothes"] - ] - super("Clothes", items) - - const nclothes = [ - ["No default clothes setting", "no default setting"], - ["Bangles", "slutty jewelry"], - ["Bodysuit", "a comfortable bodysuit"], - ["Cheerleader outfit", "a cheerleader outfit"], - ["Clubslut netting", "clubslut netting"], - ["Cutoffs and a t-shirt", "cutoffs and a t-shirt"], - ["Fallen nun", "a fallen nuns habit"], - ["Halter top", "a halter top dress"], - ["Hijab and abaya", "a hijab and abaya"], - ["Latex catsuit", "a latex catsuit"], - ["Leotard", "a leotard"], - ["Maid (nice)", "a nice maid outfit"], - ["Maid (slutty)", "a slutty maid outfit"], - ["Military uniform", "a military uniform"], - ["Mini dress", "a mini dress"], - ["Nice lingerie", "attractive lingerie"], - ["Nurse (nice)", "a nice nurse outfit"], - ["Schoolgirl", "a schoolgirl outfit"], - ["Silken ballgown", "a ball gown"], - ["Skimpy battledress", "battledress"], - ["Slave gown", "a slave gown"], - ["Slutty outfit", "a slutty outfit"], - ["String bikini", "a stirng bikini"], - ["Scalemail bikini", "a scalemail bikini"], - ["Succubus costume", "a succubus outfit"], - ["Suit (nice)", "nice business sattire"], - ["Suit (slutty", "slutty business attire"], - ["Spats and tank top", "spats and a tank top"] - ] - const fsnclothes = [ - ["Body oil (FS)", "body oil"], - ["Bunny outfit (FS)", "a bunny outfit"], - ["Chattel habit (FS)", "a chattel habit"], - ["Conservative clothing (FS)", "conservative clothing"], - ["Harem gauze (FS)", "harem gauze"], - ["Huipil (FS)", "a huipil"], - ["Kimono (FS)", "a kimono"], - ["Maternity dress (FS)", "a maternity dress"], - ["Maternity lingerie (FS)", "attractive lingerie for a pregnant woman"], - ["Slutty qipao (FS)", "a slutty qipao"], - ["Stretch pants and a crop-top (FS)", "stretch pants and a crop-top"], - ["Toga (FS)", "a toga"], - ["Western clothing (FS)", "Western clothing"], - ] - fsnclothes.forEach(pair => { if (isItemAccessible(pair[1])) nclothes.push(pair) }) - const nice = new ListSubSection("Nice", nclothes) - this.appendChild(nice) - - const hclothes = [ -`` ["Nude", "no clothing"] - ["Penitent nun", "a penitent nuns habit"], - ["Restrictive latex", "restrictive latex"], - ["Shibari ropes", "shibari ropes"], - ["Uncomfortable straps", "uncomfortable straps"] - ] - const fshclothes = [ - ["Chains (FS)", "chains"], - ] - fshclothes.forEach(pair => { if (isItemAccessible(pair[1])) hclothes.push(pair) }) - - const harsh = new ListSubSection("Harsh", hclothes) - this.appendChild(harsh) - - this.setValue(V.currentRule.set.clothes) - this.onchange = (data) => V.currentRule.set.clothes = value - } -} - -class CollarList extends List { - constructor() { - const items = [ - ["No default collar setting", "no default setting"] - ["No collar", "none"] - ] - super("Collar", items) - - const ncollars = [ - ["Stylish leather", "stylish leather"], - ["Satin choker", "satin choker"], - ["Silken Ribbon", "silk ribbon"], - ["Heavy Gold", "heavy gold"], - ["Pretty jewelry", "pretty jewelry"], - ["Cowbell", "leather with cowbell"] - ] - if (V.seeAge !== 0) - ncollars.push(["Nice retirement counter", "nice retirement counter"]) - const fsncollars = [ - ["Bowtie collar", "bowtie"], - ["ancient Egyptian", "ancient Egyptian"], - ] - fsncollars.forEach(pair => { if (isItemAccessible(pair[1])) ncollars.push(pair) }) - const nice = new ListSubSection("Nice", ncollars) - this.appendChild(nice) - - const hcollars = [ - ["Tight steel", "tight steel"], - ["Uncomfortable leather", "uncomfortable leather"], - ["Pregnancy biometrics", "preg biometrics"], - ["Shock punishment", "shock punishment"], - ["Dildo gag", "dildo gag"], - ["Ball gag", "ball gag"], - ["Bit gag", "bit gag"], - ["Neck corset", "neck corset"], - ] - if (V.seeAge !== 0) - hcollars.push(["Cruel retirement counter", "cruel retirement counter"]) - if (V.toysBoughtGags === 1) - hcollars.push(["Massive dildo gag", "massive dildo gag"]) - const harsh = new ListSubSection("Harsh", hcollars) - this.appendChild(harsh) - - this.setValue(V.currentRule.set.collar) - this.onchange = (value) => V.currentRule.set.collar = value - } -} - -class ShoeList extends List { - constructor() { - super("Shoes", setup.shoes) - this.setValue(V.currentRule.set.shoes) - this.onchange = (value) => V.currentRule.set.shoes = value - } -} - -class CorsetList extends List { - constructor() { - const bellies = [] - setup.bellyAccessories.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - bellies.push([acc.name, acc.value]) - else if (acc.fs === "repopulation" && V.arcologies[0].FSRepopulationFocus !== "unset") - bellies.push([acc.name + " (FS)", acc.value]) - else if (acc.rs === "boughtBelly" && V.clothesBoughtBelly === 1) - bellies.push([acc.name + " (Purchased)", acc.value]) - }) - super("Corsetage", bellies) - this.setValue(V.currentRule.set.bellyAccessory) - this.onchange = (value) => V.currentRule.set.bellyAccessory - } -} - -class VagAccVirginsList extends List { - constructor() { - const accs = [] - setup.vaginalAccessories.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - accs.push([acc.name, acc.value]) - else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) - accs.push([acc.name + " (Purchased)", acc.value]) - }) - super("Vaginal accessories for virgins") - this.setValue(V.currentRule.set.virginAccessory) - this.onchange = (value) => V.currentRule.set.virginAccessory = value + this.appendChild(new SemenSurgeryList()); + this.appendChild(new CosmeticSurgeryList()); + this.appendChild(new LipSurgeryList()); + this.appendChild(new ButtSurgeryList()); + this.appendChild(new BreastSurgeryList()); + this.appendChild(new TighteningSurgeryList()); + this.appendChild(new BodyHairSurgeryList()); + this.appendChild(new HairSurgeryList()); } } -class VagAccAVirginsList extends List { - constructor() { - const accs = [] - setup.vaginalAccessories.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - accs.push([acc.name, acc.value]) - else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) - accs.push([acc.name + " (Purchased)", acc.value]) - }) - super("Vaginal accessories for anal virgins") - this.setValue(V.currentRule.set.aVirginAccessory) - this.onchange = (value) => V.currentRule.set.aVirginAccessory = value + class ClothesList extends List { + constructor() { + const items = [ + ["Select her own outfit", "choosing her own clothes"] + ]; + super("Clothes", items); + + const nclothes = [ + ["No default clothes setting", "no default setting"], + ["Bangles", "slutty jewelry"], + ["Bodysuit", "a comfortable bodysuit"], + ["Cheerleader outfit", "a cheerleader outfit"], + ["Clubslut netting", "clubslut netting"], + ["Cutoffs and a t-shirt", "cutoffs and a t-shirt"], + ["Fallen nun", "a fallen nuns habit"], + ["Halter top", "a halter top dress"], + ["Hijab and abaya", "a hijab and abaya"], + ["Latex catsuit", "a latex catsuit"], + ["Leotard", "a leotard"], + ["Maid (nice)", "a nice maid outfit"], + ["Maid (slutty)", "a slutty maid outfit"], + ["Military uniform", "a military uniform"], + ["Mini dress", "a mini dress"], + ["Nice lingerie", "attractive lingerie"], + ["Nurse (nice)", "a nice nurse outfit"], + ["Schoolgirl", "a schoolgirl outfit"], + ["Silken ballgown", "a ball gown"], + ["Skimpy battledress", "battledress"], + ["Slave gown", "a slave gown"], + ["Slutty outfit", "a slutty outfit"], + ["String bikini", "a stirng bikini"], + ["Scalemail bikini", "a scalemail bikini"], + ["Succubus costume", "a succubus outfit"], + ["Suit (nice)", "nice business sattire"], + ["Suit (slutty", "slutty business attire"], + ["Spats and tank top", "spats and a tank top"] + ]; + const fsnclothes = [ + ["Body oil (FS)", "body oil"], + ["Bunny outfit (FS)", "a bunny outfit"], + ["Chattel habit (FS)", "a chattel habit"], + ["Conservative clothing (FS)", "conservative clothing"], + ["Harem gauze (FS)", "harem gauze"], + ["Huipil (FS)", "a huipil"], + ["Kimono (FS)", "a kimono"], + ["Maternity dress (FS)", "a maternity dress"], + ["Maternity lingerie (FS)", "attractive lingerie for a pregnant woman"], + ["Slutty qipao (FS)", "a slutty qipao"], + ["Stretch pants and a crop-top (FS)", "stretch pants and a crop-top"], + ["Toga (FS)", "a toga"], + ["Western clothing (FS)", "Western clothing"], + ]; + fsnclothes.forEach(pair => { if (isItemAccessible(pair[1])) nclothes.push(pair); }); + const nice = new ListSubSection("Nice", nclothes); + this.appendChild(nice); + + const hclothes = [ + ["Nude", "no clothing"], + ["Penitent nun", "a penitent nuns habit"], + ["Restrictive latex", "restrictive latex"], + ["Shibari ropes", "shibari ropes"], + ["Uncomfortable straps", "uncomfortable straps"] + ]; + const fshclothes = [ + ["Chains (FS)", "chains"], + ]; + fshclothes.forEach(pair => { if (isItemAccessible(pair[1])) hclothes.push(pair); }); + + const harsh = new ListSubSection("Harsh", hclothes); + this.appendChild(harsh); + + this.setValue(V.currentRule.set.clothes); + this.onchange = (data) => V.currentRule.set.clothes = value; + } + } + + class CollarList extends List { + constructor() { + const items = [ + ["No default collar setting", "no default setting"], + ["No collar", "none"], + ]; + super("Collar", items); + + const ncollars = [ + ["Stylish leather", "stylish leather"], + ["Satin choker", "satin choker"], + ["Silken Ribbon", "silk ribbon"], + ["Heavy Gold", "heavy gold"], + ["Pretty jewelry", "pretty jewelry"], + ["Cowbell", "leather with cowbell"] + ]; + if (V.seeAge !== 0) + ncollars.push(["Nice retirement counter", "nice retirement counter"]); + const fsncollars = [ + ["Bowtie collar", "bowtie"], + ["ancient Egyptian", "ancient Egyptian"], + ]; + fsncollars.forEach(pair => { if (isItemAccessible(pair[1])) ncollars.push(pair); }); + const nice = new ListSubSection("Nice", ncollars); + this.appendChild(nice); + + const hcollars = [ + ["Tight steel", "tight steel"], + ["Uncomfortable leather", "uncomfortable leather"], + ["Pregnancy biometrics", "preg biometrics"], + ["Shock punishment", "shock punishment"], + ["Dildo gag", "dildo gag"], + ["Ball gag", "ball gag"], + ["Bit gag", "bit gag"], + ["Neck corset", "neck corset"], + ]; + if (V.seeAge !== 0) + hcollars.push(["Cruel retirement counter", "cruel retirement counter"]); + if (V.toysBoughtGags === 1) + hcollars.push(["Massive dildo gag", "massive dildo gag"]); + const harsh = new ListSubSection("Harsh", hcollars); + this.appendChild(harsh); + + this.setValue(V.currentRule.set.collar); + this.onchange = (value) => V.currentRule.set.collar = value; + } + } + + class ShoeList extends List { + constructor() { + super("Shoes", setup.shoes); + this.setValue(V.currentRule.set.shoes); + this.onchange = (value) => V.currentRule.set.shoes = value; + } } -} -class VagAccOtherList extends List { - constructor() { - const accs = [] - setup.vaginalAccessories.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - accs.push([acc.name, acc.value]) - else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) - accs.push([acc.name + " (Purchased)", acc.value]) - }) - super("Vaginal accessories for other slaves") - this.setValue(V.currentRule.set.vaginalAccessory) - this.onchange = (value) => V.currentRule.set.vaginalAccessory = value + class CorsetList extends List { + constructor() { + const bellies = []; + setup.bellyAccessories.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + bellies.push([acc.name, acc.value]); + else if (acc.fs === "repopulation" && V.arcologies[0].FSRepopulationFocus !== "unset") + bellies.push([acc.name + " (FS)", acc.value]); + else if (acc.rs === "boughtBelly" && V.clothesBoughtBelly === 1) + bellies.push([acc.name + " (Purchased)", acc.value]); + }); + super("Corsetage", bellies); + this.setValue(V.currentRule.set.bellyAccessory); + this.onchange = (value) => V.currentRule.set.bellyAccessory; + } + } + + class VagAccVirginsList extends List { + constructor() { + const accs = []; + setup.vaginalAccessories.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Vaginal accessories for virgins"); + this.setValue(V.currentRule.set.virginAccessory); + this.onchange = (value) => V.currentRule.set.virginAccessory = value; + } } -} -class DickAccVirginsList extends List { - constructor() { - super("Dick accessories for anal virgins", setup.dickAccessories) - this.setValue(V.currentRule.set.aVirginDickAccessory) - this.onchange = (value) => V.currentRule.set.aVirginDickAccessory = value + class VagAccAVirginsList extends List { + constructor() { + const accs = []; + setup.vaginalAccessories.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Vaginal accessories for anal virgins"); + this.setValue(V.currentRule.set.aVirginAccessory); + this.onchange = (value) => V.currentRule.set.aVirginAccessory = value; + } } -} -class DickAccOtherList extends List { - constructor() { - super("Dick accessories for other slaves", setup.dickAccessories) - this.setValue(V.currentRule.set.dickAccessory) - this.onchange = (value) => V.currentRule.set.dickAccessory = value + class VagAccOtherList extends List { + constructor() { + const accs = []; + setup.vaginalAccessories.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyBigDildos" && V.toysBoughtDildos === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Vaginal accessories for other slaves"); + this.setValue(V.currentRule.set.vaginalAccessory); + this.onchange = (value) => V.currentRule.set.vaginalAccessory = value; + } } -} -class ButtplugsVirginsList extends List { - constructor() { - const accs = [] - setup.buttplugs.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - accs.push([acc.name, acc.value]) - else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) - accs.push([acc.name + " (Purchased)", acc.value]) - }) - super("Buttplugs for anal virgins") - this.setValue(V.currentRule.set.aVirginButtplug) - this.onchange = (value) => V.currentRule.set.aVirginButtplug = value + class DickAccVirginsList extends List { + constructor() { + super("Dick accessories for anal virgins", setup.dickAccessories); + this.setValue(V.currentRule.set.aVirginDickAccessory); + this.onchange = (value) => V.currentRule.set.aVirginDickAccessory = value; + } } -} -class ButtplugsOtherList extends List { - constructor() { - const accs = [] - setup.buttplugs.forEach(acc => { - if (acc.fs === undefined && acc.rs === undefined) - accs.push([acc.name, acc.value]) - else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) - accs.push([acc.name + " (Purchased)", acc.value]) - }) - super("Buttplugs for other slaves") - this.setValue(V.currentRule.set.buttplug) - this.onchange = (value) => V.currentRule.set.buttplug = value + class DickAccOtherList extends List { + constructor() { + super("Dick accessories for other slaves", setup.dickAccessories); + this.setValue(V.currentRule.set.dickAccessory); + this.onchange = (value) => V.currentRule.set.dickAccessory = value; + } } -} -class ImplantVolumeList extends List { - 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] - ] - super("Belly implant target volume (if present)") - this.setValue(V.currentRule.set.bellyImplantVol) - this.onchange = (value) => V.currentRule.set.bellyImplantVol = value + class ButtplugsVirginsList extends List { + constructor() { + const accs = []; + setup.buttplugs.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Buttplugs for anal virgins"); + this.setValue(V.currentRule.set.aVirginButtplug); + this.onchange = (value) => V.currentRule.set.aVirginButtplug = value; + } } -} -class AutosurgerySwitch extends List { - constructor() { - const pairs = [ - ["Activate", 1] - ["Off", 0] - ] - super("Assistant-applied implants (Autosurgery global switch)", pairs) - this.setValue(V.currentRule.set.autoSurgery) - this.onchange = (value) => V.currentRule.set.autoSurgery = value + class ButtplugsOtherList extends List { + constructor() { + const accs = []; + setup.buttplugs.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Buttplugs for other slaves"); + this.setValue(V.currentRule.set.buttplug); + this.onchange = (value) => V.currentRule.set.buttplug = value; + } } -} -class GrowthList extends Options { - constructor() { - super() - this.sublists = [] - const pairs = [ - ["No default setting", () => this.nds()], - ["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) - } - - this.sublists.forEach(i => this.appendChild(i)) - } - - render() { - const elem = document.createElement("div") - const span = document.createElement("span") - span.innerHTML = "Growth hormone regimes for healthy slaves:" - elem.appendChild(span) - return elem - } - - nds() { - [this.breasts, this.butts, this.lips, this.dicks, this.balls].forEach(i => { - i.setValue("no default change") - i.propagateChange() - }) - } - - girlish() { - this.breasts.setValue(350) - this.butts.setValue(2) - this.lips.setValue(25) - if (this.dicks) this.dicks.setValue(0) - if (this.balls) this.balls.setValue(0) - this.sublists.forEach(i => i.propagateChange()) - } - - stacked() { - this.breasts.setValue(1000) - this.butts.setValue(4) - this.lips.setValue(25) - if (this.dicks) this.dicks.setValue(4) - if (this.balls) this.balls.setValue(4) - this.sublists.forEach(i => i.propagateChange()) - } - - huge() { - this.breasts.setValue(9000) - this.butts.setValue(10) - this.lips.setValue(45) - if (this.dicks) this.dicks.setValue(6) - if (this.balls) this.balls.setValue(6) - this.sublists.forEach(i => i.propagateChange()) - } - - unlimited() { - this.breasts.setValue(48000) - this.butts.setValue(10) - this.lips.setValue(100) - if (this.dicks) this.dicks.setValue(10) - if (this.balls) this.balls.setValue(6) - this.sublists.forEach(i => i.propagateChange()) - } - - none() { - this.sublists.forEach(i => { - i.setValue(0) - i.propagateChange() - }) + class ImplantVolumeList extends List { + 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] + ]; + super("Belly implant target volume (if present)"); + this.setValue(V.currentRule.set.bellyImplantVol); + this.onchange = (value) => V.currentRule.set.bellyImplantVol = value; + } + } + + class AutosurgerySwitch extends List { + constructor() { + const pairs = [ + ["Activate", 1], + ["Off", 0], + ]; + super("Assistant-applied implants (Autosurgery global switch)", pairs); + this.setValue(V.currentRule.set.autoSurgery); + this.onchange = (value) => V.currentRule.set.autoSurgery = value; + } } -} -class BreastGrowthList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["B Cup", 350], - ["D Cup", 1000], - ["Monstrous", 9000], - ["Unlimited", 48000], - ["None", 0] - ] - super("Breasts", pairs, true) - this.setValue(V.currentRule.set.growth_boobs) - this.onchange = (value) => V.currentRule.set.growth_boobs = value - } -} + class GrowthList extends Options { + constructor() { + super(); + this.sublists = []; + const pairs = [ + ["No default setting", () => this.nds()], + ["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); + } -class ButtGrowthList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Cute", 2], - ["Big", 4], - ["Huge", 6], - ["Unlimited", 10], - ["None", 0] - ] - super("Butts", pairs, true) - this.setValue(V.currentRule.set.growth_butt) - this.onchange = (value) => V.currentRule.set.growth_butt = value - } -} + this.sublists.forEach(i => this.appendChild(i)); + } -class LipGrowthList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Plump", 25], - ["Beestung", 45], - ["Facepussy", 100], - ["None", 0] - ] - super("Lips", pairs, true) - this.setValue(V.currentRule.set.growth_lips) - this.onchange = (value) => V.currentRule.set.growth_lips = value - } -} + render() { + const elem = document.createElement("div"); + const span = document.createElement("span"); + span.innerHTML = "Growth hormone regimes for healthy slaves:"; + elem.appendChild(span); + return elem; + } -class DickGrowthList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Above average", 4], - ["Pornstar", 6], - ["Unlimited", 10], - ["None", 0] - ] - super("Dicks, if present", pairs, true) - this.setValue(V.currentRule.set.growth_dick) - this.onchange = (value) => V.currentRule.set.growth_dick = value - } -} + nds() { + [this.breasts, this.butts, this.lips, this.dicks, this.balls].forEach(i => { + i.setValue("no default change"); + i.propagateChange(); + }); + } -class BallGrowthList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Sizeable", 4], - ["Cumslave", 6], - ["Unlimited", 10], - ["None", 0] - ] - super("Balls, if present", pairs, true) - this.setValue(V.currentRule.set.growth_balls) - this.onchange = (value) => V.currentRule.set.growth_balls = value - } -} + girlish() { + this.breasts.setValue(350); + this.butts.setValue(2); + this.lips.setValue(25); + if (this.dicks) this.dicks.setValue(0); + if (this.balls) this.balls.setValue(0); + this.sublists.forEach(i => i.propagateChange()); + } -class CurrativesList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", "none", 0], - ["Preventatives", "preventatives", 1], - ["Curatives", "curatives", 2] - ] - super("Health drugs", pairs) - this.setValue(V.currentRule.set.curatives) - this.onchange = (value) => V.currentRule.set.curatives = value - } -} + stacked() { + this.breasts.setValue(1000); + this.butts.setValue(4); + this.lips.setValue(25); + if (this.dicks) this.dicks.setValue(4); + if (this.balls) this.balls.setValue(4); + this.sublists.forEach(i => i.propagateChange()); + } -class AphrodisiacList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", "none", 0], - ["Standard", "standard", 1], - ["Extreme", "extreme", 2], - ["Anaphrodisiacs", "anaphrodisiacs", -1] - ] - super("Aphrodisiacs", pairs) - this.setValue(V.currentRule.set.aphrodisiacs) - this.onchange = (value) => V.currentRule.set.aphrodisiacs = value - } -} + huge() { + this.breasts.setValue(9000); + this.butts.setValue(10); + this.lips.setValue(45); + if (this.dicks) this.dicks.setValue(6); + if (this.balls) this.balls.setValue(6); + this.sublists.forEach(i => i.propagateChange()); + } -class ContraceptiveList extends List { - constructor() { - const drugs = [ - ["No default setting", "no default setting"], - ["Contraceptives", "contraceptives", -1] - ["Fertile", "fertile", 0], - ["Very fertile", "very fertile", 1], - ["Extremely fertile", "extremely fertile", 2], - ] - if (V.seeHyperPreg === 1 && V.superFertilityDrugs === 1) { - drugs.push(["Hyper fertile", "hyper fertile", 3]) - drugs.push(["Maximize fertility", "maximize fertility", 4]) - } - super("Contraceptives for fertile slaves", drugs) - this.setValue(V.currentRule.set.preg) - this.onchange = (value) => V.currentRule.set.preg = value - } -} + unlimited() { + this.breasts.setValue(48000); + this.butts.setValue(10); + this.lips.setValue(100); + if (this.dicks) this.dicks.setValue(10); + if (this.balls) this.balls.setValue(6); + this.sublists.forEach(i => i.propagateChange()); + } -class PregDrugsList extends List { - constructor() { - const pairs = [ - ["No changes", "no changes", "no default setting"], - ["None", "none"], - ["Fast gestation", "fast gestation", "fast"], - ["Slow gestation", "slow gestation", "slow"], - ["Birth supressors", "birth supressors", "suppress"], - ["Birth stimulators", "birth stimulators", "stimulate"] - ] - super("Pregnancy control agents for pregnant slaves", pairs) - this.setValue(V.currentRule.set.pregSpeed) - this.onchange = (value) => V.currentRule.set.pregSpeed = value + none() { + this.sublists.forEach(i => { + i.setValue(0); + i.propagateChange(); + }); + } } -} -class FemaleHormonesList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Intensive Female", "intensive female", 2], - ["Female", "female", 1], - ["None", "none", 0], - ["Male", "male", -1], - ["Intensive Male", "intensive male", -2] - ] - super("Hormones for female slaves", pairs) - this.setValue(V.currentRule.set.XX) - this.onchange = (value) => V.currentRule.set.XX = value + class BreastGrowthList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["B Cup", 350], + ["D Cup", 1000], + ["Monstrous", 9000], + ["Unlimited", 48000], + ["None", 0] + ]; + super("Breasts", pairs, true); + this.setValue(V.currentRule.set.growth_boobs); + this.onchange = (value) => V.currentRule.set.growth_boobs = value; + } } -} -class GeldingHormonesList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Intensive Female", "intensive female", 2], - ["Female", "female", 1], - ["None", "none", 0], - ["Male", "male", -1], - ["Intensive Male", "intensive male", -2] - ] - super("Hormones for geldings", pairs) - this.setValue(V.currentRule.set.gelding) - this.onchange = (value) => V.currentRule.set.gelding = value + class ButtGrowthList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Cute", 2], + ["Big", 4], + ["Huge", 6], + ["Unlimited", 10], + ["None", 0] + ]; + super("Butts", pairs, true); + this.setValue(V.currentRule.set.growth_butt); + this.onchange = (value) => V.currentRule.set.growth_butt = value; + } } -} -class ShemaleHormonesList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Intensive Female", "intensive female", 2], - ["Female", "female", 1], - ["None", "none", 0], - ["Male", "male", -1], - ["Intensive Male", "intensive male", -2] - ] - super("Hormones for shemales", pairs) - this.setValue(V.currentRule.set.XY) - this.onchange = (value) => V.currentRule.set.XY = value + class LipGrowthList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Plump", 25], + ["Beestung", 45], + ["Facepussy", 100], + ["None", 0] + ]; + super("Lips", pairs, true); + this.setValue(V.currentRule.set.growth_lips); + this.onchange = (value) => V.currentRule.set.growth_lips = value; + } } -} -class OtherDrugsList extends List { - constructor() { - const drugs = [] - setup.drugs.forEach(drug => { - if (drug.fs === undefined && drug.rs === undefined) - drugs.push([drug.name, drug.value]) - else if (drug.rs === "growth" && V.growthStim === 1) - drugs.push([drug.name + " (Research)", drug.value]) - else if (drug.rs === "pubHorm" && V.precociousPuberty === 1 && V.pubertyHormones === 1) - drugs.push([drug.name + " (Research)", drug.value]) - else if (drug.rs === "nosag" && V.purchasedSagBGone === 1) - drugs.push([drug.name + " (Product)", drug.value]) - else if (drug.fs === "slimness" && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) - drugs.push([drug.name + " (FS)", drug.value]) - else if (drug.fs === "youth" && V.arcologies[0].FSYouthPreferentialistResearch === 1) - drugs.push([drug.name + " (FS)", drug.value]) - }) - super("Other drugs (Will be overriden by hormones and other drugs where applicable)", drugs) - this.setValue(V.currentRule.set.drug) - this.onchange = (value) => V.currentRule.set.drug = value + class DickGrowthList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Above average", 4], + ["Pornstar", 6], + ["Unlimited", 10], + ["None", 0] + ]; + super("Dicks, if present", pairs, true); + this.setValue(V.currentRule.set.growth_dick); + this.onchange = (value) => V.currentRule.set.growth_dick = value; + } } -} -class DietList extends List { - constructor() { - const diets = [ - ["no default setting", "no default setting"], - ["Fix fat and skinny slaves", "fix fat and skinny slaves", "attractive"], - ["Curvy", "curvy", 30], - ["Average", "average", 0], - ["Thin", "thin", -30] - ] - if (V.feeder === 1) { - diets.push( - ["Feminine", "feminine", "XX"], - ["Masculine", "masculine", "XY"] - ) - if (V.dietXXY === 1) - diets.push(["Futanari", "futanari", "XXY"]) - } - if (V.dietCleanse === 1) - diets.push(["Cleansing", "promote health", "cleansing"]) - if (V.dietFertility === 1) - diets.push(["Feritlity", "promote fertility", "fertility"]) - if (V.cumProDiet === 1) - diets.push(["Cum production", "promote cum production", "cum production"]) - - super("Slave diets", diets) - this.setValue(V.currentRule.set.diet) - this.onchange = (value) => V.currentRule.set.diet = value + class BallGrowthList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Sizeable", 4], + ["Cumslave", 6], + ["Unlimited", 10], + ["None", 0] + ]; + super("Balls, if present", pairs, true); + this.setValue(V.currentRule.set.growth_balls); + this.onchange = (value) => V.currentRule.set.growth_balls = value; + } } -} -class DietGrowthList extends List { - constructor() { - const pairs = [ - ["On", 1], - ["Off", 0] - ] - super("Diet support for growth drugs", pairs) - this.setValue(V.currentRule.set.dietGrowthSupport) - this.onchange = (value) => V.currentRule.set.dietGrowthSupport = value + class CurrativesList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", "none", 0], + ["Preventatives", "preventatives", 1], + ["Curatives", "curatives", 2] + ]; + super("Health drugs", pairs); + this.setValue(V.currentRule.set.curatives); + this.onchange = (value) => V.currentRule.set.curatives = value; + } } -} -class DietBaseList extends List { - constructor() { - // TODO: better data structure? - const pairs = [ - ["No default setting", {cum: "no default setting", milk: "no default setting"}], - ["Normal Diet", {cum: 0, milk: 0}], - ["Cum Added", {cum: 1, milk: 0}], - ["Milk Added", {cum: 0, milk: 1}], - ["Cum & Milk Added", {cum: 1, milk: 1}], - ["Cum-Based", {cum: 2, milk: 0}] - ["Milk-Based", {cum: 0, milk: 2}] - ] - super("Diet base", pairs) - this.setValue({cum: V.currentRule.set.dietCum, milk: V.currentRule.set.dietMilk}) - this.onchange = (value) => { - V.currentRule.set.dietCum = value.cum - V.currentRule.set.dietMilk = value.milk + class AphrodisiacList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", "none", 0], + ["Standard", "standard", 1], + ["Extreme", "extreme", 2], + ["Anaphrodisiacs", "anaphrodisiacs", -1] + ]; + super("Aphrodisiacs", pairs); + this.setValue(V.currentRule.set.aphrodisiacs); + this.onchange = (value) => V.currentRule.set.aphrodisiacs = value; } } -} -class MuscleList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", "None", 0], - ["Toned", "Toned", 20], - ["Ripped", "Ripped", 50], - ["Massive", "Massive", 100], - ["Weak", "Weak", -20] - ] - super("Muscles", pairs, true) - this.setValue(V.currentRule.set.muscles) - this.onchange = (value) => V.currentRule.set.muscles = value + class ContraceptiveList extends List { + constructor() { + const drugs = [ + ["No default setting", "no default setting"], + ["Contraceptives", "contraceptives", -1], + ["Fertile", "fertile", 0], + ["Very fertile", "very fertile", 1], + ["Extremely fertile", "extremely fertile", 2], + ]; + if (V.seeHyperPreg === 1 && V.superFertilityDrugs === 1) { + drugs.push(["Hyper fertile", "hyper fertile", 3]); + drugs.push(["Maximize fertility", "maximize fertility", 4]); + } + super("Contraceptives for fertile slaves", drugs); + this.setValue(V.currentRule.set.preg); + this.onchange = (value) => V.currentRule.set.preg = value; + } } -} -class BraceList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", "none"], - ["Straighten", "straighten"], - ["Universal", "universal"] - ] - super("Braces", pairs) - this.setValue(V.currentRule.set.teeth) - this.onchange = (value) => V.currentRule.set.teeth = value + class PregDrugsList extends List { + constructor() { + const pairs = [ + ["No changes", "no changes", "no default setting"], + ["None", "none"], + ["Fast gestation", "fast gestation", "fast"], + ["Slow gestation", "slow gestation", "slow"], + ["Birth supressors", "birth supressors", "suppress"], + ["Birth stimulators", "birth stimulators", "stimulate"] + ]; + super("Pregnancy control agents for pregnant slaves", pairs); + this.setValue(V.currentRule.set.pregSpeed); + this.onchange = (value) => V.currentRule.set.pregSpeed = value; + } } -} -class LivingStandardList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Luxurious", "luxurious"], - ["Normal", "normal"], - ["Spare", "spare"] - ] - super("Living standard", pairs) - this.setValue(V.currentRule.set.livingRules) - this.onchange = (value) => V.currentRule.set.livingRules = value + class FemaleHormonesList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Intensive Female", "intensive female", 2], + ["Female", "female", 1], + ["None", "none", 0], + ["Male", "male", -1], + ["Intensive Male", "intensive male", -2] + ]; + super("Hormones for female slaves", pairs); + this.setValue(V.currentRule.set.XX); + this.onchange = (value) => V.currentRule.set.XX = value; + } } -} -class PunishmentList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Confinement", "confinement"], - ["Whipping", "whipping"], - ["Chastity", "chastity"], - ["Situational", "situational"] - ] - super("Typical punishment", pairs) - this.setValue(V.currentRule.set.standardPunishment) - this.onchange = (value) => V.currentRule.set.standardPunishment = value + class GeldingHormonesList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Intensive Female", "intensive female", 2], + ["Female", "female", 1], + ["None", "none", 0], + ["Male", "male", -1], + ["Intensive Male", "intensive male", -2] + ]; + super("Hormones for geldings", pairs); + this.setValue(V.currentRule.set.gelding); + this.onchange = (value) => V.currentRule.set.gelding = value; + } } -} -class RewardList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Relaxation", "relaxation"], - ["Drugs", "drugs"], - ["Orgasm", "orgasm"], - ["Situational", "situational"] - ] - super("Typical reward", pairs) - this.setValue(V.currentRule.set.standardReward) - this.onchange = (value) => V.currentRule.set.standardReward = value + class ShemaleHormonesList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Intensive Female", "intensive female", 2], + ["Female", "female", 1], + ["None", "none", 0], + ["Male", "male", -1], + ["Intensive Male", "intensive male", -2] + ]; + super("Hormones for shemales", pairs); + this.setValue(V.currentRule.set.XY); + this.onchange = (value) => V.currentRule.set.XY = value; + } } -} -class ReleaseList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Permissive", "permissive"], - ["Sapphic", "sapphic"], - ["Masturbation", "masturbation"], - ["Restritive", "restrictive"] - ] - super("Release rules", pairs) - this.setValue(V.currentRule.set.releaseRules) - this.onchange = (value) => V.currentRule.set.releaseRules = value - } -} + class OtherDrugsList extends List { + constructor() { + const drugs = []; + setup.drugs.forEach(drug => { + if (drug.fs === undefined && drug.rs === undefined) + drugs.push([drug.name, drug.value]); + else if (drug.rs === "growth" && V.growthStim === 1) + drugs.push([drug.name + " (Research)", drug.value]); + else if (drug.rs === "pubHorm" && V.precociousPuberty === 1 && V.pubertyHormones === 1) + drugs.push([drug.name + " (Research)", drug.value]); + else if (drug.rs === "nosag" && V.purchasedSagBGone === 1) + drugs.push([drug.name + " (Product)", drug.value]); + else if (drug.fs === "slimness" && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) + drugs.push([drug.name + " (FS)", drug.value]); + else if (drug.fs === "youth" && V.arcologies[0].FSYouthPreferentialistResearch === 1) + drugs.push([drug.name + " (FS)", drug.value]); + }); + super("Other drugs (Will be overriden by hormones and other drugs where applicable)", drugs); + this.setValue(V.currentRule.set.drug); + this.onchange = (value) => V.currentRule.set.drug = value; + } + } + + class DietList extends List { + constructor() { + const diets = [ + ["no default setting", "no default setting"], + ["Fix fat and skinny slaves", "fix fat and skinny slaves", "attractive"], + ["Curvy", "curvy", 30], + ["Average", "average", 0], + ["Thin", "thin", -30] + ]; + if (V.feeder === 1) { + diets.push( + ["Feminine", "feminine", "XX"], + ["Masculine", "masculine", "XY"] + ); + if (V.dietXXY === 1) + diets.push(["Futanari", "futanari", "XXY"]); + } + if (V.dietCleanse === 1) + diets.push(["Cleansing", "promote health", "cleansing"]); + if (V.dietFertility === 1) + diets.push(["Feritlity", "promote fertility", "fertility"]); + if (V.cumProDiet === 1) + diets.push(["Cum production", "promote cum production", "cum production"]); -class SmartFetishList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Vanilla", "vanilla"], - ["Oral", "oral"], - ["Anal", "anal"], - ["Boobs", "boobs"], - ["Sub", "submissive"], - ["Dom", "dom"], - ["Humiliation", "humiliation"], - ["Preg", "pregnancy"], - ["Pain", "masochist"], - ["Sadism", "sadist"] - ] - super("Smart piercing fetish target", pairs) - this.setValue(V.currentRule.set.clitSetting) - this.onchange = (value) => V.currentRule.set.clitSetting = value + super("Slave diets", diets); + this.setValue(V.currentRule.set.diet); + this.onchange = (value) => V.currentRule.set.diet = value; + } } -} -class SmartXYAttractionList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Passionate", "passionate", 100], - ["Attracted", "attracted", 75], - ["Indifferent", "indifferent", 45], - ["None", "none", 0] - ] - super("Smart piercing XY attraction target", pairs) - this.setValue(V.currentRule.set.clitSettingXY) - this.onchange = (value) => V.currentRule.set.clitSettingXY = value + class DietGrowthList extends List { + constructor() { + const pairs = [ + ["On", 1], + ["Off", 0] + ]; + super("Diet support for growth drugs", pairs); + this.setValue(V.currentRule.set.dietGrowthSupport); + this.onchange = (value) => V.currentRule.set.dietGrowthSupport = value; + } } -} -class SmartXXAttractionList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Passionate", "passionate", 100], - ["Attracted", "attracted", 75], - ["Indifferent", "indifferent", 45], - ["None", "none", 0] - ] - super("Smart piercing XX attraction target", pairs) - this.setValue(V.currentRule.set.clitSettingXX) - this.onchange = (value) => V.currentRule.set.clitSettingXX = value + class DietBaseList extends List { + constructor() { + // TODO: better data structure? + const pairs = [ + ["No default setting", {cum: "no default setting", milk: "no default setting"}], + ["Normal Diet", {cum: 0, milk: 0}], + ["Cum Added", {cum: 1, milk: 0}], + ["Milk Added", {cum: 0, milk: 1}], + ["Cum & Milk Added", {cum: 1, milk: 1}], + ["Cum-Based", {cum: 2, milk: 0}], + ["Milk-Based", {cum: 0, milk: 2}], + ]; + super("Diet base", pairs); + this.setValue({cum: V.currentRule.set.dietCum, milk: V.currentRule.set.dietMilk}); + this.onchange = (value) => { + V.currentRule.set.dietCum = value.cum; + V.currentRule.set.dietMilk = value.milk; + }; + } + } + + class MuscleList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", "None", 0], + ["Toned", "Toned", 20], + ["Ripped", "Ripped", 50], + ["Massive", "Massive", 100], + ["Weak", "Weak", -20] + ]; + super("Muscles", pairs, true); + this.setValue(V.currentRule.set.muscles); + this.onchange = (value) => V.currentRule.set.muscles = value; + } } -} -class SmartEnergyList extends List { - constructor() { - const pairs = [ - ["Nympho", "nympho", 100], - ["Sex Addict", "sex addict", 85], - ["Powerful", "powerful", 65], - ["Healthy", "healthy", 45], - ["Weak", "weak", 25], - ["Frigid", "frigid", 0] - ] - super("Smart piercing sex drive target", pairs) - this.setValue(V.currentRule.set.clitSettingEnergy) - this.onchange = (value) => V.currentRule.set.clitSettingEnergy = value + class BraceList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", "none"], + ["Straighten", "straighten"], + ["Universal", "universal"] + ]; + super("Braces", pairs); + this.setValue(V.currentRule.set.teeth); + this.onchange = (value) => V.currentRule.set.teeth = value; + } } -} -class SpeechList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["Permissive", "permissive"], - ["Suppress accents", "accent elimination"], - ["Restrictive", "restrictive"] - ] - super("Speech rules", pairs) - this.setValue(V.currentRule.set) - this.onchange = (value) => V.currentRule.set = value + class LivingStandardList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Luxurious", "luxurious"], + ["Normal", "normal"], + ["Spare", "spare"] + ]; + super("Living standard", pairs); + this.setValue(V.currentRule.set.livingRules); + this.onchange = (value) => V.currentRule.set.livingRules = value; + } } -} -class RelationshipList extends List { - constructor() { - const pairs =[ - ["No default setting", "no default setting"], - ["Permissive", "permissive"], - ["Just friends", "just friends"], - ["Restrictive", "restrictive"] - ] - super("Relationship rules", pairs) - this.setValue(V.currentRule.set) - this.onchange = (value) => V.currentRule.set = value + class PunishmentList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Confinement", "confinement"], + ["Whipping", "whipping"], + ["Chastity", "chastity"], + ["Situational", "situational"] + ]; + super("Typical punishment", pairs); + this.setValue(V.currentRule.set.standardPunishment); + this.onchange = (value) => V.currentRule.set.standardPunishment = value; + } } -} -class PornList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["No broadcasting", "no broadcasting", -1], - ["No subsidy", "no subsidy", 0], - ["1000", "1000", 1000], - ["2000", "2000", 2000], - ["3000", "3000", 3000], - ["4000", "4000", 4000], - ["5000", "5000", 5000] - ] - super("Weekly porn publicity subsidy", pairs) - this.setValue(V.currentRule.set.pornFameSpending) - this.onchange = (value) => V.currentRule.set.pornFameSpending = value + class RewardList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Relaxation", "relaxation"], + ["Drugs", "drugs"], + ["Orgasm", "orgasm"], + ["Situational", "situational"] + ]; + super("Typical reward", pairs); + this.setValue(V.currentRule.set.standardReward); + this.onchange = (value) => V.currentRule.set.standardReward = value; + } } -} -class EyewearList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["correct with contacts"], - ["universal glasses"], - ["blur with glasses"], - ["blur with contacts"] - ] - super("Eyewear", pairs) - this.setValue(V.currentRule.set.eyewear) - this.onchange = (value) => V.currentRule.set.eyewear = value + class ReleaseList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Permissive", "permissive"], + ["Sapphic", "sapphic"], + ["Masturbation", "masturbation"], + ["Restritive", "restrictive"] + ]; + super("Release rules", pairs); + this.setValue(V.currentRule.set.releaseRules); + this.onchange = (value) => V.currentRule.set.releaseRules = value; + } } -} -class LensesList extends Element { - constructor() { - super(V.currentRule.set.eyeColor) - this.appendChild(new OptionsItem("No default Setting", () => this.setValue("no default setting"))) - this.colourlist = new LensesColourList() - this.shapelist = new LensesShapeList() - this.appendChild(this.colourlist) - this.appendChild(this.shapelist) + class SmartFetishList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Vanilla", "vanilla"], + ["Oral", "oral"], + ["Anal", "anal"], + ["Boobs", "boobs"], + ["Sub", "submissive"], + ["Dom", "dom"], + ["Humiliation", "humiliation"], + ["Preg", "pregnancy"], + ["Pain", "masochist"], + ["Sadism", "sadist"] + ]; + super("Smart piercing fetish target", pairs); + this.setValue(V.currentRule.set.clitSetting); + this.onchange = (value) => V.currentRule.set.clitSetting = value; + } + } + + class SmartXYAttractionList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Passionate", "passionate", 100], + ["Attracted", "attracted", 75], + ["Indifferent", "indifferent", 45], + ["None", "none", 0] + ]; + super("Smart piercing XY attraction target", pairs); + this.setValue(V.currentRule.set.clitSettingXY); + this.onchange = (value) => V.currentRule.set.clitSettingXY = value; + } } - render(color) { - const elem = document.createElement("div") - elem.innerHTML = "Eye coloring: " - this.label = document.createElement("strong") - this.label.innerText = coloring - elem.appendChild(this.label) + class SmartXXAttractionList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Passionate", "passionate", 100], + ["Attracted", "attracted", 75], + ["Indifferent", "indifferent", 45], + ["None", "none", 0] + ]; + super("Smart piercing XX attraction target", pairs); + this.setValue(V.currentRule.set.clitSettingXX); + this.onchange = (value) => V.currentRule.set.clitSettingXX = value; + } } - combine() { - const lst = [] - if (this.colourlist.value !== "no default setting") - lst.appendChild(this.colourlist.value) - if (this.shapelist.value !== "no default setting") - list.appendChild(this.shapelist.value) - if (lst.length === 0) return "no default value" - else return lst.join(" ") + class SmartEnergyList extends List { + constructor() { + const pairs = [ + ["Nympho", "nympho", 100], + ["Sex Addict", "sex addict", 85], + ["Powerful", "powerful", 65], + ["Healthy", "healthy", 45], + ["Weak", "weak", 25], + ["Frigid", "frigid", 0] + ]; + super("Smart piercing sex drive target", pairs); + this.setValue(V.currentRule.set.clitSettingEnergy); + this.onchange = (value) => V.currentRule.set.clitSettingEnergy = value; + } } - set_value() { - const tmp = this.combine() - this.label.innerText = tmp - V.currentRule.set.eyeColor = tmp + class SpeechList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["Permissive", "permissive"], + ["Suppress accents", "accent elimination"], + ["Restrictive", "restrictive"] + ]; + super("Speech rules", pairs); + this.setValue(V.currentRule.set); + this.onchange = (value) => V.currentRule.set = value; + } } -} -class LensesColourList extends Options { - constructor() { - super("Color:") - [ - ["no default setting"] - ["blue"], - ["black"], - ["brown"], - ["green"], - ["turquoise"], - ["sky-blue"], - ["hazel"], - ["pale-grey"], - ["white"], - ["pink"], - ["amber"], - ["red"] - ].forEach(i => this.appendChild(new OptionsItem(i, item => { - this.value = item.label - this.parent.set_value() - }))) + class RelationshipList extends List { + constructor() { + const pairs =[ + ["No default setting", "no default setting"], + ["Permissive", "permissive"], + ["Just friends", "just friends"], + ["Restrictive", "restrictive"] + ]; + super("Relationship rules", pairs); + this.setValue(V.currentRule.set); + this.onchange = (value) => V.currentRule.set = value; + } } -} -class LensesShapeList extends Options { - constructor() { - super("Shape:") - [ - ["no default setting"], - ["catlike"], - ["serpent-like"], - ["devilish"], - ["demonic"], - ["hypnotic"], - ["heart-shaped"], - ["wide-eyed"], - ["almond-shaped"], - ["bright"], - ["teary"], - ["vacant"] - ].forEach(i => this.appendChild(new OptionsItem(i, item => { - this.value = item.label - this.parent.set_value() - }))) + class PornList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["No broadcasting", "no broadcasting", -1], + ["No subsidy", "no subsidy", 0], + ["1000", "1000", 1000], + ["2000", "2000", 2000], + ["3000", "3000", 3000], + ["4000", "4000", 4000], + ["5000", "5000", 5000] + ]; + super("Weekly porn publicity subsidy", pairs); + this.setValue(V.currentRule.set.pornFameSpending); + this.onchange = (value) => V.currentRule.set.pornFameSpending = value; + } + } + + class EyewearList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["correct with contacts"], + ["universal glasses"], + ["blur with glasses"], + ["blur with contacts"] + ]; + super("Eyewear", pairs); + this.setValue(V.currentRule.set.eyewear); + this.onchange = (value) => V.currentRule.set.eyewear = value; + } } -} -class MakeupList extends List { - constructor() { - super("Makeup") - [ - ["no default setting"], - ["makeup-free", "makeup-free", 0], - ["nice", "nice", 1], - ["gorgeous", "gorgeous", 2], - ["color-coordinate with hair", "color-coordinate with hair", 3], - ["slutty", "slutty", 4] - ].forEach(pair => this.appendChild(new ListItem(...pair))) - this.setValue(V.currentRule.set.makeup) - this.onchange = (value) => V.currentRule.set.makeup = value - } -} + class LensesList extends Element { + constructor() { + super(V.currentRule.set.eyeColor); + this.appendChild(new OptionsItem("No default Setting", () => this.setValue("no default setting"))); + this.colourlist = new LensesColourList(); + this.shapelist = new LensesShapeList(); + this.appendChild(this.colourlist); + this.appendChild(this.shapelist); + } -class NailsList extends List { - constructor() { - super("Nails") - [ - ["no default setting"], - ["clipped", "clipped", 0], - ["extended", "extended", 1], - ["color-coordinate with hair", "color-coordinate with hair", 2], - ["sharp and claw-like", "sharp and claw-like", 3], - ["bright and glittery", "bright and glittery", 4], - ["hooker nails", "hooker nails", 5] - ].forEach(pair => this.appendChild(new ListItem(...pair))) - this.setValue(V.currentRule.set.nails) - this.onchange = (value) => V.currentRule.set.nails = value - } -} + render(color) { + const elem = document.createElement("div"); + elem.innerHTML = "Eye coloring: "; + this.label = document.createElement("strong"); + this.label.innerText = coloring; + elem.appendChild(this.label); + } -class HairLengthList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["very short", "very short", 5], - ["short", "short", 10], - ["shoulder length", "shoulder length", 30], - ["long", "long", 60], - ["very long", "very long", 100], - ["floor length", "floor length", 150] - ] - super("Hair length", pairs) - this.setValue(V.currentRule.set.hLength) - this.onchange = (value) => V.currentRule.set.hLength = value - } -} -class HairColourList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["blonde"], - ["golden"], - ["platinum blonde"], - ["strawbery-blonde"], - ["copper"], - ["ginger"], - ["red"] - ["green"], - ["blue"], - ["pink"], - ["dark brown"], - ["brown"], - ["auburn"], - ["burgundy"], - ["chocolate"], - ["chestnut"], - ["hazel"], - ["black"], - ["grey"], - ["silver"], - ["white"], - ["blazing red"], - ["neon green"], - ["neon blue"], - ["neon pink"] - ] - super("Hair color", pairs) - this.setValue(V.currentRule.set.hColor) - this.onchange = (value) => V.currentRule.set.hColor = value - } -} + combine() { + const lst = []; + if (this.colourlist.value !== "no default setting") + lst.appendChild(this.colourlist.value); + if (this.shapelist.value !== "no default setting") + list.appendChild(this.shapelist.value); + if (lst.length === 0) return "no default value"; + else return lst.join(" "); + } -class HairStyleList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["neat"], - ["shaved"], - ["trimmed"], - ["buzzcut"], - ["up"], - ["ponytail"], - ["bun"], - ["curled"], - ["permed"], - ["luxurious"], - ["dreadlocks"], - ["cornrows"], - ["braided"], - ["tails"], - ["afro"], - ["strip"] - ] - super("Hair style", pairs) - this.setValue(V.currentRule.set.hStyle) - this.onchange = (value) => V.currentRule.set.hStyle = value + set_value() { + const tmp = this.combine(); + this.label.innerText = tmp; + V.currentRule.set.eyeColor = tmp; + } } -} -class PubicHairColourList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["blonde"], - ["golden"], - ["platinum blonde"], - ["strawerry-blonde"], - ["copper"], - ["ginger"], - ["red"], - ["green"], - ["blue"], - ["pink"], - ["dark brown"], - ["brown"], - ["auburn"], - ["burgundy"], - ["chocolate"], - ["chestnut"], - ["hazel"], - ["black"], - ["grey"], - ["silver"], - ["white"], - ["blazing red"], - ["neon green"], - ["neon blue"], - ["neon pink"] - ] - super("Pubic hair color, when present", pairs) - this.setValue(V.currentRule.set.pubicHColor) - this.onchange = (value) => V.currentRule.set.pubicHColor = value + class LensesColourList extends Options { + constructor() { + super("Color:"); + [ + ["no default setting"], + ["blue"], + ["black"], + ["brown"], + ["green"], + ["turquoise"], + ["sky-blue"], + ["hazel"], + ["pale-grey"], + ["white"], + ["pink"], + ["amber"], + ["red"] + ].forEach(i => this.appendChild(new OptionsItem(i, item => { + this.value = item.label; + this.parent.set_value(); + }))); + } + } + + class LensesShapeList extends Options { + constructor() { + super("Shape:"); + [ + ["no default setting"], + ["catlike"], + ["serpent-like"], + ["devilish"], + ["demonic"], + ["hypnotic"], + ["heart-shaped"], + ["wide-eyed"], + ["almond-shaped"], + ["bright"], + ["teary"], + ["vacant"] + ].forEach(i => this.appendChild(new OptionsItem(i, item => { + this.value = item.label; + this.parent.set_value(); + }))); + } + } + + class MakeupList extends List { + constructor() { + super("Makeup"); + [ + ["no default setting"], + ["makeup-free", "makeup-free", 0], + ["nice", "nice", 1], + ["gorgeous", "gorgeous", 2], + ["color-coordinate with hair", "color-coordinate with hair", 3], + ["slutty", "slutty", 4] + ].forEach(pair => this.appendChild(new ListItem(...pair))); + this.setValue(V.currentRule.set.makeup); + this.onchange = (value) => V.currentRule.set.makeup = value; + } } -} -class PubicHairStyleList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["waxed"], - ["in a strip"], - ["neat"], - ["bushy"], - ["bushy in the front and neat in the rear"], - ["very bushy"] - ] - super("Pubic hairstyle", pairs) - this.setValue(V.currentRule.set.pubicHStyle) - this.onchange = (value) => V.currentRule.set.pubicHStyle = value + class NailsList extends List { + constructor() { + super("Nails"); + [ + ["no default setting"], + ["clipped", "clipped", 0], + ["extended", "extended", 1], + ["color-coordinate with hair", "color-coordinate with hair", 2], + ["sharp and claw-like", "sharp and claw-like", 3], + ["bright and glittery", "bright and glittery", 4], + ["hooker nails", "hooker nails", 5] + ].forEach(pair => this.appendChild(new ListItem(...pair))); + this.setValue(V.currentRule.set.nails); + this.onchange = (value) => V.currentRule.set.nails = value; + } } -} -class ArmpitHairColourList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["blonde"], - ["golden"], - ["platinum blonde"], - ["strawberry-blonde"], - ["copper"], - ["ginger"], - ["red"], - ["green"], - ["blue"], - ["pink"], - ["dark brown"], - ["brown"], - ["auburn"], - ["burgundry"], - ["chocolate"], - ["chestnut"], - ["hazel"], - ["black"], - ["grey"], - ["silver"], - ["white"] - ] - super("Underarm hair color, when present", pairs) - this.setValue(V.currentRule.set.underArmHColor) - this.onchange = (value) => V.currentRule.set.underArmHColor = value + class HairLengthList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["very short", "very short", 5], + ["short", "short", 10], + ["shoulder length", "shoulder length", 30], + ["long", "long", 60], + ["very long", "very long", 100], + ["floor length", "floor length", 150] + ]; + super("Hair length", pairs); + this.setValue(V.currentRule.set.hLength); + this.onchange = (value) => V.currentRule.set.hLength = value; + } + } + class HairColourList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["blonde"], + ["golden"], + ["platinum blonde"], + ["strawbery-blonde"], + ["copper"], + ["ginger"], + ["red"], + ["green"], + ["blue"], + ["pink"], + ["dark brown"], + ["brown"], + ["auburn"], + ["burgundy"], + ["chocolate"], + ["chestnut"], + ["hazel"], + ["black"], + ["grey"], + ["silver"], + ["white"], + ["blazing red"], + ["neon green"], + ["neon blue"], + ["neon pink"] + ]; + super("Hair color", pairs); + this.setValue(V.currentRule.set.hColor); + this.onchange = (value) => V.currentRule.set.hColor = value; + } + } + + class HairStyleList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["neat"], + ["shaved"], + ["trimmed"], + ["buzzcut"], + ["up"], + ["ponytail"], + ["bun"], + ["curled"], + ["permed"], + ["luxurious"], + ["dreadlocks"], + ["cornrows"], + ["braided"], + ["tails"], + ["afro"], + ["strip"] + ]; + super("Hair style", pairs); + this.setValue(V.currentRule.set.hStyle); + this.onchange = (value) => V.currentRule.set.hStyle = value; + } + } + + class PubicHairColourList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["blonde"], + ["golden"], + ["platinum blonde"], + ["strawerry-blonde"], + ["copper"], + ["ginger"], + ["red"], + ["green"], + ["blue"], + ["pink"], + ["dark brown"], + ["brown"], + ["auburn"], + ["burgundy"], + ["chocolate"], + ["chestnut"], + ["hazel"], + ["black"], + ["grey"], + ["silver"], + ["white"], + ["blazing red"], + ["neon green"], + ["neon blue"], + ["neon pink"] + ]; + super("Pubic hair color, when present", pairs); + this.setValue(V.currentRule.set.pubicHColor); + this.onchange = (value) => V.currentRule.set.pubicHColor = value; + } + } + + class PubicHairStyleList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["waxed"], + ["in a strip"], + ["neat"], + ["bushy"], + ["bushy in the front and neat in the rear"], + ["very bushy"] + ]; + super("Pubic hairstyle", pairs); + this.setValue(V.currentRule.set.pubicHStyle); + this.onchange = (value) => V.currentRule.set.pubicHStyle = value; + } } -} -class ArmpitHairStyleList extends List { - constructor() { - const pairs = [ - ["no default setting"], - ["waxed"], - ["shaved"], - ["neat"], - ["bushy"] - ] - super("Underarm hair style", pairs) - this.setValue(V.currentRule.set.underArmHStyle) - this.onchange = (value) => V.currentRule.set.underArmHStyle = value + class ArmpitHairColourList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["blonde"], + ["golden"], + ["platinum blonde"], + ["strawberry-blonde"], + ["copper"], + ["ginger"], + ["red"], + ["green"], + ["blue"], + ["pink"], + ["dark brown"], + ["brown"], + ["auburn"], + ["burgundry"], + ["chocolate"], + ["chestnut"], + ["hazel"], + ["black"], + ["grey"], + ["silver"], + ["white"] + ]; + super("Underarm hair color, when present", pairs); + this.setValue(V.currentRule.set.underArmHColor); + this.onchange = (value) => V.currentRule.set.underArmHColor = value; + } + } + + class ArmpitHairStyleList extends List { + constructor() { + const pairs = [ + ["no default setting"], + ["waxed"], + ["shaved"], + ["neat"], + ["bushy"] + ]; + super("Underarm hair style", pairs); + this.setValue(V.currentRule.set.underArmHStyle); + this.onchange = (value) => V.currentRule.set.underArmHStyle = value; + } } -} -class EarPiecingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Ear piercings", pairs) - this.setValue(V.currentRule.set.earPiercing) - this.onchange = (value) => V.currentRule.set.earPiercing + class EarPiecingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Ear piercings", pairs); + this.setValue(V.currentRule.set.earPiercing); + this.onchange = (value) => V.currentRule.set.earPiercing; + } } -} -class NosePiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Nasal piercings", pairs) - this.setValue(V.currentRule.set.nosePiercing) - this.onchange = (value) => V.currentRule.set.earPiercing + class NosePiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Nasal piercings", pairs); + this.setValue(V.currentRule.set.nosePiercing); + this.onchange = (value) => V.currentRule.set.earPiercing; + } } -} -class EyebrowPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Eyebrow piercings", pairs) - this.setValue(V.currentRule.set.eyebrowPiercing) - this.onchange = (value) => V.currentRule.set.eyebrowPiercing + class EyebrowPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Eyebrow piercings", pairs); + this.setValue(V.currentRule.set.eyebrowPiercing); + this.onchange = (value) => V.currentRule.set.eyebrowPiercing; + } } -} -class NavelPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Navel piercings", pairs) - this.setValue(V.currentRule.set.navelPiercing) - this.onchange = (value) => V.currentRule.set.navelPiercing + class NavelPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Navel piercings", pairs); + this.setValue(V.currentRule.set.navelPiercing); + this.onchange = (value) => V.currentRule.set.navelPiercing; + } } -} -class NipplePiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Nipple piercings", pairs) - this.setValue(V.currentRule.set.nipplesPiercing) - this.onchange = (value) => V.currentRule.set.nipplesPiercing + class NipplePiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Nipple piercings", pairs); + this.setValue(V.currentRule.set.nipplesPiercing); + this.onchange = (value) => V.currentRule.set.nipplesPiercing; + } } -} -class AreolaPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Studded", 1] - ] - super("Areola studs", pairs) - this.setValue(V.currentRule.set.areolaePiercing) - this.onchange = (value) => V.currentRule.set.areolaePiercing + class AreolaPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Studded", 1] + ]; + super("Areola studs", pairs); + this.setValue(V.currentRule.set.areolaePiercing); + this.onchange = (value) => V.currentRule.set.areolaePiercing; + } } -} -class LipPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Lip piercings", pairs) - this.setValue(V.currentRule.set.lipsPiercing) - this.onchange = (value) => V.currentRule.set.lipsPiercing + class LipPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Lip piercings", pairs); + this.setValue(V.currentRule.set.lipsPiercing); + this.onchange = (value) => V.currentRule.set.lipsPiercing; + } } -} -class TonguePiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Tongue piercing", pairs) - this.setValue(V.currentRule.set.tonguePiercing) - this.onchange = (value) => V.currentRule.set.tonguePiercing + class TonguePiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Tongue piercing", pairs); + this.setValue(V.currentRule.set.tonguePiercing); + this.onchange = (value) => V.currentRule.set.tonguePiercing; + } } -} -class CliptPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2], - ["Smart (expensive)", 3] - ] - super("Clit piercing", pairs) - this.setValue(V.currentRule.set.clitPiercing) - this.onchange = (value) => V.currentRule.set.clitPiercing + class CliptPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2], + ["Smart (expensive)", 3] + ]; + super("Clit piercing", pairs); + this.setValue(V.currentRule.set.clitPiercing); + this.onchange = (value) => V.currentRule.set.clitPiercing; + } } -} -class LabiaPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Pussylips piercings", pairs) - this.setValue(V.currentRule.set.vaginaPiercing) - this.onchange = (value) => V.currentRule.set.vaginaPiercing + class LabiaPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Pussylips piercings", pairs); + this.setValue(V.currentRule.set.vaginaPiercing); + this.onchange = (value) => V.currentRule.set.vaginaPiercing; + } } -} -class ShaftPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Shaft piercings", pairs) - this.setValue(V.currentRule.set.dickPiercing) - this.onchange = (value) => V.currentRule.set.dickPiercing + class ShaftPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Shaft piercings", pairs); + this.setValue(V.currentRule.set.dickPiercing); + this.onchange = (value) => V.currentRule.set.dickPiercing; + } } -} -class PerineumPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Light", 1], - ["Heavy", 2] - ] - super("Perianal piercings", pairs) - this.setValue(V.currentRule.set.anusPiercing) - this.onchange = (value) => V.currentRule.set.anusPiercing + class PerineumPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Light", 1], + ["Heavy", 2] + ]; + super("Perianal piercings", pairs); + this.setValue(V.currentRule.set.anusPiercing); + this.onchange = (value) => V.currentRule.set.anusPiercing; + } } -} -class CorsetPiercingList extends List { - constructor() { - const pairs = [ - ["No default setting", "no default setting"], - ["None", 0], - ["Apply", 1] - ] - super("Corset piercings", pairs) - this.setValue(V.currentRule.set.corsetPiercing) - this.onchange = (value) => V.currentRule.set.corsetPiercing + class CorsetPiercingList extends List { + constructor() { + const pairs = [ + ["No default setting", "no default setting"], + ["None", 0], + ["Apply", 1] + ]; + super("Corset piercings", pairs); + this.setValue(V.currentRule.set.corsetPiercing); + this.onchange = (value) => V.currentRule.set.corsetPiercing; + } } -} -class AutoBrandingList exnteds List { - constructor() { - const pairs = [ - ["Activate", 1], - ["Off", 0], - ] - super("Automatic branding", pairs) - this.setValue(V.currentRule.set.autoBrand) - this.onchange = (value) => V.currentRule.set.autoBrand = value + class AutoBrandingList extends List { + constructor() { + const pairs = [ + ["Activate", 1], + ["Off", 0], + ]; + super("Automatic branding", pairs); + this.setValue(V.currentRule.set.autoBrand); + this.onchange = (value) => V.currentRule.set.autoBrand = value; + } } -} -class BrandingLocationList extends List { - constructor() { - super("Your preferred location for brands is", []) - - const ears = new ListSubSection("Ears", [ - ["Left", "left ear"], - ["Right", "right ear"], - ["Both", "ears"] - ]) - this.appendChild(ears) - - const cheeks = new ListSubSection("Cheeks", [ - ["Left", "left cheek"], - ["Right", "right cheek"], - ["Both", "cheeks"] - ]) - this.appendChild(cheeks) + class BrandingLocationList extends List { + constructor() { + super("Your preferred location for brands is", []); + + const ears = new ListSubSection("Ears", [ + ["Left", "left ear"], + ["Right", "right ear"], + ["Both", "ears"] + ]); + this.appendChild(ears); + + const cheeks = new ListSubSection("Cheeks", [ + ["Left", "left cheek"], + ["Right", "right cheek"], + ["Both", "cheeks"] + ]); + this.appendChild(cheeks); const shoulders = new ListSubSection("Shoulders", [ ["Left", "left shoulder"], ["Right", "right shoulder"], ["Both", "shoulders"] - ]) - this.appendChild(shoulders) + ]); + this.appendChild(shoulders); const breasts = new ListSubSection("Breasts", [ ["Left", "right breast"], ["Right", "left breast"], ["Both", "breasts"] - ]) - this.appendChild(breasts) + ]); + this.appendChild(breasts); const upper_arms = new ListSubSection("Arms, upper", [ ["Left", "left upper arm"], ["Right", "right upper arm"], ["Both", "upper arms"] - ]) - this.appendChild(upper_arms) + ]); + this.appendChild(upper_arms); const lower_arms = new ListSubSection("Arms, lower", [ ["Left", "left lower arm"], ["Right", "right lower arm"], ["Both", "lower arms"] - ]) - this.appendChild(lower_arms) + ]); + this.appendChild(lower_arms); const wrist = new ListSubSection("Wrist", [ ["Left", "left wrist"], ["Right", "right wrist"], ["Both", "wrists"] - ]) - this.appendChild(wrist) + ]); + this.appendChild(wrist); const hand = new ListSubSection("Hand", [ ["Left", "left hand"], ["Right", "right hand"], ["Both", "hands"] - ]) - this.appendChild(hand) + ]); + this.appendChild(hand); const buttocks = new ListSubSection("Buttocks", [ ["Left", "left buttock"], ["Right", "right buttock"], ["Both", "buttocks"] - ]) - this.appendChild(buttocks) + ]); + this.appendChild(buttocks); const thigh = new ListSubSection("Thigh", [ ["Left", "left thigh"], ["Right", "right thigh"], ["Both", "thighs"] - ]) - this.appendChild(thigh) + ]); + this.appendChild(thigh); const calf = new ListSubSection("Calf", [ ["Left", "left calf"], ["Right", "right calf"], ["Both", "calves"] - ]) - this.appendChild(calf) + ]); + this.appendChild(calf); const ankle = new ListSubSection("Ankle", [ ["Left", "left ankle"], ["Right", "right ankle"], ["Both", "ankles"] - ]) - this.appendChild(ankle) + ]); + this.appendChild(ankle); const feet = new ListSubSection("Feet", [ ["Left", "left foot"], ["Right", "right foot"], ["Both", "feet"] - ]) - this.appendChild(feet) + ]); + this.appendChild(feet); const other = new ListSubSection("Other", [ ["Neck", "neck"], @@ -2400,11 +2401,11 @@ class BrandingLocationList extends List { ["Pubic mound", "pubic mound"], ["Back", "back"], ["Lower Back", "lower back"] - ]) - this.appendChild(other) + ]); + this.appendChild(other); - this.selectValue(V.brandTarget) - this.onchange = (value) => V.brandTarget = value + this.selectValue(V.brandTarget); + this.onchange = (value) => V.brandTarget = value; } } @@ -2428,81 +2429,81 @@ class BrandingLocationList extends List { ["Queen", "a queen silhouette"], ["Angel", "an angel silhouette"], ["Devil", "a devil silhouette"] - ] + ]; if (V.arcologies[0].FSSupremacist !== "unset" || V.arcologies[0].FSSubjugationist !== "unset") - items.push(["(FS) Racial Slur", "a racial slur"]) + items.push(["(FS) Racial Slur", "a racial slur"]); if (V.arcologies[0].FSSupremacist !== "unset" && V.arcologies[0].FSSupremacistRace === "white") - items.push(["(FS) Swastika", "a swastika"]) + items.push(["(FS) Swastika", "a swastika"]); if (V.arcologies[0].FSSubjugationist !== "unset" && V.arcologies[0].FSSubjugationistRace === "semitic") - items.push(["(FS) Star of David", "a Star of David"]) + items.push(["(FS) Star of David", "a Star of David"]); if (V.arcologies[0].FSGenderRadicalist !== "unset" || V.arcologies.FSGenderFundamentalist !== "unset") - items.push(["(FS) Gender Symbol", "a gender symbol"]) + items.push(["(FS) Gender Symbol", "a gender symbol"]); if (V.arcologies[0].FSPaternalist !== "unset") - items.push(["(FS) Personal Symbol", "her own personal symbol"]) + items.push(["(FS) Personal Symbol", "her own personal symbol"]); if (V.arcologies[0].FSDegradationist !== "unset") - items.push(["(FS) Chain Symbol", "a chain symbol"]) + items.push(["(FS) Chain Symbol", "a chain symbol"]); if (V.arcologies[0].FSBodyPurist !== "unset") - items.push(["(FS) Vitruvian Man", "a Vitruvian man"]) + items.push(["(FS) Vitruvian Man", "a Vitruvian man"]); if (V.arcologies[0].FSTransformationFetishist !== "unset") - items.push(["(FS) Most Desired Implants", "a shortlist of desired implants"]) + items.push(["(FS) Most Desired Implants", "a shortlist of desired implants"]); if (V.arcologies[0].FSYouthPreferentialist !== "unset") - items.push(["(FS) Virginity Status", "her virginity status"]) + items.push(["(FS) Virginity Status", "her virginity status"]); if (V.arcologies[0].FSMaturityPreferentialist !== "unset") - items.push(["(FS) Sexual Skill Info", "her sexual skills"]) + items.push(["(FS) Sexual Skill Info", "her sexual skills"]); if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") - items.push(["(FS) Breast Ceiling", "her absolute maximum breast size"]) + items.push(["(FS) Breast Ceiling", "her absolute maximum breast size"]); if (V.arcologies[0].FSAssetExpansionist !== "unset") - items.push(["(FS) Breast Floor", "her absolute minimum breast size"]) + items.push(["(FS) Breast Floor", "her absolute minimum breast size"]); if (V.arcologies[0].FSPastoralist !== "unset") - items.push(["(FS) Product Quality", "her body product quality"]) + items.push(["(FS) Product Quality", "her body product quality"]); if (V.arcologies[0].FSPhysicalIdelist !== "unset") - items.push(["(FS) Deadlift Info", "her deadlift record"]) + items.push(["(FS) Deadlift Info", "her deadlift record"]); if (V.arcologies[0].FSHedonisticDecadence !== "unset") - items.push(["(FS) Weight Record", "her highest weigh-in"]) + items.push(["(FS) Weight Record", "her highest weigh-in"]); if (V.arcologies[0].FSHedonisticDecadence && V.PC.refreshmentType == 2) - items.push(["(FS) Favorite Food", `a big helping of ${V.PC.refreshment}`]) + items.push(["(FS) Favorite Food", `a big helping of ${V.PC.refreshment}`]); if (V.arcologies[0].FSRepopulationFocus !== "unset") - items.push(["(FS) Birth Count", "the number of children she has birthed"]) + items.push(["(FS) Birth Count", "the number of children she has birthed"]); if (V.arcologies[0].FSChattelReligionist !== "unset") - items.push(["(FS) Religious Symbol", "a religious symbol"]) + items.push(["(FS) Religious Symbol", "a religious symbol"]); if (V.arcologies[0].FSRomanRevivalist !== "unset") - items.push(["(FS) Republican Crest", "a small crest of your Republic"]) + items.push(["(FS) Republican Crest", "a small crest of your Republic"]); if (V.arcologies[0].FSAztecRevivalist !== "unset") - items.push(["(FS) Seven Serpents", "a small symbol of the Aztec gods"]) + items.push(["(FS) Seven Serpents", "a small symbol of the Aztec gods"]); if (V.arcologies[0].FSEgyptianRevivalist !== "unset") - items.push(["(FS) Dynastic Sigil", "a small sigil of your Dynasty"]) + items.push(["(FS) Dynastic Sigil", "a small sigil of your Dynasty"]); if (V.arcologies[0].FSEdoRevivalist !== "unset") - items.push(["(FS) Mon", "a small image of the Shogunate's mon"]) + items.push(["(FS) Mon", "a small image of the Shogunate's mon"]); if (V.arcologies[0].FSArabianRevivalist !== "unset") - items.push(["(FS) Caliphate Symbol", "a small symbol of the Caliphate"]) + items.push(["(FS) Caliphate Symbol", "a small symbol of the Caliphate"]); if (V.arcologies[0].FSChineseRevivalist !== "unset") - items.push(["(FS) Imperial Seal", "a small image of your Imperial Seal"]) + items.push(["(FS) Imperial Seal", "a small image of your Imperial Seal"]); - super("Your brand design is", items, true) + super("Your brand design is", items, true); } } @@ -2524,10 +2525,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Facial tattoos", items) - this.selectValue(V.currentRule.set.lipsTat) - this.onchange = (value) => V.currentRule.set.lipsTat = value + ]; + super("Facial tattoos", items); + this.selectValue(V.currentRule.set.lipsTat); + this.onchange = (value) => V.currentRule.set.lipsTat = value; } } @@ -2549,10 +2550,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Shoulder tattoos", items) - this.selectValue(V.currentRule.set.shouldersTat) - this.onchange = (value) => V.currentRule.set.shouldersTat = value + ]; + super("Shoulder tattoos", items); + this.selectValue(V.currentRule.set.shouldersTat); + this.onchange = (value) => V.currentRule.set.shouldersTat = value; } } @@ -2574,10 +2575,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Chest tattoos", items) - this.selectValue(V.currentRule.set.boobsTat) - this.onchange = (value) => V.currentRule.set.boobsTat = value + ]; + super("Chest tattoos", items); + this.selectValue(V.currentRule.set.boobsTat); + this.onchange = (value) => V.currentRule.set.boobsTat = value; } } @@ -2599,10 +2600,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Arm tattoos", items) - this.selectValue(V.currentRule.set.armsTat) - this.onchange = (value) => V.currentRule.set.armsTat = value + ]; + super("Arm tattoos", items); + this.selectValue(V.currentRule.set.armsTat); + this.onchange = (value) => V.currentRule.set.armsTat = value; } } @@ -2624,10 +2625,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Upper back tattoos", items) - this.selectValue(V.currentRule.set.backTat) - this.onchange = (value) => V.currentRule.set.backTat = value + ]; + super("Upper back tattoos", items); + this.selectValue(V.currentRule.set.backTat); + this.onchange = (value) => V.currentRule.set.backTat = value; } } @@ -2649,10 +2650,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Lower back tattoos", items) - this.selectValue(V.currentRule.set.stampTat) - this.onchange = (value) => V.currentRule.set.stampTat = value + ]; + super("Lower back tattoos", items); + this.selectValue(V.currentRule.set.stampTat); + this.onchange = (value) => V.currentRule.set.stampTat = value; } } @@ -2673,11 +2674,11 @@ class BrandingLocationList extends List { ["sacrament"], ["sacrilege"], ["possessive"], - ["paternalist"] - ] - super("Abdomen tattoos", items) - this.selectValue(V.currentRule.set.vaginaTat) - this.onchange = (value) => V.currentRule.set.vaginaTat = value + ["paternalist"], + ]; + super("Abdomen tattoos", items); + this.selectValue(V.currentRule.set.vaginaTat); + this.onchange = (value) => V.currentRule.set.vaginaTat = value; } } @@ -2698,10 +2699,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Dick tattoos", items) - this.selectValue(V.currentRule.set.dickTat) - this.onchange = (value) => V.currentRule.set.dickTat = value + ]; + super("Dick tattoos", items); + this.selectValue(V.currentRule.set.dickTat); + this.onchange = (value) => V.currentRule.set.dickTat = value; } } @@ -2723,10 +2724,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Buttock tattoos", items) - this.selectValue(V.currentRule.set.buttTat) - this.onchange = (value) => V.currentRule.set.buttTat = value + ]; + super("Buttock tattoos", items); + this.selectValue(V.currentRule.set.buttTat); + this.onchange = (value) => V.currentRule.set.buttTat = value; } } @@ -2742,15 +2743,15 @@ class BrandingLocationList extends List { ["rude words"], ["degradation"], ["bovine patterns"], - ["bleached"] + ["bleached"], ["sacrament"], ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Anal tattoo or bleaching", items) - this.selectValue(V.currentRule.set.anusTat) - this.onchange = (value) => V.currentRule.set.anusTat = value + ]; + super("Anal tattoo or bleaching", items); + this.selectValue(V.currentRule.set.anusTat); + this.onchange = (value) => V.currentRule.set.anusTat = value; } } @@ -2772,10 +2773,10 @@ class BrandingLocationList extends List { ["sacrilege"], ["possessive"], ["paternalist"] - ] - super("Leg tattoos", items) - this.selectValue(V.currentRule.set.legsTat) - this.onchange = (value) => V.currentRule.set.legsTat = value + ]; + super("Leg tattoos", items); + this.selectValue(V.currentRule.set.legsTat); + this.onchange = (value) => V.currentRule.set.legsTat = value; } } @@ -2785,10 +2786,10 @@ class BrandingLocationList extends List { ["no default setting"], ["fixed", 1], ["blurred", -1] - ] - super("Vision correction", items) - this.selectValue(V.currentRule.set.surgery_eyes) - this.onchange = (value) => V.currentRule.set.surgery_eyes = value + ]; + super("Vision correction", items); + this.selectValue(V.currentRule.set.surgery_eyes); + this.onchange = (value) => V.currentRule.set.surgery_eyes = value; } } @@ -2798,10 +2799,10 @@ class BrandingLocationList extends List { ["no default setting"], ["implanted", 1], ["removed", 0] - ] - super("Lactation drug implants", items) - this.selectValue(V.currentRule.set.surgery_lactation) - this.onchange = (value) => V.currentRule.set.surgery_lactation = value + ]; + super("Lactation drug implants", items); + this.selectValue(V.currentRule.set.surgery_lactation); + this.onchange = (value) => V.currentRule.set.surgery_lactation = value; } } @@ -2811,10 +2812,10 @@ class BrandingLocationList extends List { ["no default setting"], ["implanted", 1], ["removed", 0] - ] - super("Prostate production enhancing drug implants", items) - this.selectValue(V.currentRule.set.surgery_prostate) - this.onchange = (value) => V.currentRule.set.surgery_prostate = value + ]; + super("Prostate production enhancing drug implants", items); + this.selectValue(V.currentRule.set.surgery_prostate); + this.onchange = (value) => V.currentRule.set.surgery_prostate = value; } } @@ -2823,11 +2824,11 @@ class BrandingLocationList extends List { const items = [ ["none", 0], ["subtle", 1], - ["invasive", 2] - ] - super("Cosmetic Surgery", items) - this.selectValue(V.currentRule.set.surgery_cosmetic) - this.onchange = (value) => V.currentRule.set.surgery_cosmetic = value + ["invasive", 2], + ]; + super("Cosmetic Surgery", items); + this.selectValue(V.currentRule.set.surgery_cosmetic); + this.onchange = (value) => V.currentRule.set.surgery_cosmetic = value; } } @@ -2840,10 +2841,10 @@ class BrandingLocationList extends List { ["big", 40], ["huge", 70], ["facepussy", 95] - ] - super("Lip implants", items) - this.selectValue(V.currentRule.set.surgery_lips) - this.onchange = (value) => V.currentRule.set.surgery_lips = value + ]; + super("Lip implants", items); + this.selectValue(V.currentRule.set.surgery_lips); + this.onchange = (value) => V.currentRule.set.surgery_lips = value; } } @@ -2851,15 +2852,15 @@ class BrandingLocationList extends List { constructor() { const items = [ ["no default setting"], - ["removed", 0] + ["removed", 0], ["slim", 2], ["stacked", 4], ["huge", 6], - ["maximised", 9] - ] - super("Buttock implants", items) - this.selectValue(V.currentRule.set.surgery_butt) - this.onchange = (value) => V.currentRule.set.surgery_butt = value + ["maximised", 9], + ]; + super("Buttock implants", items); + this.selectValue(V.currentRule.set.surgery_butt); + this.onchange = (value) => V.currentRule.set.surgery_butt = value; } } @@ -2867,16 +2868,16 @@ class BrandingLocationList extends List { constructor() { const items = [ ["no default setting"], - ["removed", 0] + ["removed", 0], ["slim", 400], ["stacked", 1000], ["huge", 2000], ["barely functional", 9000], ["maximised", 48000] - ] - super("Breast implants", items) - this.selectValue(V.currentRule.set.surgery_boobs) - this.onchange = (value) => V.currentRule.set.surgery_boobs = value + ]; + super("Breast implants", items); + this.selectValue(V.currentRule.set.surgery_boobs); + this.onchange = (value) => V.currentRule.set.surgery_boobs = value; } } @@ -2884,12 +2885,12 @@ class BrandingLocationList extends List { constructor() { const items = [ ["no default setting"], - ["tightening", 1] + ["tightening", 1], ["virginity restoration", 2] - ] - super("Orifice Tightening", items) - this.selectValue(V.currentRule.set.surgery_holes) - this.onchange = (value) => V.currentRule.set.surgery_holes = value + ]; + super("Orifice Tightening", items); + this.selectValue(V.currentRule.set.surgery_holes); + this.onchange = (value) => V.currentRule.set.surgery_holes = value; } } @@ -2897,12 +2898,12 @@ class BrandingLocationList extends List { constructor() { const items = [ ["no default setting"], - ["keep", 1] - ["removal", 2] - ] - super("Orifice Tightening", items) - this.selectValue(V.currentRule.set.surgery_bodyhair) - this.onchange = (value) => V.currentRule.set.surgery_bodyhair = value + ["keep", 1], + ["removal", 2], + ]; + super("Orifice Tightening", items); + this.selectValue(V.currentRule.set.surgery_bodyhair); + this.onchange = (value) => V.currentRule.set.surgery_bodyhair = value; } } @@ -2910,12 +2911,12 @@ class BrandingLocationList extends List { constructor() { const items = [ ["no default setting"], - ["keep", 1] - ["removal", 2] - ] - super("Orifice Tightening", items) - this.selectValue(V.currentRule.set.surgery_hair) - this.onchange = (value) => V.currentRule.set.surgery_hair = value + ["keep", 1], + ["removal", 2], + ]; + super("Orifice Tightening", items); + this.selectValue(V.currentRule.set.surgery_hair); + this.onchange = (value) => V.currentRule.set.surgery_hair = value; } } -})() +})();