diff --git a/src/events/RESS/review/hormoneDysfunction.js b/src/events/RESS/review/hormoneDysfunction.js index e7564e4f031fd4654222f39c797fd127d3d056c5..529401c84155f8a1a79d4f16c597f162f1a6e091 100644 --- a/src/events/RESS/review/hormoneDysfunction.js +++ b/src/events/RESS/review/hormoneDysfunction.js @@ -79,7 +79,7 @@ App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Eve } r.push(`and the same limp dick as before. <span class="devotion dec">It's frustrating for ${him}.</span>`); eventSlave.devotion -= 2; - if (eventSlave.clitSetting !== eventSlave.fetish) { + if (!smartPiercingReinforcesFetish(eventSlave)) { r.push(`But, ${he} slowly <span class="fetish gain">accepts ${his} new role as a submissive little sex toy.</span>`); eventSlave.fetishStrength = 65; eventSlave.fetishKnown = 1; @@ -107,7 +107,7 @@ App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Eve r.push(`${He} doesn't climax to anal then, or the next time you assfuck ${him}, or the time after that; but some time later a long buttsex session ends when ${he} gives a little shake and a whimper and dribbles a pathetic squirt of cum from ${his} still-limp dick. By the end of the week <span class="mediumaquamarine">${he}'s smiling trustingly</span> and offering you ${his} butt every chance ${he} gets.`); r.push(VCheck.Anal(eventSlave, 10)); eventSlave.trust += 4; - if (eventSlave.clitSetting !== eventSlave.fetish) { + if (!smartPiercingReinforcesFetish(eventSlave)) { r.push(`<span class="fetish gain">${He}'s become a confirmed anal addict.</span>`); eventSlave.fetishStrength = 65; eventSlave.fetishKnown = 1; diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js index 4a827f25451566ce855d65d9585c6c0bcab898b2..785b4dfd1343da09b8116125164225e7422feac0 100644 --- a/src/futureSocieties/fsPassage.js +++ b/src/futureSocieties/fsPassage.js @@ -675,7 +675,7 @@ App.UI.fsPassage = function() { } ) ); - r.push(`gender traditionalism, including a societal preference for feminine slaves ${(V.seePreg !== 0) ? ` and support for slave pregnancy` : ``}.`); + r.push(`is a societal preference for feminine slaves ${(V.seePreg !== 0) ? ` and support for slave pregnancy` : ``}.`); r.push(evaluation("FSGenderFundamentalist")); } else { /* <span class="note"><span style="font-weight:Bold">Gender traditionalism:</span> a societal preference for feminine slaves diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index 1c800a4173aeecc749d89c3620ba177f3663e433..71768aea972994ce9096bed1b6bdc022af9f0011 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -2772,6 +2772,7 @@ globalThis.DefaultRules = function(slave) { fetish = either("vanilla", "oral", "anal", "boobs", "submissive", "dom", "humiliation", "pregnancy", "masochist", "sadist"); } // check if already full fetish + // FIXME - this is wrong for some cases; see smartPiercingReinforcesFetish if (slave.fetish !== fetish || slave.fetishStrength < 100) { // Set the smart thingy to the correct fetish if (slave.clitSetting !== fetish) { diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js index aa2cdc3d0e5fa5a10ef804715e757f86c7c9b958..ff6decf3ba44f75de203e9a9d7d1a6cfa7848fd7 100644 --- a/src/js/slaveSummaryHelpers.js +++ b/src/js/slaveSummaryHelpers.js @@ -437,9 +437,7 @@ App.UI.SlaveSummaryImpl = function() { return value + spData.setting.all; } else if ((slave.energy > 5) && (slave.clitSetting === "none")) { return value + spData.setting.none; - } else if (((slave.fetish !== Fetish.NONE) && (slave.clitSetting === "vanilla"))) { - return value + spData.setting.vanilla; - } else if (slave.fetishStrength <= 95 || slave.fetish !== slave.clitSetting) { + } else if (slave.fetishStrength <= 95 || !smartPiercingReinforcesFetish(slave)) { const s = value + spData.setting[slave.clitSetting]; if (s) { return s; diff --git a/src/js/utilsPC.js b/src/js/utilsPC.js index 1e4a468784deff28bd6dc1392c872d4c19fc24ab..f97828b82069982ca7364e4aad0646f24b4d0cc1 100644 --- a/src/js/utilsPC.js +++ b/src/js/utilsPC.js @@ -1107,7 +1107,7 @@ globalThis.PCPenetrationWarning = function(holes = "vaginal first", escape = fal result += `WARNING# This option ${action} take your ${virgins[0]} virginity.`; } return result; -} +}; /** Returns "true" if the player can be receptive to penetration, even if the sexualOpenness policy is not adopted. This function should only be used to offer options to the player, it does not imply true willingness. * @param {any} [penetrator = null] If a slave is passed as an argument, it also takes into account if slave.toyHole is "dick". @@ -1134,7 +1134,7 @@ globalThis.isPlayerReceptive = function(penetrator = null) { return true; // forcedFertDrugs influence the behavior of the player, who unconsciously wants to be fertilized } return false; -} +}; /** Determine if the player favors masturbation over sex. * Currently not used much, but will be used more with the addition of new .pregMoods diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js index 279c3d5d888de1dc804d70b315d065a2b4a787e9..f7daea8b6724d96b517516c9abdf2c3717fc21c6 100644 --- a/src/js/utilsSlave.js +++ b/src/js/utilsSlave.js @@ -1583,7 +1583,7 @@ globalThis.fetishChangeChance = function(slave) { let fetish = (slave.fetishStrength / 4); let sex = 0; - if (slave.clitSetting !== slave.fetish && !('fetishChanged' in slave && slave.fetishChanged === 1)) { + if (!smartPiercingReinforcesFetish(slave) && !('fetishChanged' in slave && slave.fetishChanged === 1)) { // fetish should be more uncertain leading towards puberty and then steadily become more set in stone afterwards if (slave.balls) { if (V.potencyAge >= slave.actualAge) { @@ -3414,3 +3414,22 @@ globalThis.ChattelReligionistClothingPass = function(outfit) { return fsLovesClothes; } }; + +/** Checks whether a slave's smart piercing is reinforcing a particular fetish + * You must use this function rather than comparing directly because some of the enumerated values don't match (i.e. "anal" reinforces "buttslut") + * @param {App.Entity.SlaveState} slave + * @param {FC.Fetish} [fetish] if unspecified, uses the slave's current fetish + */ +globalThis.smartPiercingReinforcesFetish = function(slave, fetish = slave.fetish) { + switch (slave.clitSetting) { + case SmartPiercingSetting.VANILLA: + return fetish === Fetish.NONE; + case SmartPiercingSetting.ANAL: + return fetish === Fetish.BUTTSLUT; + case SmartPiercingSetting.ORAL: + return fetish === Fetish.CUMSLUT; + case SmartPiercingSetting.NONE: + return false; // SP "none" is "no sex", not fetish "none", which is SP "vanilla" + } + return slave.clitSetting === fetish; // all the other ones are supposed to match +}; diff --git a/src/npc/interaction/fAbuse.js b/src/npc/interaction/fAbuse.js index 1996fea984aa0cfdfdd3dc1f54252aef391f10ee..291d8edb19332bf3eeea406a318f0c7ee74009b2 100644 --- a/src/npc/interaction/fAbuse.js +++ b/src/npc/interaction/fAbuse.js @@ -754,7 +754,7 @@ App.Interact.fAbuse = function(slave) { } } if (random(1, 100) > (50+slave.devotion+slave.trust) && slave.assignment !== Job.BODYGUARD) { - if (slave.fetish !== Fetish.MINDBROKEN && slave.fetishKnown === 0 && slave.clitSetting !== slave.fetish) { + if (slave.fetish !== Fetish.MINDBROKEN && slave.fetishKnown === 0 && !smartPiercingReinforcesFetish(slave)) { r.push(`${His} acceptance of your abuse has twisted ${his}`); if (random(1, 2) === 1 && slave.fetish !== "submissive") { r.push(`<span class="lightcoral">sexuality towards submissiveness.</span>`);