Newer
Older

MouseOfLight
committed
constructor() {
textarea.placeholder = "Paste your rule here";
container.appendChild(textarea);
this.textarea = textarea;
const button = document.createElement("button");
button.name = "Load";
V.defaultRules.push(App.Entity.Utils.RARuleDatatypeCleanup(r));
V.defaultRules.push(App.Entity.Utils.RARuleDatatypeCleanup(rule));

MouseOfLight
committed
reload();
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));
App.UI.tabbar.handlePreSelectedTab("appearance", true);
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 '${noDefaultSetting.text}' option to identify areas I should not address.</em>`;

MouseOfLight
committed
constructor() {

MouseOfLight
committed
const newrule = new OptionsItem("Add a new rule", () => { newRule(); });

MouseOfLight
committed
const importrule = new OptionsItem("Import a rule", () => { root.appendChild(new NewRuleField()); });
// buttons for selecting the current rule
class RuleSelector extends List {

MouseOfLight
committed
constructor() {
super("Current rule", V.defaultRules.map(i => [(i.name + (RuleHasError(i) ? " <span class='yellow'>[!]</span>" : "")), i]), false);

MouseOfLight
committed
reload();
}
}
// buttons for doing transformations on rules
class RuleOptions extends Options {

MouseOfLight
committed
constructor() {

MouseOfLight
committed
this.appendChild(new OptionsItem("New Rule", newRule));
this.appendChild(new OptionsItem("Remove Rule", removeRule));
this.appendChild(new OptionsItem("Apply rules", () => this.appendChild(new ApplicationLog())));

MouseOfLight
committed
this.appendChild(new OptionsItem("Lower Priority", lowerPriority));
this.appendChild(new OptionsItem("Higher Priority", higherPriority));
this.appendChild(new OptionsItem("Rename", rename(this)));
this.appendChild(new OptionsItem("Export this rule", () => this.appendChild(new ExportField(current_rule))));
this.appendChild(new OptionsItem("Export all rules", () => this.appendChild(new ExportField(...V.defaultRules))));

MouseOfLight
committed
this.appendChild(new OptionsItem("Import rule(s)", () => this.appendChild(new NewRuleField())));
}
}
class ApplicationLog extends Element {
render() {
const elem = document.querySelector("#application-log") || document.createElement("div");
elem.id = "application-log";

MouseOfLight
committed
constructor() {

MouseOfLight
committed
this.element.onblur = () => changeName(this.element.value);
this.element.onkeypress = (e) => { if (returnP(e)) { changeName(this.element.value); } };
elem.setAttribute("value", current_rule.name);
return elem;
render(...args) {
let element = document.getElementById("exportfield");
if (element === null) {
this.appendChild(new ConditionFunction());
this.appendChild(new AssignmentInclusion());
this.appendChild(new FacilityHeadAssignmentInclusion());
const items = [
["Never", false],
["Always", true],
["Custom", "custom"],
["Devotion", "devotion"],
["Trust", "trust"],
["Health", "health.condition"],
["Weight", "weight"],
["Age", "actualAge"],
["Body Age", "physicalAge"],
["Visible Age", "visualAge"],
["Muscles", "muscles"],
["Lactation", "lactation"],
["Pregnancy", "preg"],
["Pregnancy Multiples", "pregType"],
["Belly Implant", "bellyImplant"],
["Belly Size", "belly"],
["Education", "intelligenceImplant"],
["Intelligence", "intelligence"],
["Fetish", "fetish"],
this.fnlist = new List("Activation function", items, false);

MouseOfLight
committed
this.fnlist.setValue(["between", "belongs"].includes(current_rule.condition.function) ? current_rule.condition.data.attribute : current_rule.condition.function);
this.show_custom_editor(CustomEditor, current_rule.condition.data);
this.show_custom_editor(RangeEditor, current_rule.condition.function, current_rule.condition.data);
case "belongs":
this.show_custom_editor(ItemEditor, current_rule.condition.function, current_rule.condition.data);
break;
betweenP(attribute) {
return [
"devotion",
"trust",
"health.condition",
"weight",
"actualAge",
"physicalAge",
"visualAge",
"muscles",
"lactation",
"preg",
"pregType",
"bellyImplant",
"belly",
"intelligenceImplant",
"intelligence",
].includes(attribute);
}
belongsP(attribute) {
return [
"fetish",
].includes(attribute);
}
this.custom_editor = new what(...args);
this.appendChild(this.custom_editor);
}
hide_custom_editor() {
if (this.custom_editor) {
this.custom_editor.remove();
this.custom_editor = null;
}
}
if (value === true || value === false) {
current_rule.condition.function = value;
current_rule.condition.data = {};
this.hide_custom_editor();
} else if (value === "custom") {
current_rule.condition.function = "custom";
current_rule.condition.data = "";
this.show_custom_editor(CustomEditor, current_rule.condition.data);
} else if (this.betweenP(value)) {
current_rule.condition.function = "between";
current_rule.condition.data = {attribute: value, value: [null, null]};
this.show_custom_editor(RangeEditor, current_rule.condition.function, current_rule.condition.data);
} else if (this.belongsP(value)) {
current_rule.condition.function = "belongs";
this.show_custom_editor(ItemEditor, current_rule.condition.function, current_rule.condition.data);
}
}
}
class CustomEditor extends Element {
constructor(data) {
if (data.length === 0) { data = "(slave) => slave.slaveName === 'Fancy Name'"; }
const elem = document.createElement("div");
const textarea = document.createElement("textarea");
textarea.innerHTML = data;

MouseOfLight
committed
$(textarea).blur(() => {
current_rule.condition.data = textarea.value;
// TODO: this would be a good place to cache the Function object that will be used by RuleHasError and ruleAppliesP

MouseOfLight
committed
reload();
});

MouseOfLight
committed

MouseOfLight
committed
const errorMessage = document.createElement("div");
$(errorMessage).addClass("yellow");
errorMessage.innerText = "WARNING: There are errors in this condition. Please ensure the syntax is correct and equality is either '==' or '===', not '='";

MouseOfLight
committed
elem.appendChild(errorMessage);
}
const explanation = document.createElement("div");
explanation.innerHTML = "Insert a valid <a target='_blank' class='link-external' href='https://www.w3schools.com/js/js_comparisons.asp'>JavaScript comparison and/or logical operation</a>.";
elem.appendChild(explanation);

MouseOfLight
committed
const minlabel = document.createElement("label");
minlabel.innerHTML = "Lower bound: ";
elem.appendChild(minlabel);
const min = document.createElement("input");
min.setAttribute("type", "text");
min.onkeypress = e => { if (returnP(e)) { this.setmin(min.value); } };
elem.appendChild(document.createElement("br"));
const maxlabel = document.createElement("label");
maxlabel.innerHTML = "Upper bound: ";
elem.appendChild(maxlabel);
const max = document.createElement("input");
max.setAttribute("type", "text");
max.onkeypress = e => { if (returnP(e)) { this.setmax(max.value); } };
const infobar = document.createElement("div");
infobar.innerHTML = this.info(data.attribute);
elem.appendChild(infobar);
current_rule.condition.data.value[0] = this.parse(value);
this.min.value = `${current_rule.condition.data.value[0]}`;
current_rule.condition.data.value[1] = this.parse(value);
this.max.value = `${current_rule.condition.data.value[1]}`;
return ({
"devotion": "Very Hateful: (-∞, -95), Hateful: [-95, -50), Resistant: [-50, -20), Ambivalent: [-20, 20], Accepting: (20, 50], Devoted: (50, 95], Worshipful: (95, ∞)",
"trust": "Extremely terrified: (-∞, -95), Terrified: [-95, -50), Frightened: [-50, -20), Fearful: [-20, 20], Careful: (20, 50], Trusting: (50, 95], Total trust: (95, ∞)",
"health.condition": "Death: (-∞, -100), Near Death: [-100, -90), Extremely Unhealthy: [-90, -50), Unhealthy: [-50, -20), Healthy: [-20, 20], Very Healthy: (20, 50], Extremely Healthy: (50, 90], Unnaturally Healthy: (90, ∞)",
"energy": "Frigid: (-∞, 20], Poor: (20, 40], Average: (40, 60], Powerful: (60, 80], Sex Addict: (80, 100), Nympho: 100",
"weight": "Emaciated: (-∞, -95), Skinny: [-95, -30), Thin: [-30, -10), Average: [-10, 10], Plush: (10, 30], Fat: (30, 95], Overweight: (95, ∞)",
"lactation": "None: 0, 1: Natural, 2: Lactation implant",
"preg": "Barren: -2, On contraceptives: -1, Not pregnant: 0, Pregnancy weeks: [1, ∞)",
"pregType": "Fetus count, known only after the 10th week of pregnancy",
"bellyImplant": "Volume in CCs. None: -1",
"belly": "Volume in CCs, any source",
"intelligenceImplant": "Education level. 0: uneducated, 15: educated, 30: advanced education, (0, 15): incomplete education.",
"intelligence": "From moronic to brilliant: [-100, 100]",
"accent": "No accent: 0, Nice accent: 1, Bad accent: 2, Can't speak language: 3 and above",
"waist": "Masculine waist: (95, ∞), Ugly waist: (40, 95], Unattractive waist: (10, 40], Average waist: [-10, 10], Feminine waist: [-40, -10), Wasp waist: [-95, -40), Absurdly narrow: (-∞, -95)",
class ItemEditor extends Element {
render(fn, data) {
const elem = document.createElement("div");
const input = document.createElement("input");
input.setAttribute("type", "text");
input.value = JSON.stringify(data.value);
input.onkeypress = e => { if (returnP(e)) { this.setValue(input); } };
this.input = input;
elem.appendChild(input);
const infobar = document.createElement("div");
infobar.innerHTML = this.info(data.attribute);
elem.appendChild(infobar);
return elem;
}
info(attribute) {
"fetish": "buttslut, cumslut, masochist, sadist, dom, submissive, boobs, pregnancy, none (AKA vanilla)",
setValue(input) {
try {
const arr = JSON.parse(input.value);
current_rule.condition.data.value = arr;
input.value = JSON.stringify(arr);
} catch (e) {
alert(e);
}
}
}
class AssignmentInclusionBase extends ButtonList {
/**
* @param {string} label
* @param {App.Data.JobDesc[]} [jobs]
* @param {App.Entity.Facilities.SingleJobFacility[]} [facilities]
*/
constructor(label, jobs, facilities) {
super(label);
this._attributes = {};
if (jobs !== undefined) {
jobs.forEach(job => {
this._attributes[capFirstChar(job.position)] = job.assignment;
});
if (facilities !== undefined) {
facilities.forEach(f => {
if (f.established && f.desc.defaultJob != null) { /* eslint-disable-line eqeqeq */
const displayName = f.name === "the " + f.genericName ? f.genericName : f.name;
this._attributes[displayName] = f.desc.jobs[f.desc.defaultJob].assignment;
}
});
for (const i in this._attributes) {
this.appendChild(new ButtonItem(i, this.getAttribute(i), current_rule.condition.assignment.includes(this.getAttribute(i))));
const allValues = this.getAllValues();
current_rule.condition.assignment = this.getSelection().concat(current_rule.condition.assignment.filter(a => !allValues.includes(a)));
return this._attributes[what];
}
}
class AssignmentInclusion extends AssignmentInclusionBase {
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
let facilities = [];
for (const f of Object.values(App.Entity.facilities)) {
if (f === App.Entity.facilities.penthouse) {
continue;
}
if (f.established) {
facilities.push(f);
}
}
super("Apply to assignments and facilities", Object.values(App.Data.Facilities.penthouse.jobs), facilities);
}
}
class FacilityHeadAssignmentInclusion extends AssignmentInclusionBase {
constructor() {
const jobs = [];
for (const f of Object.values(App.Entity.facilities)) {
if (f.established && f.desc.manager !== null) {
jobs.push(f.desc.manager);
}
}
super("Apply to facility heads", jobs);
}
}
class SpecificInclusionExclusion extends Options {
constructor() {
this.appendChild(new OptionsItem("Limit to specific slaves", () => this.show_slave_selection()));
this.appendChild(new OptionsItem("Exclude specific slaves", () => this.show_slave_exclusion()));
this.subwidget = null;
}
show_slave_selection() {
this.subwidget = new SlaveSelection();
this.appendChild(this.subwidget);
}
show_slave_exclusion() {
this.subwidget = new SlaveExclusion();
this.appendChild(this.subwidget);
}
}
class SlaveSelection extends ButtonList {
constructor() {
super("Include specific slaves");
V.slaves.forEach(slave => this.appendChild(new ButtonItem(
[slave.slaveName, slave.slaveSurname].join(" "),
slave.ID,
current_rule.condition.selectedSlaves.includes(slave.ID))));
}
onchange() {
current_rule.condition.selectedSlaves = this.getSelection();
}
}
class SlaveExclusion extends ButtonList {
constructor() {
super("Exclude specific slaves");
V.slaves.forEach(slave => this.appendChild(new ButtonItem(
[slave.slaveName, slave.slaveSurname].join(" "),
slave.ID,
current_rule.condition.excludedSlaves.includes(slave.ID))));
}
onchange() {
current_rule.condition.excludedSlaves = this.getSelection();
}
// parent section for effect editing
class EffectEditor extends Element {
constructor() {
this.appendChild(new AppearanceTab(this.tabButtons_));
this.appendChild(new CosmeticTab(this.tabButtons_));
this.appendChild(new BodyModTab(this.tabButtons_));
this.appendChild(new AutosurgeryTab(this.tabButtons_));
this.appendChild(new RegimenTab(this.tabButtons_));
this.appendChild(new BehaviourTab(this.tabButtons_));
this.appendChild(new OtherTab(this.tabButtons_));
element.className = "ra-setters";
this.tabButtons_ = document.createElement("div");
element.appendChild(this.tabButtons_);
class AppearanceTab extends Tab {
constructor(tabButtons) {
super("appearance", "Appearance", tabButtons);
this.appendChild(new ClothesList());
this.appendChild(new CollarList());
this.appendChild(new GagList());
this.appendChild(new MaskList());
this.appendChild(new ShoeList());
this.appendChild(new CorsetList());
this.appendChild(new VagChastityList());
this.appendChild(new VagAccVirginsList());
this.appendChild(new VagAccAVirginsList());
this.appendChild(new VagAccOtherList());
this.appendChild(new DickChastityList());
this.appendChild(new DickAccVirginsList());
this.appendChild(new DickAccOtherList());
this.appendChild(new AnalChastityList());
this.appendChild(new ButtplugsVirginsList());
this.appendChild(new ButtplugsOtherList());
this.appendChild(new ButtplugAttachmentsList());
class RegimenTab extends Tab {
constructor(tabButtons) {
super("regimen", "Physical Regimen", tabButtons);
this.appendChild(new GrowthList());
this.appendChild(new CurrativesList());
this.appendChild(new AphrodisiacList());
this.appendChild(new ContraceptiveList());
this.appendChild(new FemaleHormonesList());
this.appendChild(new ShemaleHormonesList());
this.appendChild(new GeldingHormonesList());
this.appendChild(new OtherDrugsList());
if (V.enema === 1) {
this.appendChild(new EnemaList());
}
this.appendChild(new DietList());
this.appendChild(new DietGrowthList());
this.appendChild(new DietBaseList());
if (V.arcologies[0].FSHedonisticDecadenceResearch === 1) {
this.appendChild(new DietSolidFoodList());
}
this.appendChild(new MuscleList());
this.appendChild(new BraceList());
class BehaviourTab extends Tab {
constructor(tabButtons) {
super("behavior", "Behavior", tabButtons);
this.appendChild(new AutomaticAssignmentList());
if (V.pit === 1) {
this.appendChild(new PitAssignmentList());
}
this.appendChild(new LivingStandardList());
this.appendChild(new PunishmentList());
this.appendChild(new RewardList());
this.appendChild(new ReleaseMasturbationSwitch());
this.appendChild(new ReleasePartnerSwitch());
this.appendChild(new ReleaseFamilySwitch());
this.appendChild(new ReleaseSlavesSwitch());
this.appendChild(new ReleaseMasterSwitch());
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 PornBroadcastStatus());
class OtherTab extends Tab {
constructor(tabButtons) {
super("other", "Other", tabButtons);
this.appendChild(new ClearLabelSwitch());
this.appendChild(new LabelRemoveList());
}
}
class ClearLabelSwitch extends BooleanSwitch {
constructor() {

MouseOfLight
committed
super("Remove all tags (Global switch)", [false, true]);
this.setValue(current_rule.set.labelTagsClear);
this.onchange = (value) => current_rule.set.labelTagsClear = value;
class CosmeticTab extends Tab {
constructor(tabButtons) {
super("cosmetic", "Cosmetic", tabButtons);
this.appendChild(new EyewearList());
this.appendChild(new LensesList());
this.appendChild(new MakeupList());
this.appendChild(new NailsList());
this.appendChild(new HairLengthList());
this.appendChild(new EyebrowColorList());
this.appendChild(new EyebrowStyleList());
this.appendChild(new EyebrowFullnessList());
this.appendChild(new MarkingsList());
this.appendChild(new HornColorList());
class BodyModTab extends Tab {
constructor(tabButtons) {
super("bodyMod", "Body Mod", tabButtons);
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
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());
this.appendChild(new ButtockTattooList());
this.appendChild(new AnalTattooList());
this.appendChild(new LegTattooList());
this.appendChild(new BirthsTattooList());
this.appendChild(new AbortionTattooList());
class AutosurgeryTab extends Tab {
constructor(tabButtons) {
super("autosurgery", "Autosurgery", tabButtons);
this.appendChild(new AutosurgerySwitch());
this.appendChild(new SmellSurgeryList());
this.appendChild(new TasteSurgeryList());
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());
this.appendChild(new EarShapeSurgeryList());
this.appendChild(new HornSurgeryList());
class ClothesList extends List {
constructor() {
const items = [
["Select her own outfit", "choosing her own clothes"]
];
super("Clothes", items);
const nclothes = isItemAccessible.array(App.Data.misc.niceClothes);
nclothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
this._nice = new ListSubSection(this, "Nice", nclothes);
const hclothes = isItemAccessible.array(App.Data.misc.harshClothes);
hclothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
this._harsh = new ListSubSection(this, "Harsh", hclothes);
_appendContentTo(container) {
super._appendContentTo(container);
this._nice._appendContentTo(container);
this._harsh._appendContentTo(container);
}
}
class CollarList extends List {
constructor() {
const items = [
["No collar", "none"],
];
super("Collar", items);
const niceCollars = isItemAccessible.array(App.Data.misc.niceCollars);
niceCollars.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
this._nice = new ListSubSection(this, "Nice", niceCollars);
const harshCollars = isItemAccessible.array(App.Data.misc.harshCollars);
harshCollars.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
this._harsh = new ListSubSection(this, "Harsh", harshCollars);
this.setValue(current_rule.set.collar);
this.onchange = (value) => current_rule.set.collar = value;
_appendContentTo(container) {
super._appendContentTo(container);
this._nice._appendContentTo(container);
this._harsh._appendContentTo(container);
}
class MaskList extends ListSelector {
constructor() {
super("Mask", isItemAccessible.array(App.Data.misc.faceAccessory ));
this.setValue(current_rule.set.faceAccessory );
this.onchange = (value) => current_rule.set.faceAccessory = value;
}
}
class GagList extends ListSelector {
constructor() {
super("Gag", isItemAccessible.array(App.Data.misc.mouthAccessory ));
this.setValue(current_rule.set.mouthAccessory );
this.onchange = (value) => current_rule.set.mouthAccessory = value;
}
}
class ShoeList extends ListSelector {
super("Shoes", isItemAccessible.array(App.Data.misc.shoes));
this.setValue(current_rule.set.shoes);
this.onchange = (value) => current_rule.set.shoes = value;
class CorsetList extends ListSelector {
super("Corsetage", isItemAccessible.array(App.Data.misc.bellyAccessories));
this.onchange = (value) => current_rule.set.bellyAccessory = value;
class GlovesList extends ListSelector {
constructor() {
const items = [
["none"],
["hand gloves"],
["elbow gloves"],
];
super("Arm accessory", items, true, false, true);
this.setValue(current_rule.set.armAccessory);
this.onchange = (value) => current_rule.set.armAccessory = value;
}
}
["none"],
["short stockings"],
["long stockings"],
super("Leg accessory", items, true, false, true);
this.setValue(current_rule.set.legAccessory);
this.onchange = (value) => current_rule.set.legAccessory = value;
}
}
this.setValue(current_rule.set.chastityVagina);
this.onchange = (value) => current_rule.set.chastityVagina = value;
}
class VagAccVirginsList extends ListSelector {
super("Vaginal accessories for virgins", isItemAccessible.array(App.Data.misc.vaginalAccessories));
this.setValue(current_rule.set.virginAccessory);
this.onchange = (value) => current_rule.set.virginAccessory = value;
class VagAccAVirginsList extends ListSelector {
super("Vaginal accessories for anal virgins", isItemAccessible.array(App.Data.misc.vaginalAccessories));
this.setValue(current_rule.set.aVirginAccessory);
this.onchange = (value) => current_rule.set.aVirginAccessory = value;
class VagAccOtherList extends ListSelector {
super("Vaginal accessories for other slaves", isItemAccessible.array(App.Data.misc.vaginalAccessories));
this.setValue(current_rule.set.vaginalAccessory);
this.onchange = (value) => current_rule.set.vaginalAccessory = value;
class VaginalAttachmentsList extends ListSelector {
super("Vaginal attachments for slaves with vaginal accessories", isItemAccessible.array(App.Data.misc.vaginalAttachments));
this.setValue(current_rule.set.vaginalAttachment);
this.onchange = (value) => current_rule.set.vaginalAttachment = value;
}
this.setValue(current_rule.set.chastityPenis);
this.onchange = (value) => current_rule.set.chastityPenis = value;
}
class DickAccVirginsList extends ListSelector {
super("Dick accessories for anal virgins", isItemAccessible.array(App.Data.misc.dickAccessories));
this.setValue(current_rule.set.aVirginDickAccessory);
this.onchange = (value) => current_rule.set.aVirginDickAccessory = value;
class DickAccOtherList extends ListSelector {
super("Dick accessories for other slaves", isItemAccessible.array(App.Data.misc.dickAccessories));
this.setValue(current_rule.set.dickAccessory);
this.onchange = (value) => current_rule.set.dickAccessory = value;
this.setValue(current_rule.set.chastityAnus);
this.onchange = (value) => current_rule.set.chastityAnus = value;
}
class ButtplugsVirginsList extends ListSelector {
super("Buttplugs for anal virgins", isItemAccessible.array(App.Data.misc.buttplugs));
this.setValue(current_rule.set.aVirginButtplug);
this.onchange = (value) => current_rule.set.aVirginButtplug = value;
class ButtplugsOtherList extends ListSelector {
super("Buttplugs for other slaves", isItemAccessible.array(App.Data.misc.buttplugs));
this.setValue(current_rule.set.buttplug);
this.onchange = (value) => current_rule.set.buttplug = value;
class ButtplugAttachmentsList extends ListSelector {
constructor() {
super("Buttplug attachments for slaves with buttplugs", isItemAccessible.array(App.Data.misc.buttplugAttachments));
this.setValue(current_rule.set.buttplugAttachment);
this.onchange = (value) => current_rule.set.buttplugAttachment = value;
}
}