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.
<br>For things like breast, butt, lip, dick and ball injections you need to only set the growth targets in Physical Regimen and I'll try to figure out how to best achieve them, you probably won't need a separate rules for each of them or have to worry about ending the injections.</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 <kbd>(slave) =></kbd> followed by a valid <a target='_blank' class='link-external' href='https://www.w3schools.com/js/js_comparisons.asp'>JavaScript comparison and/or logical operation</a>. For variable names to use see <a target='_blank' class='link-external' href='https://gitgud.io/pregmodfan/fc-pregmod/-/blob/pregmod-master/slave%20variables%20documentation%20-%20Pregmod.txt'>this list</a>.`;

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 {FC.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 {
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
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();
}
class ApplyRuleOnce extends ButtonItem {
constructor() {
super("Do not apply rule (and overwrite manual changes) every time rule is executed, but only once per slave", false, (current_rule.condition.applyRuleOnce === true));
}
onchange() {
if (!current_rule.condition.applyRuleOnce) {
current_rule.condition.applyRuleOnce = true;
} else {
current_rule.condition.applyRuleOnce = false;
}
}
}
// 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 AphrodisiacList());
this.appendChild(new ContraceptiveList());
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());
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());
this.appendChild(new PunishmentList());
this.appendChild(new RewardList());
this.appendChild(new ReleaseMasturbationSwitch());
this.appendChild(new ReleasePartnerSwitch());
this.appendChild(new ReleaseFacilityLeaderSwitch());
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 IrisColorList());
this.appendChild(new PupilShapeList());
this.appendChild(new ScleraColorList());
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);
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
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.clothes, "harsh", !true);
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.clothes, "harsh", true);
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.slaveWear.collars, "harsh", false);
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.slaveWear.collars, "harsh", true);
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() {
const pairs = [["No mask", "none"]].concat(isItemAccessible.array(App.Data.slaveWear.faceAccessory ));
this.setValue(current_rule.set.faceAccessory );
this.onchange = (value) => current_rule.set.faceAccessory = value;
}
}
class GagList extends ListSelector {
constructor() {
const pairs = [["No gag", "none"]].concat(isItemAccessible.array(App.Data.slaveWear.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.slaveWear.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.slaveWear.bellyAccessories));
this.onchange = (value) => current_rule.set.bellyAccessory = value;
class GlovesList extends ListSelector {
constructor() {
const items = [
["none"],
["hand gloves"],
["elbow gloves"],
];
this.setValue(current_rule.set.armAccessory);
this.onchange = (value) => current_rule.set.armAccessory = value;
}
}
["none"],
["short stockings"],
["long stockings"],
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.slaveWear.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.slaveWear.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.slaveWear.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.slaveWear.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.slaveWear.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.slaveWear.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.slaveWear.buttplugs));