diff --git a/src/interaction/useSlave/useSlave.js b/src/interaction/useSlave/useSlave.js index c0ef1e02e9476098c7a29fe09a4872bd41a69ad5..116c86e6f40eedc74ef7412323f19e9c340e2041 100644 --- a/src/interaction/useSlave/useSlave.js +++ b/src/interaction/useSlave/useSlave.js @@ -7,6 +7,7 @@ App.UI.SlaveInteract.useSlave = function(slave) { // Declarations const playerState = new App.UI.SlaveInteract.CharacterState(); const slaveState = new App.UI.SlaveInteract.CharacterState(); + setUpClothing(playerState, slaveState); const PC = V.PC; const tempSlave = new App.UI.SlaveInteract.Clone(slave) @@ -154,4 +155,52 @@ App.UI.SlaveInteract.useSlave = function(slave) { return App.UI.DOM.generateLinksStrip(links); } + + // Helper functions + + // Adjust characters' clothing state before scene is shown + function setUpClothing(playerState, slaveState) { + // Assume the PC is fully clothed. Remove the bra if boobs are small/nonexistent. + if (V.PC.boobs < 300) { + playerState.clothing.bra = false; + } + // If slave boobs are small/nonexistent, default to no bra. + if (slave.boobs < 300) { + slaveState.clothing.bra = false; + } + // Adjust slave clothing state based on their outfit. + const nakedOutfits = ["no clothing", "body oil"]; + const pantyOutfits = ["a skimpy loincloth", "a thong", "panties", "striped panties"]; + const braOutfits = ["a bra", "a sports bra", "a striped bra"]; + const pantyBraOutfits = ["a slutty outfit", "attractive lingerie", "attractive lingerie for a pregnant woman", "kitty lingerie", "panties and pasties", "striped underwear"]; + const noUnderwearOutfits = ["a burkini", "a comfortable bodysuit", "a tight Imperial bodysuit", "a cybersuit", "a fallen nuns habit", "a leotard", "a latex catsuit", "a monokini", "a one-piece swimsuit", "a scalemail bikini", "a slutty klan robe", "a slutty maid outfit", "a slutty nurse outfit", "a slutty pony outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a string bikini", "a succubus outfit", "a toga", "an apron", "chains", "clubslut netting", "harem gauze", "overalls", "restrictive latex", "shibari ropes", "slutty business attire", "slutty jewelry", "uncomfortable straps"]; // ex. swimsuits, slutty jewelry, bodysuits + const noBottomOutfits = ["a button-up shirt", "a sweater", "a t-shirt", "a tank-top", "a tube top", "an oversized t-shirt"]; + const noTopOutfits = ["boyshorts", "cutoffs", "jeans", "leather pants", "sport shorts"]; + if (nakedOutfits.includes(slave.clothes)) { + slaveState.clothing.top.isOff = true; + slaveState.clothing.bottom.isOff = true; + slaveState.clothing.bra = false; + slaveState.clothing.underwear = false; + } else if (pantyOutfits.includes(slave.clothes)) { + slaveState.clothing.top.isOff = true; + slaveState.clothing.bottom.isOff = true; + slaveState.clothing.bra = false; + } else if (braOutfits.includes(slave.clothes)) { + slaveState.clothing.top.isOff = true; + slaveState.clothing.bottom.isOff = true; + slaveState.clothing.underwear = false; + } else if (pantyBraOutfits.includes(slave.clothes)) { + slaveState.clothing.top.isOff = true; + slaveState.clothing.bottom.isOff = true; + } else if (noUnderwearOutfits.includes(slave.clothes)) { + slaveState.clothing.bra = false; + slaveState.clothing.underwear = false; + } else if (noBottomOutfits.includes(slave.clothes)) { + slaveState.clothing.bottom.isOff = true; + slaveState.clothing.underwear = false; + } else if (noTopOutfits.includes(slave.clothes)) { + slaveState.clothing.top.isOff = true; + slaveState.clothing.bra = false; + } + } }; diff --git a/src/interaction/useSlave/useSlaveOptions.js b/src/interaction/useSlave/useSlaveOptions.js index 6d8f3eafb5c92765faa82c55083a4c351f666640..005a7cc37a92e0a212f2de9a015b8bf3b02cc33a 100644 --- a/src/interaction/useSlave/useSlaveOptions.js +++ b/src/interaction/useSlave/useSlaveOptions.js @@ -186,7 +186,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Cum in ${his} pussy`, desc: contextualText.cumInPussy(slave), tooltip: `Cum deep inside ${him}. Fill ${him} up. You know it'll feel amazing.`, - prereq: () => playerState.lust - playerState.previousOrgasm >= 25 && + prereq: () => + playerState.lust - playerState.previousOrgasm >= 25 && V.PC.dick !== 0 && playerState.action === Action.PENETRATING && slaveState.action === Action.VAGINAL, @@ -207,7 +208,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Cum in ${his} ass`, desc: contextualText.cumInAnus(slave), tooltip: `Make a mess of ${his} ass. Show ${him} ${his} place.`, - prereq: () => playerState.lust - playerState.previousOrgasm >= 25 && + prereq: () => + playerState.lust - playerState.previousOrgasm >= 25 && V.PC.dick !== 0 && playerState.action === Action.PENETRATING && slaveState.action === Action.ANAL, @@ -228,7 +230,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Make ${him} cum`, desc: contextualText.makeSlaveCum(slave), tooltip: `${He}'s been a good slave, and deserves a reward.`, - prereq: () => slaveState.lust - slaveState.previousOrgasm >= 25 && + prereq: () => + slaveState.lust - slaveState.previousOrgasm >= 25 && (playerState.action === Action.ORAL && slaveState.action === Action.RECEIVING) || (playerState.action === Action.FINGERING && @@ -294,7 +297,10 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Have ${him} go down on you`, desc: faceText.slaveGivesOral(slave), tooltip: `Have ${him} give you oral.`, - prereq: () => (slave.mouthAccessory === none || slave.mouthAccessory === "ring gag") && + prereq: () => + (slave.mouthAccessory === none || slave.mouthAccessory === "ring gag") && + playerState.bottomFree && + !playerState.clothing.underwear && !playerState.isKneeling && slaveState.action !== Action.ORAL, effect: () => { @@ -314,7 +320,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Go down on ${him}`, desc: faceText.playerGivesOral(slave), tooltip: `Give ${him} oral.`, - prereq: () => slaveState.clothing.bottom.isOff && !playerState.isKneeling && !slaveState.isKneeling, + prereq: () => + slaveState.clothing.bottom.isOff && + !slave.chastityVagina && + !slave.chastityPenis && + !slaveState.clothing.underwear && + !playerState.isKneeling && + !slaveState.isKneeling, effect: () => { playerState.position = Position.KNEELING; @@ -337,7 +349,7 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Grope ${his} chest`, desc: chestText.grope(slave), tooltip: slave.boobs >= 300 ? `Play with ${his} tits a bit.` : `Stroke ${his} chest a bit.`, - prereq: () => true, + prereq: () => slaveState.topFree, effect: () => { playerState.lust += 2; slaveState.lust += slave.fetish === Fetish.BOOBS ? 7 : 4; @@ -351,7 +363,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Lick ${his} ${slave.boobs >= 300 ? `tits` : `chest`}`, desc: chestText.lick(slave), tooltip: slave.boobs >= 300 ? `Give ${his} boobs a taste.` : `Run your tongue along ${his} chest.`, - prereq: () => true, + prereq: () => slaveState.topFree && + !slaveState.clothing.bra, effect: () => { playerState.lust += 2; slaveState.lust += slave.fetish === Fetish.BOOBS ? 8 : 5; @@ -365,7 +378,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Suck on ${his} nipples`, desc: chestText.suck(slave), tooltip: `See if you can't get any milk.`, - prereq: () => true, + prereq: () => slaveState.topFree && + !slaveState.clothing.bra, effect: () => { playerState.lust += 2; slaveState.lust += slave.fetish === Fetish.BOOBS ? 9 : 5; @@ -379,7 +393,8 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Bite ${his} nipples`, desc: chestText.bite(slave), tooltip: `Give them a little nibble.`, - prereq: () => true, + prereq: () => slaveState.topFree && + !slaveState.clothing.bra, effect: () => { playerState.lust += 2; slaveState.lust += slave.fetish === Fetish.BOOBS ? 8 : 5; @@ -398,7 +413,10 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Grope ${his} pussy`, desc: crotchText.gropePussy(slave), tooltip: `Fondle and play with ${his} crotch a bit.`, - prereq: () => slave.vagina > -1, + prereq: () => + slave.vagina > -1 && + !slave.chastityVagina && + slaveState.bottomFree, effect: () => { playerState.lust++; slaveState.lust++; @@ -412,7 +430,10 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Grope ${his} dick`, desc: crotchText.gropeDick(slave), tooltip: `Rub ${his} cock a little.`, - prereq: () => slave.dick > 0, + prereq: () => + slave.dick > 0 && + !slave.chastityPenis && + slaveState.bottomFree, effect: () => { playerState.lust++; slaveState.lust += 2; @@ -426,7 +447,7 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Grope ${his} ass`, desc: crotchText.gropeAss(slave), tooltip: `Grab ${his} ass and give it a good fondle.`, - prereq: () => true, + prereq: () => slaveState.bottomFree, effect: () => { playerState.lust++; slaveState.lust++; @@ -440,7 +461,11 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Finger ${his} pussy`, desc: crotchText.fingerPussy(slave), tooltip: `Play with ${his} clit a little, maybe slide a finger in there. Go on, you know you want to.`, - prereq: () => slave.vagina > -1 && (slaveState.bottomFree || clothes.includes("dress")) && !slave.chastityVagina, + prereq: () => + slave.vagina > -1 && + (slaveState.bottomFree || clothes.includes("dress")) && + !slaveState.clothing.underwear && + !slave.chastityVagina, effect: () => { playerState.lust += 2; slaveState.lust += 5; @@ -454,7 +479,10 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Finger ${his} asshole`, desc: crotchText.fingerAnus(slave), tooltip: `Play with ${his} backdoor a little. Go on, you know you want to.`, - prereq: () => slaveState.bottomFree || clothes.includes("dress") && !slave.chastityAnus, + prereq: () => + (slaveState.bottomFree || clothes.includes("dress")) && + !slaveState.clothing.underwear && + !slave.chastityAnus, effect: () => { playerState.lust += 2; slaveState.lust += slave.fetish === Fetish.BUTTSLUT ? 7 : 4; @@ -468,10 +496,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Take ${his} virginity`, desc: crotchText.takeVirginity(slave), tooltip: `Make ${him} remember ${his} first time being used as a proper sex slave.`, - prereq: () => slave.vagina === 0 && + prereq: () => + slave.vagina === 0 && slaveState.bottomFree && !slaveState.clothing.underwear && !slave.chastityVagina && + playerState.bottomFree && + !playerState.clothing.underwear && slaveState.action !== Action.VAGINAL && playerState.lust - playerState.previousOrgasm > 5, effect: () => { @@ -500,10 +531,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Fuck ${his} pussy`, desc: crotchText.fuckPussy(slave), tooltip: `Push your ${player.dick ? `dick` : `strapon`} into ${his} pussy.`, - prereq: () => slave.vagina > 0 && + prereq: () => + slave.vagina > 0 && slaveState.bottomFree && !slaveState.clothing.underwear && !slave.chastityVagina && + playerState.bottomFree && + !playerState.clothing.underwear && slaveState.action !== Action.VAGINAL && playerState.lust - playerState.previousOrgasm > 5, effect: () => { @@ -521,10 +555,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Take ${his} anal virginity`, desc: crotchText.takeAnalVirginity(slave), tooltip: `Use ${his} butt for the first of surely many times.`, - prereq: () => slave.anus === 0 && + prereq: () => + slave.anus === 0 && slaveState.bottomFree && !slaveState.clothing.underwear && !slave.chastityAnus && + playerState.bottomFree && + !playerState.clothing.underwear && slaveState.action !== Action.ANAL && playerState.lust - playerState.previousOrgasm > 5, effect: () => { @@ -552,10 +589,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Fuck ${his} asshole`, desc: crotchText.fuckAnus(slave), tooltip: `Push your ${player.dick ? `dick` : `strapon`} into ${his} asshole.`, - prereq: () => slave.anus > 0 && + prereq: () => + slave.anus > 0 && slaveState.bottomFree && !slaveState.clothing.underwear && !slave.chastityAnus && + playerState.bottomFree && + !playerState.clothing.underwear && slaveState.action !== Action.ANAL && playerState.lust - playerState.previousOrgasm > 5, effect: () => { @@ -573,8 +613,13 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Start a sixty-nine`, desc: crotchText.sixtyNine(slave), tooltip: `Show each other some mutual affection.`, - prereq: () => slaveState.bottomFree && + prereq: () => + slaveState.bottomFree && playerState.bottomFree && + !slaveState.clothing.underwear && + !playerState.clothing.underwear && + !slave.chastityVagina && + !slave.chastityPenis && (slaveState.action !== Action.ORAL || playerState.action !== Action.ORAL), effect: () => { @@ -608,11 +653,20 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Have ${him} perform a striptease for you`, desc: generalText.striptease(slave), tooltip: `Make ${him} strip for you.`, - prereq: () => !slaveState.isKneeling && !slaveState.isLaying && clothes !== "no clothing", + prereq: () => + !slaveState.isKneeling && + !slaveState.isLaying && + clothes !== "no clothing", effect: () => { - clothes = "no clothing"; + slave.clothes = "no clothing"; + slaveState.clothing.top.isOff = true; + slaveState.clothing.bottom.isOff = true; + slaveState.clothing.bra = false; + slaveState.clothing.underwear = false; playerState.lust += 5; slaveState.lust += 6; + + refreshArt(); }, reaction: this.reactionText.striptease(slave), }, @@ -773,7 +827,10 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla link: `Take off ${his} ${slave.clothes.replace('a ', '')}`, desc: clothingText.removeClothing(slave), tooltip: `Have ${him} take off ${his} outermost layer.`, - prereq: () => clothes !== "no clothing" && !slaveState.clothing.top.isOff && !slaveState.clothing.bottom.isOff, + prereq: () => + clothes !== "no clothing" && + !slaveState.clothing.top.isOff && + !slaveState.clothing.bottom.isOff, effect: () => { slave.clothes = "no clothing"; slaveState.clothing.top.isOff = true; @@ -793,6 +850,9 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla prereq: () => !clothes.includes("dress") && !slaveState.clothing.top.isOff, effect: () => { slaveState.clothing.top.isOff = true; + if (slaveState.clothing.bottom.isOff) { + slave.clothes = "no clothing"; + } playerState.lust++; slaveState.lust++; @@ -808,6 +868,9 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla prereq: () => !clothes.includes("dress") && !slaveState.clothing.bottom.isOff, effect: () => { slaveState.clothing.bottom.isOff = true; + if (slaveState.clothing.top.isOff) { + slave.clothes = "no clothing"; + } playerState.lust++; slaveState.lust++; @@ -823,6 +886,9 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla prereq: () => slaveState.topFree && slaveState.clothing.bra, effect: () => { slaveState.clothing.bra = false; + if (!slaveState.clothing.underwear) { + slave.clothes = "no clothing"; + } playerState.lust++; slaveState.lust++; @@ -838,6 +904,9 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla prereq: () => slaveState.bottomFree && slaveState.clothing.underwear, effect: () => { slaveState.clothing.underwear = false; + if (!slaveState.clothing.bra) { + slave.clothes = "no clothing"; + } playerState.lust++; slaveState.lust++; @@ -911,9 +980,9 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla desc: clothingText.removeChastityAnal(slave), tooltip: `${He} won't be needing it.`, prereq: () => (clothes === "no clothing" || clothes.includes("dress")) && - slave.chastityVagina === 1, + slave.chastityAnus === 1, effect: () => { - slave.chastityVagina = 0; + slave.chastityAnus = 0; refreshArt(); }, @@ -958,6 +1027,19 @@ App.UI.SlaveInteract.useSlave.options = function(player, slave, playerState, sla }, reaction: this.reactionText.removePlayerBottom(slave), }, + { + link: `Take off your bra`, + desc: clothingText.removePlayerBra(slave), + tooltip: `Let them free!`, + prereq: () => playerState.clothing.bra && playerState.clothing.top.isOff, + effect: () => { + playerState.clothing.bra = false; + + playerState.lust++; + slaveState.lust++; + }, + reaction: this.reactionText.removePlayerBra(slave), + }, { link: `Take off your underwear`, desc: clothingText.removePlayerUnderwear(slave), diff --git a/src/interaction/useSlave/useSlaveText.js b/src/interaction/useSlave/useSlaveText.js index 4a517bb63b365225ab93cf376dc062a22db047d5..40354b9fab98fee38ddb955f651fa51dbcf81065 100644 --- a/src/interaction/useSlave/useSlaveText.js +++ b/src/interaction/useSlave/useSlaveText.js @@ -723,7 +723,7 @@ App.UI.SlaveInteract.useSlave.clothingText = { const {his} = getPronouns(slave); if (slave.devotion > 50) { - return `You pull ${slave.slaveName}'s bottoms down, showing off ${his} underwear and legs.`; + return `You pull ${slave.slaveName}'s bottoms down, showing off ${his} legs.`; } else if (slave.devotion > 20) { return `Remove bottom test 2`; } else if (slave.devotion > -20) { @@ -883,6 +883,21 @@ App.UI.SlaveInteract.useSlave.clothingText = { } }, + /** @param {FC.SlaveState} slave */ + removePlayerBra(slave) { + const {He, him, his } = getPronouns(slave); + + if (slave.devotion > 50) { + return `You unhook your bra, revealing your boobs. ${slave.slaveName}'s eyes widen at the sight.`; + } else if (slave.devotion > 20) { + return `Remove player underwear test 2`; + } else if (slave.devotion > -20) { + return `Remove player underwear test 3`; + } else { + return `Remove player underwear test 4`; + } + }, + /** @param {FC.SlaveState} slave */ removePlayerUnderwear(slave) { const {He, his} = getPronouns(slave); @@ -1727,6 +1742,20 @@ App.UI.SlaveInteract.useSlave.reactionText = { } }, /** @param {FC.SlaveState} slave */ + removePlayerBra(slave) { + // const {him, his} = getPronouns(slave); + + if (slave.devotion > 50) { + return Spoken(slave, `"${getEnunciation(slave).title}... Your breasts look... so supple..."`); + } else if (slave.devotion > 20) { + return `removePlayerUnderwear reaction test 2`; + } else if (slave.devotion > -20) { + return `removePlayerUnderwear reaction test 3`; + } else { + return `removePlayerUnderwear reaction test 4`; + } + }, + /** @param {FC.SlaveState} slave */ removePlayerUnderwear(slave) { // const {him, his} = getPronouns(slave);