diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js index d51ecab4c7bb55d3237d57e0ba27088d5eb1db3f..02643bb3432fcdaada267a12e3bd00c276ed8488 100644 --- a/src/endWeek/saLongTermEffects.js +++ b/src/endWeek/saLongTermEffects.js @@ -736,6 +736,9 @@ App.SlaveAssignment.longTermEffects = (function() { slave.hormoneBalance -= 4; } else if (slave.hormones === -2) { slave.hormoneBalance -= 12; + } else { + slave.drugs = "no drugs"; + r.push(`${He} is not on hormones, so ${he} has been taken off hormone enhancers.`); } if (V.hormoneUpgradePower === 1) { if (slave.hormones === 1) { diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js index e520dedab5bd0e1c04db3bed09b9b976ce4248bc..ed45109b57e076010e0767e6109d44058c11aa2a 100644 --- a/src/endWeek/saRelationships.js +++ b/src/endWeek/saRelationships.js @@ -350,7 +350,7 @@ App.SlaveAssignment.relationships = (function() { if (slave.relationship > 0) { friend = getSlave(slave.relationshipTarget); ({ - him2, his2 + him2, his2, wife2 } = getPronouns(friend).appendSuffix("2")); } if (slave.fetish === "mindbroken" && slave.relationship !== -3) { diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js index 493156a1daa902145d9674f8e95e06c37a649dba..46ca906bff1ab593d748c9b61edede353a978d18 100644 --- a/src/events/intro/introSummary.js +++ b/src/events/intro/introSummary.js @@ -147,18 +147,17 @@ App.Intro.summary = function() { V.PC.skill.medicine = 100; break; case "wealth": + case "celebrity": if (V.PC.vagina === 1) { V.PC.vagina = 2; } break; case "trust fund": V.PC.intelligenceImplant = 15; - V.PC.skill.trading = 0; V.PC.skill.warfare = -50; V.PC.skill.slaving = -50; V.PC.skill.engineering = -50; V.PC.skill.medicine = -50; - V.PC.skill.hacking = 0; break; case "rich kid": V.PC.intelligenceImplant = 5; @@ -179,11 +178,9 @@ App.Intro.summary = function() { V.PC.skill.slaving = -25; V.PC.skill.engineering = -25; V.PC.skill.medicine = -25; - V.PC.skill.hacking = 0; break; case "business kid": V.PC.intelligenceImplant = 5; - V.PC.skill.trading = 0; V.PC.skill.warfare = -80; V.PC.skill.slaving = -80; V.PC.skill.engineering = -100; @@ -200,12 +197,10 @@ App.Intro.summary = function() { V.PC.skill.slaving = -25; V.PC.skill.engineering = -25; V.PC.skill.medicine = -25; - V.PC.skill.hacking = 0; break; case "child soldier": V.PC.intelligenceImplant = 0; V.PC.skill.trading = -100; - V.PC.skill.warfare = 0; V.PC.skill.slaving = -80; V.PC.skill.engineering = -100; V.PC.skill.medicine = -100; @@ -221,13 +216,11 @@ App.Intro.summary = function() { V.PC.skill.slaving = 50; V.PC.skill.engineering = -25; V.PC.skill.medicine = -20; - V.PC.skill.hacking = 0; break; case "slave tender": V.PC.intelligenceImplant = 0; V.PC.skill.trading = -100; V.PC.skill.warfare = -100; - V.PC.skill.slaving = 0; V.PC.skill.engineering = -100; V.PC.skill.medicine = -60; V.PC.skill.hacking = -100; @@ -271,14 +264,9 @@ App.Intro.summary = function() { V.PC.skill.warfare = -100; V.PC.skill.slaving = -100; V.PC.skill.engineering = -100; - V.PC.skill.medicine = 0; V.PC.skill.hacking = -20; break; - case "celebrity": - if (V.PC.vagina === 1) { - V.PC.vagina = 2; - } - break; + // celebrity case "rising star": V.PC.intelligenceImplant = 15; V.PC.skill.trading = -50; @@ -286,7 +274,6 @@ App.Intro.summary = function() { V.PC.skill.slaving = -50; V.PC.skill.engineering = -50; V.PC.skill.medicine = -50; - V.PC.skill.hacking = 0; break; case "child star": V.PC.intelligenceImplant = 0; @@ -339,7 +326,6 @@ App.Intro.summary = function() { V.PC.anus = 1; V.PC.clothes = "a slutty outfit"; V.PC.intelligenceImplant = 0; - V.PC.skill.trading = 0; V.PC.skill.warfare = -100; V.PC.skill.slaving = -100; V.PC.skill.engineering = -100; @@ -408,12 +394,10 @@ App.Intro.summary = function() { V.PC.skill.warfare = 50; V.PC.skill.slaving = 50; V.PC.skill.engineering = -100; - V.PC.skill.medicine = 0; V.PC.skill.hacking = 50; break; case "hoodlum": V.PC.intelligenceImplant = 0; - V.PC.skill.trading = 0; V.PC.skill.warfare = -20; V.PC.skill.slaving = -20; V.PC.skill.engineering = -100; @@ -527,7 +511,6 @@ App.Intro.summary = function() { App.UI.DOM.appendNewElement("h2", el, "Economy"); let options = new App.UI.OptionsGroup(); - let option; V.localEcon = V.economy; options.addOption("Economic climate", "baseDifficulty") @@ -589,13 +572,10 @@ App.Intro.summary = function() { } /* closes V.customVariety is defined */ - el.append(options.render()); if (V.customVariety) { - el.append(App.UI.nationalitiesDisplay()); + options.addCustom(App.UI.nationalitiesDisplay()); } - options = new App.UI.OptionsGroup(); - options.addOption("", "plot") .addValue("Enable non-erotic events", 1).on().customDescription("Game mode: <strong>two-handed</strong>. Includes non-erotic events concerning the changing world.") .addValue("Disable non-erotic events", 0).off().customDescription("Game mode: <strong>one-handed</strong>. No non-erotic events concerning the changing world."); @@ -621,7 +601,7 @@ App.Intro.summary = function() { if (V.terrain !== "oceanic") { // TODO: this is from original, but seems unused? - option = options.addOption(`The Free City is located in <strong>${V.continent}</strong>.`, "continent") + options.addOption(`The Free City is located in <strong>${V.continent}</strong>.`, "continent") .addValue("North America").addCallback(() => V.language = "English") .addValue("South America").addCallback(() => V.language = "Spanish") .addValue("Brazil").addCallback(() => V.language = "Portuguese") @@ -715,13 +695,13 @@ App.Intro.summary = function() { options = new App.UI.OptionsGroup(); options.addOption("The Special Force Mod is", "Toggle", V.SF) - .addValue("Enabled", 1).on().addValue("Disabled", 0).off() - .addComment(`This mod is initially from anon1888 but expanded by SFanon offers a lategame special (started out as security but changed to special in order to try and reduce confusion with CrimeAnon's separate Security Expansion (SecExp) mod) force, that is triggered after week 72. + .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); + options.addComment(`This mod is initially from anon1888 but expanded by SFanon offers a lategame special (started out as security but changed to special in order to try and reduce confusion with CrimeAnon's separate Security Expansion (SecExp) mod) force, that is triggered after week 72. It is non-canon where it conflicts with canonical updates to the base game.`); options.addOption("The Security Expansion Mod is", "secExpEnabled") - .addValue("Enabled", 1).on().addValue("Disabled", 0).off() - .addComment(`This mod introduces security and crime in the arcology, as well as attacks and battles. + .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); + options.addComment(`This mod introduces security and crime in the arcology, as well as attacks and battles. The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.`); el.append(options.render()); @@ -840,14 +820,8 @@ App.Intro.summary = function() { el.append(options.render()); App.UI.DOM.appendNewElement("h2", el, "Images"); - options = new App.UI.OptionsGroup(); - - options.addOption("Images are", "seeImages") - .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); - - el.append(options.render()); - el.append(App.UI.artOptions()); + return el; } }; diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js index 9468771f11d8d28f54d940a53e64aed7166bc039..96b5024ccaee1d0cc7e6bd95e6ca3d56a2f23e11 100644 --- a/src/events/intro/pcAppearance.js +++ b/src/events/intro/pcAppearance.js @@ -384,16 +384,20 @@ App.UI.Player.design = function() { .addRange(16, 37, "<=", "Pregnant").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; }) .addRange(40, 42, "<=", "Ready to drop").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; }) .addRange(43, 42, ">", "Ready to drop with octuplets").addCallback(() => { V.PC.pregType = 8; V.PC.labor = 1; }); + const r =[]; if (V.cheatMode) { option.showTextBox(); - option.addComment(`how far along your pregnancy is (pregMood kicks in at 24+ weeks) - -2: infertile, -1: contraceptives, 0: not pregnant, 1 - 42: pregnant, 43+: giving birth`); + r.push(`How far along your pregnancy is (pregMood kicks in at 24+ weeks) - -2: infertile, -1: contraceptives, 0: not pregnant, 1 - 42: pregnant, 43+: giving birth.`); } if (V.PC.preg === -1) { - option.addComment("You can't get pregnant, however there will be a slight increase to living expenses."); + r.push("You can't get pregnant, however there will be a slight increase to living expenses."); } if (V.PC.counter.birthsTotal > 0) { - options.addOption("").addComment(`You have given birth to <strong>${V.PC.counter.birthsTotal}</strong> babies.`); + r.push(`You have given birth to <strong>${V.PC.counter.birthsTotal}</strong> babies.`); + } + if (r.length >0) { + option.addComment(r.join(" ")); } option = options.addOption("Hormone effects", "pregMood", V.PC) @@ -409,8 +413,8 @@ App.UI.Player.design = function() { } if (V.cheatMode) { - option = options.addOption("Fetus Count", "pregType", V.PC).showTextBox().addComment(`how many you're having (1-8)`); - option = options.addOption("Pregnancy Source", "pregSource", V.PC) + options.addOption("Fetus Count", "pregType", V.PC).showTextBox().addComment(`how many you're having (1-8)`); + options.addOption("Pregnancy Source", "pregSource", V.PC) .addValueList([ ["Unknown", 0], ["Self-impregnation", -1], diff --git a/src/events/intro/pcBodyIntro.js b/src/events/intro/pcBodyIntro.js index f22df55907db368a7b9cf8cda7ceb257ba3a63f5..64a220a2604b7079caeee607ff05d190c7dac2bb 100644 --- a/src/events/intro/pcBodyIntro.js +++ b/src/events/intro/pcBodyIntro.js @@ -52,18 +52,18 @@ App.Intro.PCBodyIntro = function() { } // Lower deck - comment = `These options will affect sex scenes. Feminine options will increase difficulty.`; r = []; + let option; r.push(`Behind the front of my tailored`); if (V.PC.dick !== 0) { if (V.PC.vagina !== -1) { r.push(`slacks, <strong>both a penis and a vagina.</strong>`); - options.addOption(r.join(" ")) + option = options.addOption(r.join(" ")) .customButton("Remove the penis", penisRemove, "PC Body Intro") .customButton("Remove the vagina", vaginaRemove, "PC Body Intro"); } else { r.push(`slacks, a <strong>penis.</strong>`); - options.addOption(r.join(" ")) + option = options.addOption(r.join(" ")) .customButton( "Switch to vagina", () => { @@ -77,7 +77,7 @@ App.Intro.PCBodyIntro = function() { } } else { r.push(`skirt, a <strong>vagina.</strong>`); - options.addOption(r.join(" ")) + option = options.addOption(r.join(" ")) .customButton( "Switch to penis", () => { @@ -89,6 +89,7 @@ App.Intro.PCBodyIntro = function() { ) .customButton("Add a penis", penisAdd, "PC Body Intro"); } + option.addComment(`These options will affect sex scenes. Feminine options will increase difficulty.`); el.append(options.render()); diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js index f0161b7a3b8699b2d36872e4368a938365b042e2..96ec38bc8c26a8acdfae6c6a872ece274ec4c163 100644 --- a/src/facilities/bodyModification/bodyModification.js +++ b/src/facilities/bodyModification/bodyModification.js @@ -147,9 +147,7 @@ App.UI.bodyModification = function(slave, cheat = false) { r.push(`No matter how you chose to apply it, being scarred <span class="health.dec"> hurt ${his} health a little.</span>`); healthDamage(slave, 10); } - r.push(`Afterwards you seal the wounds with a white medical spray. Infection is no risk to `); - slave.slaveName; - r.push(` thanks to your curatives, but in order to form obvious scar tissue you had to keep air out and delay normal healing as long as possible.`); + r.push(`Afterwards you seal the wounds with a white medical spray. Infection is no risk to ${slave.slaveName} thanks to your curatives, but in order to form obvious scar tissue you had to keep air out and delay normal healing as long as possible.`); scarApplied = false; } if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { @@ -244,19 +242,21 @@ App.UI.bodyModification = function(slave, cheat = false) { // Determine parts that cannot be pierced let validPiercingLocations = Array.from(piercingLocations); - if (slave.nipples !== "fuckable") { - removePiercingLocation("nipples"); - } + if (piercingLevel !== 0) { // Sometimes a piercing winds up in a place that is no longer valid. Make sure players can always remove an existing piercing. + if (slave.nipples !== "fuckable") { + removePiercingLocation("nipples"); + } - if (slave.vagina !== -1 || slave.dick !== 0) { - removePiercingLocation("clit"); - if (slave.vagina !== -1) { + if (slave.vagina === -1) { removePiercingLocation("vagina"); } - } - if (slave.dick === 0) { - removePiercingLocation("dick"); + if (slave.dick === 0) { + removePiercingLocation("dick"); + if (slave.vagina === -1) { + removePiercingLocation("clit"); + } + } } function removePiercingLocation(location) { @@ -359,7 +359,7 @@ App.UI.bodyModification = function(slave, cheat = false) { // DESCRIPTIONS App.UI.DOM.appendNewElement("h2", el, "Tattoos"); - for (const [name, place] of tattooLocations) { + for (const name of tattooLocations.keys()) { r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, name))); } if (r.length === 0) { diff --git a/src/gui/css/options.css b/src/gui/css/options.css index fc2ad5bced6c6cf2be11fc4abd4644f8c4d7a945..7ce9fb2705cc625456d3c1fb5e887d9fd6954241 100644 --- a/src/gui/css/options.css +++ b/src/gui/css/options.css @@ -20,7 +20,7 @@ div.options-group div.button-group { margin: 6px 0; } -div.options-group span.comment { +div.options-group .comment { color: gray; font-style: italic; margin-left: 10px; @@ -103,4 +103,9 @@ table.invisible { border-collapse: separate; border-spacing: 5px; margin:1em auto; -} \ No newline at end of file +} + +/* custom row */ +.options-group .custom-row { + grid-column-start: span 2; +} diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 8fabc3c368bfb78a3614dd084aa9095be640584d..f4ad29f7a0ecf6353d51a332d513d23adb284d9d 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -1,4 +1,12 @@ App.UI.OptionsGroup = (function() { + class Row { + /** + * @param {HTMLDivElement} container + * @param {boolean} doubleColumn + */ + render(container, doubleColumn) {} // jshint ignore:line + } + /** * @typedef value * @property {*} value @@ -12,13 +20,14 @@ App.UI.OptionsGroup = (function() { * @property {Function} [callback] */ - const Option = class { + class Option extends Row { /** * @param {string} description can be SC markup * @param {string} property * @param {object} [object=V] */ constructor(description, property, object = V) { + super(); this.description = description; this.property = property; this.object = object; @@ -161,14 +170,197 @@ App.UI.OptionsGroup = (function() { this.valuePairs.last().neutral = true; return this; } - }; + + /** + * @param {HTMLDivElement} container + */ + render(container) { + /* left side */ + const desc = document.createElement("div"); + desc.className = "description"; + $(desc).wiki(this.description); + container.append(desc); + + /* right side */ + const currentValue = this.object[this.property]; + let anySelected = false; + + const buttonGroup = document.createElement("div"); + buttonGroup.classList.add("button-group"); + if (this.valuePairs.length < 6) { + for (const value of this.valuePairs) { + if (value.mode === "plain") { + /* insert custom SC markup and go to next element */ + $(buttonGroup).wiki(value.value); + continue; + } + const button = document.createElement("button"); + button.append(value.name); + if (value.on) { + button.classList.add("on"); + } else if (value.off) { + button.classList.add("off"); + } else if (value.neutral) { + button.classList.add("neutral"); + } + if (value.mode === "custom") { + button.onclick = () => { + value.callback(); + if (value.value) { + Engine.play(value.value); + } else { + App.UI.reload(); + } + }; + } else { + if (value.mode === "=" && currentValue === value.value) { + button.classList.add("selected", "disabled"); + anySelected = true; + if (value.descAppend !== undefined) { + desc.append(" "); + $(desc).wiki(value.descAppend); + } + } else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) { + button.classList.add("selected"); + // disable the button if clicking it won't change the variable value + if (currentValue === value.value) { + button.classList.add("disabled"); + } + anySelected = true; + if (value.descAppend !== undefined) { + desc.append(" "); + $(desc).wiki(value.descAppend); + } + } + button.onclick = () => { + this.object[this.property] = value.value; + if (value.callback) { + value.callback(); + } + App.UI.reload(); + }; + } + buttonGroup.append(button); + } + } else { + let select = document.createElement("select"); + select.classList.add("rajs-list"); + + for (const value of this.valuePairs) { + let el = document.createElement("option"); + el.textContent = value.name; + el.value = value.value; + if (this.object[this.property] === value.value) { + el.selected = true; + } + select.appendChild(el); + } + select.onchange = () => { + const O = select.options[select.selectedIndex]; + if (isNaN(Number(O.value))) { + this.object[this.property] = O.value; + } else { + this.object[this.property] = Number(O.value); + } + App.UI.reload(); + }; + buttonGroup.append(select); + } + + if (this.textbox) { + const isNumber = typeof currentValue === "number"; + const textbox = App.UI.DOM.makeTextBox(currentValue, input => { + this.object[this.property] = input; + App.UI.reload(); + }, isNumber); + if (isNumber) { + textbox.classList.add("number"); + } + buttonGroup.append(textbox); + if (this.unit) { + buttonGroup.append(" ", this.unit); + } + } + if (this.comment) { + const comment = document.createElement("span"); + comment.classList.add("comment"); + $(comment).wiki(this.comment); + buttonGroup.append(comment); + } + container.append(buttonGroup); + + function inRange(mode, compareValue, value) { + if (mode === "<") { + return value < compareValue; + } else if (mode === "<=") { + return value <= compareValue; + } else if (mode === ">") { + return value > compareValue; + } else if (mode === ">=") { + return value >= compareValue; + } + return false; + } + } + } + + class Comment extends Row { + /** + * @param {string} comment can be SC markup + */ + constructor(comment) { + super(); + this.comment = comment; + this.long = false; + } + + /** + * @param {HTMLDivElement} container + */ + render(container) { + /* left */ + container.append(document.createElement("div")); + + /* right */ + const comment = document.createElement("div"); + comment.classList.add("comment"); + $(comment).wiki(this.comment); + container.append(comment); + } + } + + class CustomRow extends Row { + /** + * @param {HTMLElement|string} element + */ + constructor(element) { + super(); + this.element = element; + } + + /** + * @param {HTMLDivElement} container + * @param {boolean}doubleColumn + */ + render(container, doubleColumn) { + /** @type {HTMLDivElement} */ + const div = App.UI.DOM.makeElement("div", this.element, "custom-row"); + let factor = 0.7; + if (doubleColumn) { + factor *= 0.5; + } + div.style.width = `${Math.round(window.innerWidth * factor)}px`; + container.append(div); + } + } return class { constructor() { /** - * @type {Array<Option>} + * @type {Array<Row>} */ - this.options = []; + this.rows = []; + this.doubleColumn = false; } /** @@ -179,6 +371,17 @@ App.UI.OptionsGroup = (function() { return this; } + /** + * @template {Row} T + * @param {T} row + * @returns {T} + * @private + */ + _addRow(row) { + this.rows.push(row); + return row; + } + /** * @param {string} name * @param {string} property @@ -187,146 +390,43 @@ App.UI.OptionsGroup = (function() { */ addOption(name, property, object = V) { const option = new Option(name, property, object); - this.options.push(option); - return option; + return this._addRow(option); } + /** + * @param {string} comment may contain SC markup + * @returns {Comment} + */ + addComment(comment) { + const c = new Comment(comment); + return this._addRow(c); + } + + /** + * Adds a custom element taking up both rows + * + * @param {HTMLElement|string} element + * @returns {CustomRow} + */ + addCustom(element) { + return this._addRow(new CustomRow(element)); + } + + /** + * @returns {HTMLDivElement} + */ render() { const container = document.createElement("div"); container.className = "options-group"; if (this.doubleColumn) { container.classList.add("double"); } - for (/** @type {Option} */ const option of this.options) { - /* left side */ - const desc = document.createElement("div"); - desc.className = "description"; - $(desc).wiki(option.description); - container.append(desc); - - /* right side */ - const currentValue = option.object[option.property]; - let anySelected = false; - - const buttonGroup = document.createElement("div"); - buttonGroup.classList.add("button-group"); - if (option.valuePairs.length < 6) { - for (const value of option.valuePairs) { - if (value.mode === "plain") { - /* insert custom SC markup and go to next element */ - $(buttonGroup).wiki(value.value); - continue; - } - const button = document.createElement("button"); - button.append(value.name); - if (value.on) { - button.classList.add("on"); - } else if (value.off) { - button.classList.add("off"); - } else if (value.neutral) { - button.classList.add("neutral"); - } - if (value.mode === "custom") { - button.onclick = () => { - value.callback(); - if (value.value) { - Engine.play(value.value); - } else { - App.UI.reload(); - } - }; - } else { - if (value.mode === "=" && currentValue === value.value) { - button.classList.add("selected", "disabled"); - anySelected = true; - if (value.descAppend !== undefined) { - desc.append(" "); - $(desc).wiki(value.descAppend); - } - } else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) { - button.classList.add("selected"); - // disable the button if clicking it won't change the variable value - if (currentValue === value.value) { - button.classList.add("disabled"); - } - anySelected = true; - if (value.descAppend !== undefined) { - desc.append(" "); - $(desc).wiki(value.descAppend); - } - } - button.onclick = () => { - option.object[option.property] = value.value; - if (value.callback) { - value.callback(); - } - App.UI.reload(); - }; - } - buttonGroup.append(button); - } - } else { - let select = document.createElement("select"); - select.classList.add("rajs-list"); - - for (const value of option.valuePairs) { - let el = document.createElement("option"); - el.textContent = value.name; - el.value = value.value; - if (option.object[option.property] === value.value) { - el.selected = true; - } - select.appendChild(el); - } - select.onchange = () => { - const O = select.options[select.selectedIndex]; - if (isNaN(Number(O.value))) { - option.object[option.property] = O.value; - } else { - option.object[option.property] = Number(O.value); - } - App.UI.reload(); - }; - buttonGroup.append(select); - } - if (option.textbox) { - const isNumber = typeof currentValue === "number"; - const textbox = App.UI.DOM.makeTextBox(currentValue, input => { - option.object[option.property] = input; - App.UI.reload(); - }, isNumber); - if (isNumber) { - textbox.classList.add("number"); - } - buttonGroup.append(textbox); - if (option.unit) { - buttonGroup.append(" ", option.unit); - } - } - if (option.comment) { - const comment = document.createElement("span"); - comment.classList.add("comment"); - $(comment).wiki(option.comment); - buttonGroup.append(comment); - } - container.append(buttonGroup); + for (/** @type {Row} */ const row of this.rows) { + row.render(container, this.doubleColumn); } return container; - - function inRange(mode, compareValue, value) { - if (mode === "<") { - return value < compareValue; - } else if (mode === "<=") { - return value <= compareValue; - } else if (mode === ">") { - return value > compareValue; - } else if (mode === ">=") { - return value >= compareValue; - } - return false; - } } }; })(); diff --git a/src/gui/options/optionsPassage.js b/src/gui/options/optionsPassage.js index 7c215b4159d2bc819477bfe1cbb16467c2813da5..02f2dbfbe2006106f142f4b51489151709ce3bec 100644 --- a/src/gui/options/optionsPassage.js +++ b/src/gui/options/optionsPassage.js @@ -1025,7 +1025,7 @@ App.UI.artOptions = function() { .addValueList([["Revamped embedded vector art", 3], ["Non-embedded vector art", 2], ["NoX/Deepmurk's vector art", 1], ["Shokushu's rendered imagepack", 0]]); if (V.imageChoice === 1) { - options.addOption("").addComment('<span class="warning">Git compiled only, no exceptions.</span>'); + options.addComment('<span class="warning">Git compiled only, no exceptions.</span>'); options.addOption("Face artwork is", "seeFaces") .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); @@ -1039,7 +1039,7 @@ App.UI.artOptions = function() { options.addOption("Clothing erection bulges are", "showClothingErection") .addValue("Enabled", true).on().addValue("Disabled", false).off(); } else if (V.imageChoice === 0) { - options.addOption("").addComment(`You need """to""" + options.addComment(`You need """to""" <a href="https://mega.nz/#!upoAlBaZ!EbZ5wCixxZxBhMN_ireJTXt0SIPOywO2JW9XzTIPhe0">download the image pack</a> """and""" put the 'renders' folder into the resources/ folder where this html file is.` ); @@ -1047,7 +1047,7 @@ App.UI.artOptions = function() { options.addOption("Slave summary fetish images are", "seeMainFetishes") .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); } else if (V.imageChoice === 3) { - options.addOption("").addComment('<span class="warning">Git compiled only, no exceptions.</span>'); + options.addComment('<span class="warning">Git compiled only, no exceptions.</span>'); options.addOption("Clothing erection bulges are", "showClothingErection") .addValue("Enabled", true).on().addValue("Disabled", false).off(); diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index cd9a93af352f110a869c0bda90ec63b4329e989b..2be10f42af25719beac240af7d229d475669a3c6 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1721,13 +1721,13 @@ globalThis.DefaultRules = (function() { } } - if (rule.weight !== null) { + if (rule.weight !== null || (rule.diet === "attractive") ) { weightRule(slave, rule); } - if (rule.weight === null && rule.muscles !== null) { + if (rule.weight === null && rule.diet !== "attractive" && rule.muscles !== null) { muscleRule(slave, rule); } - if (rule.weight === null && rule.muscles === null && (rule.diet !== undefined && rule.diet !== null)) { + if (rule.weight === null && rule.muscles === null && (rule.diet !== undefined && rule.diet !== null && rule.diet !== "attractive")) { dietRule(slave, rule); } @@ -2515,6 +2515,7 @@ globalThis.DefaultRules = (function() { if (rule.clitPiercing === 3) { cashX(forceNeg(V.SPcost), "slaveMod", slave); + slave.clitSetting = "all"; } else { cashX(forceNeg(V.modCost), "slaveMod", slave); } diff --git a/src/js/vignettes.js b/src/js/vignettes.js index 086cbe7927beaa457f5e0f7190fd4ed416ba3679..3254aa300aa9131da33d769abaca8470b5daa858 100644 --- a/src/js/vignettes.js +++ b/src/js/vignettes.js @@ -4195,7 +4195,7 @@ globalThis.GetVignette = function(slave) { effect: 1, }); vignettes.push({ - text: `${he} was ordered to clean all the exterior windows around your estate using only ${his} tits. The people passing by seemed to appreciate the show,`, + text: `${he} was ordered to clean all the exterior windows around your estate using only ${his} ${slave.boobs >= 300 ? "tits" : "bare flat chest"}. The people passing by seemed to appreciate the show,`, type: "rep", effect: 1, }); diff --git a/src/npc/generate/newChildIntro.js b/src/npc/generate/newChildIntro.js index c29df84a00abaf09b364def2a6f5a2a5b319926a..b9b76aa3dd198d5f1b141b49075c72679d86bf9d 100644 --- a/src/npc/generate/newChildIntro.js +++ b/src/npc/generate/newChildIntro.js @@ -745,7 +745,7 @@ App.UI.newChildIntro = function(slave) { } if (V.arcologies[0].FSHedonisticDecadence >= 50) { if (slave.weight > 50) { - r.push(`${He} noticed all fat slaves lazing about your penthouse; ${he} pats ${his} own soft belly, <span class="mediumaquamarine">feeling right at home.</span>`); + r.push(`${He} noticed all the fat slaves lazing about your penthouse; ${he} pats ${his} own soft belly, <span class="mediumaquamarine">feeling right at home.</span>`); slave.trust += 2; } } diff --git a/src/uncategorized/officeDescription.tw b/src/uncategorized/officeDescription.tw index ec20b11748e5eae5de8221a82590d1ce2835f3c1..9f5dd957d7bc8723bd29cc7ca79050aeb9872b8f 100644 --- a/src/uncategorized/officeDescription.tw +++ b/src/uncategorized/officeDescription.tw @@ -129,7 +129,7 @@ <<case "eugenics">> _heA's depicted striking a sexy pose; _heA's so stunning you can't look away. <<case "physical idealist">> - _heA's depicted flexing _hisA <<if $arcologies[0].FSPhysicalIdealistStrongFat == 1>>fat veiled <</if>>tremendous musculature intimidatingly. + _heA's depicted flexing _hisA tremendous<<if $arcologies[0].FSPhysicalIdealistStrongFat == 1>>, fat-veiled<</if>> musculature intimidatingly. <<case "hedonistic decadence">> _heA's depicted deep throating a banana while groping _hisA large, soft belly. <<case "gender radicalist">> diff --git a/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw b/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw index d1b7b8b213b1aad74543746c3e9ae5bde2ab522b..545c7062d0c29fedfaec04e40fd2251496104592 100644 --- a/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw +++ b/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw @@ -70,7 +70,7 @@ This call is coming from a public kiosk, which is usually an indication that the <br><br> <span id="result"> <<if $cash >= _contractCost>> - [[Enslave the pair|Bulk Slave Intro][$market = {newSlaves: _newSlaves}, $market.newSlaves.forEach((s) => cashX(forceNeg(_contractCost/$market.newSlaves.length), "slaveTransfer", s))]] + [[Enslave the pair|Bulk Slave Intro][$market.newSlaves = _newSlaves, $market.newSlaves.forEach((s) => cashX(forceNeg(_contractCost/$market.newSlaves.length), "slaveTransfer", s))]] <<else>> //You lack the necessary funds to enslave them.// <</if>> diff --git a/src/uncategorized/seCoursing.tw b/src/uncategorized/seCoursing.tw index 9ac986fd643b00e9c7b1c5cfd92c74cd325091b9..2f5b71138c73727fbb1e5e527cf73e59655b1386 100644 --- a/src/uncategorized/seCoursing.tw +++ b/src/uncategorized/seCoursing.tw @@ -419,7 +419,7 @@ You lead your lurcher _activeLurcher.slaveName out on a leash, naked just like t <</if>> <<if $activeSlave.boobs >= 2000>> _He2 has absurd tits that will destroy any chance _he2 has of getting away. - <<set $hareSpeed -= 1>> + <<set $hareSpeed -= 2>> <<elseif $activeSlave.boobs >= 800>> _He2 has huge boobs that will make it painful for _him2 to run hard. <<set $hareSpeed -= 1>> diff --git a/themes/light/options.css b/themes/light/options.css index 88e25e7e362d0ee0669b6fb4c471dcd7a7e7c8e7..419ff6ed92790d70bcd8ce5fddc1a4419d519621 100644 --- a/themes/light/options.css +++ b/themes/light/options.css @@ -1,3 +1,3 @@ -div.options-group span.comment { +div.options-group .comment { color: #575757; }