diff --git a/src/js/DefaultRules.tw b/src/js/DefaultRules.tw index e79c9e1e81d8c89518b62d22a616455ac12bb487..a0d2a03356e63cf3a0c6f746ee34abc206e0b79e 100644 --- a/src/js/DefaultRules.tw +++ b/src/js/DefaultRules.tw @@ -1207,6 +1207,7 @@ window.DefaultRules = (function() { } else if ((slave.boobs >= 1600) && (slave.muscles > 5) && (slave.diet == "muscle building") && ((rule.muscles == "no default setting") || (rule.muscles === 0))) { */ if (rule.diet === "healthy" && slave.diet !== "healthy") { + slave.diet = "healthy"; r += `<br>${slave.slaveName} has been assigned to a healthy diet.`; } else if ((slave.boobs >= 1600) && (slave.muscles > 5) && (slave.diet == "muscle building") && ((rule.muscles == "no default setting") || (rule.muscles === 0))) { slave.diet = "healthy"; @@ -1218,7 +1219,7 @@ window.DefaultRules = (function() { } } else { if (!(isNaN(rule.diet))) { - if ((slave.weight > rule.diet)) { + if ((slave.weight - rule.diet) > 5) { if ((slave.diet !== "restricted")) { slave.diet = "restricted"; r += `<br>${slave.slaveName} is too fat so her diet has been set to restricted.`; @@ -1227,7 +1228,7 @@ window.DefaultRules = (function() { slave.drugs = "appetite suppressors"; r += `<br>${slave.slaveName} is too fat so she will be given weight loss pills.`; } - } else if ((slave.weight < rule.diet)) { + } else if ((slave.weight - rule.diet) < -5) { if ((slave.diet !== "fattening")) { slave.diet = "fattening"; r += `<br>${slave.slaveName} is too skinny so her diet has been set to fattening.`; diff --git a/src/js/rulesAssistant.tw b/src/js/rulesAssistant.tw index 9dd70b1a0393c4129f9b76c4c2940d8b05d6b352..b0682e7bf23b78a38e23589e55bd12f7750e6135 100644 --- a/src/js/rulesAssistant.tw +++ b/src/js/rulesAssistant.tw @@ -60,7 +60,7 @@ window.CheckAutoRulesActivate = function CheckAutoRulesActivate(slave) { if (applies) { if (!ruleApplied(slave, rule)) { slave.currentRules.push(rule.ID); - r += `<br><span class="tan">Rule ${rule.ID} (${rule.name}) now applies to ${slave.slaveName}, who is assigned to ${slave.assignment}</span>\n`; + r += `<br><span class="tan">Rule "${rule.name}" now applies to ${slave.slaveName}, who is assigned to ${slave.assignment}.</span>\n`; } } else if (ruleApplied(slave, rule)) r += RARemoveRule(slave, rule); @@ -306,6 +306,7 @@ window.emptyDefaultRule = function emptyDefaultRule() { surgery_holes: "no default setting", surgery_hair: "no default setting", surgery_bodyhair: "no default setting", + surgery_vasectomy: "no default setting", underArmHColor: "no default setting", underArmHStyle: "no default setting", drug: "no default setting", @@ -317,3 +318,14 @@ window.emptyDefaultRule = function emptyDefaultRule() { }; return rule; }; + + +// Saves the slave, silently fires the RA, saves the slave's after-RA state, and then reverts the slave. +// Call and then check potential change against $slaveAfterRA to see if the RA would revert it. +window.RulesDeconfliction = function RulesDeconfliction(slave) { + const before = clone(slave); + CheckAutoRulesActivate(slave); + DefaultRules(slave); + V.slaveAfterRA = clone(slave); + slave = before; +} diff --git a/src/js/rulesAssistantOptions.tw b/src/js/rulesAssistantOptions.tw index a0b75c265a26c668903f41ebf4ffad41869b4a39..942c29a9281383fda36daedd28c5222ee13520f2 100644 --- a/src/js/rulesAssistantOptions.tw +++ b/src/js/rulesAssistantOptions.tw @@ -369,7 +369,10 @@ window.rulesAssistantOptions = (function() { } render() { + let element = document.getElementById("importfield"); + if (element !== null) { return element; } const container = document.createElement("div"); + container.id = "importfield"; const textarea = document.createElement("textarea"); textarea.placeholder = "Paste your rule here"; container.appendChild(textarea); @@ -386,8 +389,10 @@ window.rulesAssistantOptions = (function() { const text = this.textarea.value; try { const rule = JSON.parse(text); - if (!rule.ID) rule.ID = generateNewID(); - V.defaultRules.push(rule); + if (rule instanceof Array) + rule.forEach(r => V.defaultRules.push(r)) + else + V.defaultRules.push(rule); reload(this.root); } catch (e) { alert("Couldn't import that rule:\n" + e.message); @@ -456,7 +461,7 @@ window.rulesAssistantOptions = (function() { this.appendChild(new OptionsItem("Rename", () => this.appendChild(new RenameField(root)))); 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)))); - this.appendChild(new OptionsItem("Import a rule", () => this.appendChild(new NewRuleField(root)))); + this.appendChild(new OptionsItem("Import rule(s)", () => this.appendChild(new NewRuleField(root)))); } } @@ -487,10 +492,10 @@ window.rulesAssistantOptions = (function() { render(...args) { let element = document.getElementById("exportfield"); if (element === null) { - element = document.getElementById("exportfield") || document.createElement("textarea"); + element = document.createElement("textarea"); element.id = "exportfield"; } - element.value = args.map(i => JSON.stringify(i, null, 2)).join("\n\n"); + element.value = JSON.stringify(args, null, 2); return element; } } @@ -530,6 +535,8 @@ window.rulesAssistantOptions = (function() { ["Education", "intelligenceImplant"], ["Intelligence", "intelligence"], ["Fetish", "fetish"], + ["Accent", "accent"], + ["Waist", "waist"], ]; this.fnlist = new List("Activation function", items); this.fnlist.setValue(current_rule.condition.function === "between" ? current_rule.condition.data.attribute : current_rule.condition.function); @@ -571,6 +578,8 @@ window.rulesAssistantOptions = (function() { "belly", "intelligenceImplant", "intelligence", + "accent", + "waist", ].includes(attribute); } @@ -708,6 +717,8 @@ window.rulesAssistantOptions = (function() { "belly": "Volume in CCs, any source", "intelligenceImplant": "Education level. 0: uneducated, 1: educated, (0, 1): incomplete education.", "intelligence": "From moronic to brilliant: [-3, 3]", + "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)", }[attribute] || " "); } } @@ -998,8 +1009,10 @@ window.rulesAssistantOptions = (function() { super("Autosurgery Settings", true); this.appendChild(new VisionSurgeryList()); this.appendChild(new LactationSurgeryList()); - if (V.seeDicks || V.makeDicks) + if (V.seeDicks || V.makeDicks) { this.appendChild(new SemenSurgeryList()); + this.appendChild(new VasectomyList()); + } this.appendChild(new CosmeticSurgeryList()); this.appendChild(new LipSurgeryList()); this.appendChild(new ButtSurgeryList()); @@ -2895,6 +2908,19 @@ window.rulesAssistantOptions = (function() { } } + class VasectomyList extends List { + constructor() { + const items = [ + ["no default setting"], + ["apply vasectomy", true], + ["undo vasectomy", false], + ]; + super("Apply or undo vasectomy for slaves with testicles", items); + this.setValue(current_rule.set.surgery_vasectomy); + this.onchange = (value) => current_rule.set.surgery_vasectomy = value; + } + } + class CosmeticSurgeryList extends List { constructor() { const items = [ diff --git a/src/js/rulesAutosurgery.tw b/src/js/rulesAutosurgery.tw index 3a8833145229fd9640e04e7748b436ee849e6744..6a3d7c68e769f60223f4a9db0393aa05110a6bb4 100644 --- a/src/js/rulesAutosurgery.tw +++ b/src/js/rulesAutosurgery.tw @@ -512,6 +512,24 @@ window.rulesAutosurgery = (function() { slave.preg = 0; slave.bellyImplant = -1; V.cash -= V.surgeryCost; + } else if (slave.balls > 0 && slave.vasectomy === 0 && thisSurgery.vasectomy === true) { + surgeries.push("vasectomy"); + V.surgeryType = "vasectomy"; + if (V.PC.medicine >= 100) + slave.health -= 5; + else + slave.health -= 10; + slave.vasectomy = 1 + V.cash -= V.surgeryCost; + } else if (slave.balls > 0 && slave.vasectomy === 1 && thisSurgery.vasectomy === false) { + surgery.push("undo vasectomy"); + V.surgeryType = "vasectomy undo"; + if (V.PC.medicine >= 100) + slave.health -=5; + else + slave.health -= 10; + slave.vasectomy = 0; + V.cash -= V.surgeryCost; } } diff --git a/src/uncategorized/hgApplication.tw b/src/uncategorized/hgApplication.tw index eff80d115733fe4046dc67f3fa71300c3ee01381..b0a26d1ff6f84ff4f4ea3d11a3c028e07661948c 100644 --- a/src/uncategorized/hgApplication.tw +++ b/src/uncategorized/hgApplication.tw @@ -324,7 +324,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $ <<for _i = 0; _i < 1; _i++>> <<if $activeSlave.earPiercing == 0>> <<set $activeSlave.earPiercing = 1>> - <<RulesDeconfliction $activeSlave>> + <<run RulesDeconfliction($activeSlave)>> <<if $activeSlave.earPiercing != $slaveAfterRA.earPiercing>> <<set _piercingForbidden = 1, $activeSlave.earPiercing = 0>> <<else>> @@ -335,7 +335,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $ <</if>> <<if $activeSlave.nosePiercing == 0>> <<set $activeSlave.nosePiercing = 1>> - <<RulesDeconfliction $activeSlave>> + <<run RulesDeconfliction($activeSlave)>> <<if $activeSlave.nosePiercing != $slaveAfterRA.nosePiercing>> <<set _piercingForbidden = 1, $activeSlave.nosePiercing = 0>> <<else>> @@ -346,7 +346,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $ <</if>> <<if $activeSlave.eyebrowPiercing == 0>> <<set $activeSlave.eyebrowPiercing = 1>> - <<RulesDeconfliction $activeSlave>> + <<run RulesDeconfliction($activeSlave)>> <<if $activeSlave.eyebrowPiercing != $slaveAfterRA.eyebrowPiercing>> <<set _piercingForbidden = 1, $activeSlave.eyebrowPiercing = 0>> <<else>> @@ -357,7 +357,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $ <</if>> <<if $activeSlave.lipsPiercing == 0>> <<set $activeSlave.lipsPiercing = 1>> - <<RulesDeconfliction $activeSlave>> + <<run RulesDeconfliction($activeSlave)>> <<if $activeSlave.lipsPiercing != $slaveAfterRA.lipsPiercing>> <<set _piercingForbidden = 1, $activeSlave.lipsPiercing = 0>> <<else>> @@ -368,7 +368,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $ <</if>> <<if $activeSlave.navelPiercing == 0>> <<set $activeSlave.navelPiercing = 1>> - <<RulesDeconfliction $activeSlave>> + <<run RulesDeconfliction($activeSlave)>> <<if $activeSlave.navelPiercing != $slaveAfterRA.navelPiercing>> <<set _piercingForbidden = 1, $activeSlave.navelPiercing = 0>> <<else>>