diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts index 8a570c30a6217226617d1415c0615415f8522b1b..d51a3cd533dd8b4c8341f8dd7b9147e65839013a 100644 --- a/devTools/FC.d.ts +++ b/devTools/FC.d.ts @@ -130,6 +130,8 @@ declare namespace App { speechRules: string; clothes: string; collar: string; + faceAccessory: string; + mouthAccessory: string; shoes: string; armAccessory: string; legAccessory: string; diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js index 78fc7a72990346a34adb7d8658cfb053affe6301..c8f2cbdd88d525756c4cbd1d1f20f4aa049e4fdf 100644 --- a/js/003-data/miscData.js +++ b/js/003-data/miscData.js @@ -2255,6 +2255,12 @@ App.Data.misc = { fs: "FSGenderFundamentalist", rs: "clothesBoughtBunny" }, + { + name: "Neck tie", + value: "neck tie", + fs: "FSPaternalist", + rs: "clothesBoughtConservative" + }, { name: "Ancient Egyptian", value: "ancient Egyptian", @@ -2269,12 +2275,20 @@ App.Data.misc = { {name: "Uncomfortable leather", value: "uncomfortable leather"}, {name: "Pregnancy biometrics", value: "preg biometrics", rs: "seePreg"}, {name: "Shock punishment", value: "shock punishment"}, - {name: "Dildo gag", value: "dildo gag"}, - {name: "Massive dildo gag", value: "massive dildo gag", rs: "buyGag"}, + {name: "Neck corset", value: "neck corset"}, + ], + + faceAccessory: [ + {name: "Porcelain mask", value: "porcelain mask"}, + {name: "Cat ears", value: "cat ears"}, + ], + + mouthAccessory: [ {name: "Ball gag", value: "ball gag"}, {name: "Bit gag", value: "bit gag"}, - {name: "Neck corset", value: "neck corset"}, - {name: "Porcelain mask", value: "porcelain mask"} + {name: "Ring gag", value: "ring gag"}, + {name: "Massive dildo gag", value: "massive dildo gag"}, + {name: "Dildo gag", value: "dildo gag"}, ], shoes: [ diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js index abcd4340cb7e5f6973b38c2586bd7858e8324e67..c34be62132316d165b454cf78085196deb76ff81 100644 --- a/js/003-data/slaveSummaryData.js +++ b/js/003-data/slaveSummaryData.js @@ -408,18 +408,14 @@ App.Data.SlaveSummary = { accessory: { collar: { "ancient Egyptian": "Wesekh.", - "ball gag": "Ball gag.", "bell collar": "Bell collar.", - "bit gag": "Bit gag.", "bowtie": "Bowtie collar.", + "neck tie": "Neck tie.", "cruel retirement counter": "Cruel counter collar.", - "dildo gag": "Dildo gag.", "heavy gold": "Gold collar.", "leather with cowbell": "Cowbell collar.", - "massive dildo gag": "Throat-bulging dildo gag.", "neck corset": "Neck corset.", "nice retirement counter": "Nice counter collar.", - "porcelain mask": "Porcelain mask.", "preg biometrics": "Pregnancy biometrics collar.", "pretty jewelry": "Pretty collar.", "satin choker": "Satin choker.", @@ -429,6 +425,17 @@ App.Data.SlaveSummary = { "tight steel": "Steel collar.", "uncomfortable leather": "Leather collar.", }, + faceAccessory: { + "porcelain mask": "Porcelain mask.", + "cat ears": "Cat ears.", + }, + mouthAccessory: { + "bit gag": "Bit gag.", + "dildo gag": "Dildo gag.", + "ring gag": "Ring gag.", + "massive dildo gag": "Throat-bulging dildo gag.", + "ball gag": "Ball gag.", + }, belly: { "a corset": "Corset.", "a huge empathy belly": "Huge fake belly.", diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index 39fc114d8b0ef06aec02252cb5e806763f309465..abd14f0b624e22222cdbf216300d68e159629f5c 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -2898,22 +2898,31 @@ may accept strings, use at own risk "uncomfortable leather" "tight steel" "shock punishment" -"dildo gag" "heavy gold" "pretty jewelry" "nice retirement counter" "bell collar" "leather with cowbell" "bowtie" +"neck tie" "neck corset" "stylish leather" "satin choker" "preg biometrics" -"massive dildo gag" "silk ribbon" + +faceAccessory: +"none" +"porcelain mask" +"cat ears" + +mouth: +"none" "ball gag" "bit gag" -"porcelain mask" +"ring gag" +"massive dildo gag" +"dildo gag" shoes: diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index ab842c9c0b06812875be75bd0af263ccf8d04937..47d89e44a3cb61d4b3aa34128392f25624642a6f 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -1337,7 +1337,7 @@ App.Art.vectorArtElement = (function() { } /* head addons */ - if (slave.collar === "porcelain mask") { + if (slave.faceAccessory === "porcelain mask") { T.glassesColor = slave.glassesColor || "#FFFFFF"; /* use custom color or white */ } else { T.glassesColor = slave.glassesColor || "#010101"; /* use custom color or default */ @@ -1967,7 +1967,7 @@ App.Art.vectorArtElement = (function() { } } /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.collar === "cat ears") { + if (slave.faceAccessory === "cat ears") { res.appendChild(useSvg("Art_Vector_Cat_Ear_Back")); } } @@ -2043,7 +2043,7 @@ App.Art.vectorArtElement = (function() { } } /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.collar === "cat ears") { + if (slave.faceAccessory === "cat ears") { res.appendChild(useSvg("Art_Vector_Cat_Ear_Fore")); } } @@ -2513,15 +2513,17 @@ App.Art.vectorArtElement = (function() { /* ADDONS */ if (slave.fuckdoll === 0) { /* Fuckdolls cannot be decorated */ - if (slave.collar === "dildo gag") { + if (slave.mouthAccessory === "dildo gag") { res.appendChild(useSvg("Art_Vector_Dildo_Gag")); - } else if (slave.collar === "ball gag") { + } else if (slave.mouthAccessory === "ball gag") { res.appendChild(useSvg("Art_Vector_Ball_Gag")); - } else if (slave.collar === "bit gag") { + } else if (slave.mouthAccessory === "bit gag") { res.appendChild(useSvg("Art_Vector_Bit_Gag")); - } else if (slave.collar === "massive dildo gag") { + } else if (slave.mouthAccessory === "massive dildo gag") { res.appendChild(useSvg("Art_Vector_Massive_Dildo_Gag")); - } else if (slave.collar === "porcelain mask") { + } + + if (slave.faceAccessory === "porcelain mask") { res.appendChild(useSvg("Art_Vector_Porcelain_Mask")); } @@ -3040,10 +3042,15 @@ App.Art.legacyVectorArtElement = function() { case "shock punishment": case "tight steel": case "uncomfortable leather": + } + + /* Gag */ + switch (slave.mouthAccessory ) { case "dildo gag": addImg(res, `outfit/${slave.collar}`); } + /* Head base image */ if (wearingLatex === true) { addImg(res, "outfit/head latex"); diff --git a/src/art/vector_revamp/vectorRevampedArtControl.js b/src/art/vector_revamp/vectorRevampedArtControl.js index b7b6b3bf725b05efaccb1977d94781ce62a1791e..967fd9094a97677955c8258d05aa32f9824e52e4 100644 --- a/src/art/vector_revamp/vectorRevampedArtControl.js +++ b/src/art/vector_revamp/vectorRevampedArtControl.js @@ -1647,7 +1647,7 @@ class RevampedArtControl { } if (this.showMouth) { - switch (this.artSlave.collar) { + switch (this.artSlave.mouthAccessory) { case "dildo gag": result.push("Art_Vector_Revamp_Dildo_Gag"); break; diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index e3fa0e0b2fae264d53ffde31beb350b36ce2eed5..9df18a339519b07663a7617bc776357752799854 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -880,6 +880,26 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { if (typeof slave.backAccessory !== "string") { slave.backAccessory = "none"; } + if (typeof slave.faceAccessory !== "string") { + slave.faceAccessory = "none"; + } + if (typeof slave.mouthAccessory !== "string") { + slave.mouthAccessory = "none"; + } + switch(slave.collar) { + case "porcelain mask": + slave.faceAccessory = slave.collar; + slave.collar = "none"; + break; + case "bit gag": + case "dildo gag": + case "massive dildo gag": + case "ball gag": + case "ring gag": + slave.mouthAccessory = slave.collar; + slave.collar = "none"; + break; + } } /** @@ -2282,7 +2302,7 @@ App.Entity.Utils.GenePoolRecordCleanup = (function() { "useRulesAssistant", "diet", "dietCum", "dietMilk", "drugs", "curatives", "aphrodisiacs", - "choosesOwnClothes", "clothes", "collar", "shoes", + "choosesOwnClothes", "clothes", "collar", "mouthAccessory", "faceAccessory", "shoes", "makeup", "nails", "vaginalAccessory", "vaginalAttachment", "dickAccessory", "nipplesAccessory", "armAccessory", "legAccessory", "buttplug", "buttplugAttachment", diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js index 593c50e77c984259d65c569e85a76db59f5fbf84..4139ed3b0f1bfd280a92327d15392d1c823dfdad 100644 --- a/src/endWeek/saClothes.js +++ b/src/endWeek/saClothes.js @@ -32,6 +32,12 @@ App.SlaveAssignment.clothes = (function() { if (slave.collar !== "none") { collarEffects(slave); } + if (slave.faceAccessory !== "none") { + maskEffects(slave); + } + if (slave.mouthAccessory !== "none") { + mouthEffects(slave); + } chastityEffects(slave); if (slave.bellyAccessory !== "none") { bellyAccessories(slave); @@ -395,25 +401,6 @@ App.SlaveAssignment.clothes = (function() { } else if (slave.collar === "uncomfortable leather" || slave.collar === "neck corset") { r.push(`The uncomfortable leather collar ${he}'s wearing <span class="gold">reminds ${him} to be afraid</span> every time ${he} turns ${his} head.`); slave.trust -= 1; - } else if (slave.collar === "dildo gag") { - r.push(`The dildo gag ${he}'s wearing <span class="gold">reminds ${him} to be afraid</span> with every breath ${he} must carefully take through ${his} nose.`); - slave.trust -= 1; - } else if (slave.collar === "ball gag") { - r.push(`The ball gag ${he}'s wearing keeps ${his} mouth filled and, since ${he} can't speak out, forces ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">fears</span> for ${his} safety with every suppressed word.`); - slave.devotion++; - slave.trust -= 2; - } else if (slave.collar === "bit gag") { - r.push(`The uncomfortable bit gag ${he}'s wearing keeps ${his} mouth locked and, since ${he} can't speak out, forces ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">fears</span> for ${his} safety with every suppressed word.`); - slave.devotion++; - slave.trust -= 2; - } else if (slave.collar === "porcelain mask") { - r.push(`The beautiful porcelain mask ${he}'s wearing slowly erodes ${his} identity, forcing ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">questions</span> who ${he} is.`); - slave.devotion++; - slave.trust -= 2; - } else if (slave.collar === "massive dildo gag") { - r.push(`The enormous dildo gag ${he}'s wearing <span class="gold">terrifies ${him}</span> that ${he} will soon be choking down cocks of similar size. ${He} can feel ${his} throat stretching around the giant dildo, and <span class="mediumorchid">resents you</span> for tormenting ${him} this way.`); - slave.devotion -= 1; - slave.trust -= 2; } else if (slave.collar === "shock punishment") { r.push(`The shock collar ${he}'s wearing makes ${his} frequent, deserved punishments <span class="gold">immediate, inescapable,</span> and <span class="mediumorchid">awful.</span>`); slave.devotion -= 2; @@ -433,8 +420,8 @@ App.SlaveAssignment.clothes = (function() { if (slave.collar === "heavy gold" || slave.collar === "ancient Egyptian") { r.push(`${He} bears the burden of ${his} heavy gold collar with <span class="mediumaquamarine">confidence.</span>`); slave.trust += 1; - } else if (slave.collar === "bowtie") { - r.push(`The bowtie and shirt collar ${he} wears fill ${him} with <span class="mediumaquamarine">confidence,</span> since although they conceal a more traditional slave collar that can be used to restrain ${him}, they don't look like it.`); + } else if (slave.collar === "bowtie" || slave.collar === "neck tie" ) { + r.push(`The ${slave.collar} and shirt collar ${he} wears fill ${him} with <span class="mediumaquamarine">confidence,</span> since although they conceal a more traditional slave collar that can be used to restrain ${him}, they don't look like it.`); slave.trust += 1; } else if (["nice retirement counter", "pretty jewelry", "satin choker", "silk ribbon", "stylish leather"].includes(slave.collar)) { r.push(`The lovely collar ${he} wears fills ${him} with <span class="mediumaquamarine">confidence.</span>`); @@ -447,31 +434,90 @@ App.SlaveAssignment.clothes = (function() { r.push(`${He} <span class="hotpink">likes</span> how ${his} cow collar encourages everyone to touch ${his} udders.`); slave.devotion += 1; } - } else if (slave.collar === "ball gag" || slave.collar === "bit gag") { + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function maskEffects(slave) { + if (slave.devotion <= 20) { + if (slave.faceAccessory === "porcelain mask") { + r.push(`The beautiful porcelain mask ${he}'s wearing slowly erodes ${his} identity, forcing ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">questions</span> who ${he} is.`); + slave.devotion++; + slave.trust -= 2; + } else if (slave.faceAccessory === "cat ears") { + r.push(`The adorable cat ears ${he}'s wearing slowly chip away at ${his} dignity, forcing ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">feels</span> more and more like a sex object.`); + slave.devotion++; + slave.trust -= 2; + } + } else { + if (slave.faceAccessory === "porcelain mask") { if (slave.fetish === "submissive" && slave.fetishStrength > 95) { - r.push(`${He} <span class="hotpink">loves</span> how ${his} gag forces ${him} to keep silent.`); + r.push(`${He} <span class="hotpink">loves</span> how ${his} mask makes ${him} beautiful enough for you.`); slave.devotion += 1; } else if (slave.fetish === "submissive" || slave.energy > 95) { - r.push(`${He} <span class="hotpink">likes</span> how ${his} gag forces ${him} to keep silent.`); + r.push(`${He} <span class="hotpink">likes</span> how ${his} mask makes ${him} beautiful enough for you.`); slave.devotion += 1; } - } else if (slave.collar === "porcelain mask") { + } else if (slave.faceAccessory === "cat ears") { if (slave.fetish === "submissive" && slave.fetishStrength > 95) { - r.push(`${He} <span class="hotpink">loves</span> how ${his} mask makes ${him} beautiful enough for you.`); + r.push(`${He} <span class="hotpink">loves</span> how ${his} cat ears make ${him} especially adorable for you.`); slave.devotion += 1; } else if (slave.fetish === "submissive" || slave.energy > 95) { - r.push(`${He} <span class="hotpink">likes</span> how ${his} mask makes ${him} beautiful enough for you.`); + r.push(`${He} <span class="hotpink">likes</span> how ${his} cat ears make ${him} especially adorable for you.`); + slave.devotion += 1; + } + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function mouthEffects(slave) { + if (slave.devotion <= 20) { + if (slave.mouthAccessory === "dildo gag") { + r.push(`The dildo gag ${he}'s wearing <span class="gold">reminds ${him} to be afraid</span> with every breath ${he} must carefully take through ${his} nose.`); + slave.trust -= 1; + } else if (slave.mouthAccessory === "ball gag") { + r.push(`The ball gag ${he}'s wearing keeps ${his} mouth filled and, since ${he} can't speak out, forces ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">fears</span> for ${his} safety with every suppressed word.`); + slave.devotion++; + slave.trust -= 2; + } else if (slave.mouthAccessory === "ring gag") { + r.push(`The ring gag ${he}'s wearing keeps ${his} mouth stretched wide and drooling. Since ${he} can't speak clearly, it forces ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">fears</span> for ${his} safety with every suppressed word.`); + slave.devotion++; + slave.trust -= 2; + } else if (slave.mouthAccessory === "bit gag") { + r.push(`The uncomfortable bit gag ${he}'s wearing keeps ${his} mouth locked and, since ${he} can't speak out, forces ${him} <span class="hotpink">to submit</span> to your will. ${He} <span class="gold">fears</span> for ${his} safety with every suppressed word.`); + slave.devotion++; + slave.trust -= 2; + } else if (slave.mouthAccessory === "massive dildo gag") { + r.push(`The enormous dildo gag ${he}'s wearing <span class="gold">terrifies ${him}</span> that ${he} will soon be choking down cocks of similar size. ${He} can feel ${his} throat stretching around the giant dildo, and <span class="mediumorchid">resents you</span> for tormenting ${him} this way.`); + slave.devotion -= 1; + slave.trust -= 2; + } + } else { + if (slave.mouthAccessory === "ball gag" || slave.mouthAccessory === "bit gag" || slave.mouthAccessory === "ring gag") { + if (slave.fetish === "submissive" && slave.fetishStrength > 95) { + r.push(`${He} <span class="hotpink">loves</span> how ${his} gag forces ${him} to keep silent.`); + slave.devotion += 1; + } else if (slave.fetish === "submissive" || slave.energy > 95) { + r.push(`${He} <span class="hotpink">likes</span> how ${his} gag forces ${him} to keep silent.`); slave.devotion += 1; } } } - if (slave.collar === "dildo gag") { + if (slave.mouthAccessory === "dildo gag") { if (slave.skill.oral <= 10) { r.push(`Living gagged by a dildo, ${he} can't help but get better at having things down ${his} throat.`); r.push(`${SkillIncrease.Oral(slave, 5)}`); } } - if (slave.collar === "massive dildo gag") { + if (slave.mouthAccessory === "massive dildo gag") { if (slave.skill.oral < 75) { r.push(`Living gagged by such an immense dildo, ${he} can't help but get even better at having giant things rammed down ${his} throat.`); r.push(`${SkillIncrease.Oral(slave, 5)}`); diff --git a/src/endWeek/saPorn.js b/src/endWeek/saPorn.js index e5b71af2f88ada3a66883cf9c0e0454614a62560..2f51af66f0c395659b80586f570a1b217f323df3 100644 --- a/src/endWeek/saPorn.js +++ b/src/endWeek/saPorn.js @@ -114,7 +114,7 @@ App.SlaveAssignment.porn = (function() { decayRate = 5000; if (slave.fuckdoll > 0) { face = 50; - } else if (slave.collar === "porcelain mask") { + } else if (slave.faceAccessory === "porcelain mask") { face = 20; } else { face = slave.face * 4; @@ -124,7 +124,7 @@ App.SlaveAssignment.porn = (function() { decayRate = 500; if (slave.fuckdoll > 0) { face = 20; - } else if (slave.collar === "porcelain mask") { + } else if (slave.faceAccessory === "porcelain mask") { face = 50; } else { face = slave.face * 2; @@ -134,7 +134,7 @@ App.SlaveAssignment.porn = (function() { decayRate = 30; if (slave.fuckdoll > 0) { face = 0; - } else if (slave.collar === "porcelain mask") { + } else if (slave.faceAccessory === "porcelain mask") { face = 0; } else { face = slave.face / 20; @@ -167,7 +167,7 @@ App.SlaveAssignment.porn = (function() { function faceCommentary(slave) { if (slave.fuckdoll > 0) { return; - } else if (slave.collar === "porcelain mask") { + } else if (slave.faceAccessory === "porcelain mask") { r += `${His} mask adds an air of mystery to ${him}, `; if (slave.porn.prestige > 1) { r += `but people wonder if ${he} is trying to hide something. `; diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js index de65be9984e94e87339540509349f87e52918b76..e57f1d4a33976617e7f8b804ae54668bad2da2ba 100644 --- a/src/facilities/nursery/nurseryDatatypeCleanup.js +++ b/src/facilities/nursery/nurseryDatatypeCleanup.js @@ -344,6 +344,26 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) { if (typeof child.backAccessory !== "string") { child.backAccessory = "none"; } + if (typeof slave.faceAccessory !== "string") { + slave.faceAccessory = "none"; + } + if (typeof slave.mouthAccessory !== "string") { + slave.mouthAccessory = "none"; + } + switch(slave.collar) { + case "porcelain mask": + slave.faceAccessory = slave.collar; + slave.collar = "none"; + break; + case "bit gag": + case "dildo gag": + case "massive dildo gag": + case "ball gag": + case "ring gag": + slave.mouthAccessory = slave.collar; + slave.collar = "none"; + break; + } } function childDietDatatypeCleanup(child) { diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index 22c8ef88c804b6eb45cac0f692cbec138e61d7e4..c9e941edc2178fb00bff347c9862adff8d7df1bb 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -9120,9 +9120,6 @@ globalThis.walkPast = (function() { t += `<<faceDescription>>`; t += `<<mouthDescription>>`; switch (slave.collar) { - case "a Fuckdoll suit": - t += `${His} suit is expressly designed to encourage use of ${his} face hole.`; - break; case "uncomfortable leather": t += `${His} uncomfortable leather collar makes ${him} swallow and lick ${his} lips periodically, making it look like ${he}'s offering oral even though ${he}'s just trying to relieve the discomfort.`; break; @@ -9133,12 +9130,6 @@ globalThis.walkPast = (function() { case "preg biometrics": t += `${His} collar reveals everything about ${his} womb, bringing eyes straight to ${his} belly before drawing them back to ${his} neck.`; break; - case "dildo gag": - t += `${His} ring gag would make ${him} ready for oral service, as soon as the formidable dildo it secures down ${his} throat is removed.`; - break; - case "massive dildo gag": - t += `Your eyes are drawn to the distinct bulge in ${his} throat caused by the enormous dildo in it, though ${his} mouth would only be suitable for the largest of cocks right now.`; - break; case "shock punishment": t += `${His} shock collar rests threateningly at ${his} throat, ready to compel ${him} to do anything you wish.`; break; @@ -9170,26 +9161,48 @@ globalThis.walkPast = (function() { case "bowtie": t += `${His} black bowtie contrasts with ${his} white collar, drawing the eye towards ${his} neck and face.`; break; + case "neck tie": + t += `${His} neck tie is a reminder of old world business, although ${his} body is a reminder of the oldest business in the world.`; + break; case "ancient Egyptian": t += `${His} wesekh glints richly as ${he} moves, sparkling with opulence and sensuality.`; break; + default: + if (slave.clothes === "a Fuckdoll suit") { + t += `${His} suit is expressly designed to encourage use of ${his} face hole.`; + } else { + t += `${His} unadorned `; + if (V.PC.dick !== 0) { + t += `throat is just waiting to be wrapped around a thick shaft.`; + } else { + t += `lips are just begging for a cunt to lavish attention on.`; + } + } + } + switch (slave.mouthAccessory ) { + case "dildo gag": + t += `${His} ring gag would make ${him} ready for oral service, as soon as the formidable dildo it secures down ${his} throat is removed.`; + break; + case "massive dildo gag": + t += `Your eyes are drawn to the distinct bulge in ${his} throat caused by the enormous dildo in it, though ${his} mouth would only be suitable for the largest of cocks right now.`; + break; case "ball gag": t += `${His} ball gag uncomfortably holds ${his} jaw apart as it fills ${his} mouth.`; break; case "bit gag": t += `${His} bit gag uncomfortably keeps ${him} from closing ${his} jaw; drool visibly pools along the corners of ${his} mouth, where the rod forces back ${his} cheeks.`; break; + case "ring gag": + t += `${His} ring gag uncomfortably keeps ${him} from closing ${his} mouth; drool visibly pools around ${his} tongue, and trickles down ${his} chin unless ${he} can keep ${his} head back.`; + break; + } + + switch (slave.faceAccessory ) { case "porcelain mask": t += `${His} beautiful porcelain mask hides ${his} face and any unsightly facial features.`; break; - default: - t += `${His} unadorned `; - if (V.PC.dick !== 0) { - t += `throat is just waiting to be wrapped around a thick shaft.`; - } else { - t += `lips are just begging for a cunt to lavish attention on.`; - } } + if (jsRandom(1, 3) === 1) { V.target = "FKiss"; } else { diff --git a/src/interaction/wardrobeUse.js b/src/interaction/wardrobeUse.js index b357de90b58156a94d329d5a4f71d739dec0544d..e83c8cead527d6cebf1c7bf94f6e4d6f8a144967 100644 --- a/src/interaction/wardrobeUse.js +++ b/src/interaction/wardrobeUse.js @@ -158,7 +158,55 @@ App.UI.Wardrobe.collar = function(slave) { links.appendChild(App.UI.SlaveInteract.generateRows(harshOptionsArray, slave, "collar", true)); el.appendChild(links); - if (slave.eyewear === "corrective glasses" || slave.eyewear === "glasses" || slave.eyewear === "blurring glasses" || slave.collar === "porcelain mask") { + return jQuery('#collar').empty().append(el); +}; + +App.UI.Wardrobe.mask = function(slave) { + if (slave.fuckdoll !== 0) { + return; + } + let el = document.createElement('div'); + + let label = document.createElement('div'); + label.append(`Mask: `); + + let choice = document.createElement('span'); + choice.style.fontWeight = "bold"; + choice.textContent = (`${slave.faceAccessory} `); + label.appendChild(choice); + + // Choose her own + if (slave.faceAccessory !== `none`) { + let choiceOptionsArray = []; + choiceOptionsArray.push({text: `None`, updateSlave: {faceAccessory: `none`}}); + label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "faceAccessory", false)); + } + + el.appendChild(label); + + let array = []; + + let clothingOption; + App.Data.misc.faceAccessory.forEach(item => { + clothingOption = { + text: item.name, + updateSlave: {faceAccessory: item.value} + }; + if (item.fs) { + clothingOption.FS = item.fs; + } + array.push(clothingOption); + }); + + // Sort + array = array.sort((a, b) => (a.text > b.text) ? 1 : -1); + + let links = document.createElement('div'); + links.className = "choices"; + links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "faceAccessory", true)); + el.appendChild(links); + + if (slave.eyewear === "corrective glasses" || slave.eyewear === "glasses" || slave.eyewear === "blurring glasses" || slave.faceAccessory === "porcelain mask") { // Color options links = document.createElement('div'); links.className = "choices"; @@ -171,7 +219,56 @@ App.UI.Wardrobe.collar = function(slave) { el.appendChild(links); } - return jQuery('#collar').empty().append(el); + return jQuery('#faceAccessory').empty().append(el); +}; + +App.UI.Wardrobe.mouth = function(slave) { + if (slave.fuckdoll !== 0) { + return; + } + let el = document.createElement('div'); + + let label = document.createElement('div'); + label.append(`Gag: `); + + let choice = document.createElement('span'); + choice.style.fontWeight = "bold"; + choice.textContent = (`${slave.mouthAccessory} `); + label.appendChild(choice); + + // Choose her own + if (slave.mouthAccessory !== `none`) { + let choiceOptionsArray = []; + choiceOptionsArray.push({text: `None`, updateSlave: {mouthAccessory: `none`}}); + label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "mouthAccessory", false)); + } + + el.appendChild(label); + + let array = []; + + let clothingOption; + // mouthAccessory + App.Data.misc.mouthAccessory.forEach(item => { + clothingOption = { + text: item.name, + updateSlave: {mouthAccessory: item.value} + }; + if (item.fs) { + clothingOption.FS = item.fs; + } + array.push(clothingOption); + }); + + // Sort + array = array.sort((a, b) => (a.text > b.text) ? 1 : -1); + + let links = document.createElement('div'); + links.className = "choices"; + links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "mouthAccessory", true)); + el.appendChild(links); + + return jQuery('#mouthAccessory').empty().append(el); }; App.UI.Wardrobe.armAccessory = function(slave) { @@ -807,6 +904,8 @@ App.UI.Wardrobe.colorOptions = function(slave, update) { App.UI.Wardrobe.refreshAll = function(slave) { App.UI.Wardrobe.clothes(slave); App.UI.Wardrobe.collar(slave); + App.UI.Wardrobe.mask(slave); + App.UI.Wardrobe.mouth(slave); App.UI.Wardrobe.armAccessory(slave); App.UI.Wardrobe.shoes(slave); App.UI.Wardrobe.legAccessory(slave); diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index 8b565adae01fc363914756ac81c9e55beec6adcb..a5ebb5d42447c886a26c7752e320d2c09d4bcc0c 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -46,6 +46,8 @@ globalThis.DefaultRules = (function() { if (slave.fuckdoll === 0) { ProcessClothing(slave, rule); ProcessCollar(slave, rule); + ProcessMask(slave, rule); + ProcessGag(slave, rule); ProcessEyewear(slave, rule); ProcessEarwear(slave, rule); ProcessDildos(slave, rule); @@ -206,9 +208,6 @@ globalThis.DefaultRules = (function() { if (rule.collar === "preg biometrics" && slave.preg <= -1 && slave.ovaries === 0 && slave.mpreg === 0) { slave.collar = "none"; r += `${slave.slaveName} cannot utilize preg biometrics. `; - } else if ((rule.collar === "massive dildo gag" && slave.skill.oral <= 50)) { - slave.collar = "none"; - r += `${slave.slaveName} lacks the oral skill to successfully keep the massive dildo gag in ${his} throat. `; } else { slave.collar = rule.collar; } @@ -216,7 +215,7 @@ globalThis.DefaultRules = (function() { r += `${slave.slaveName} has been given no collar.`; } else if ((slave.collar === "pretty jewelry")) { r += `${slave.slaveName} has been given ${slave.collar}.`; - } else if ((["ball gag", "bell collar", "bit gag", "bowtie", "dildo gag", "massive dildo gag", "neck corset", "porcelain mask"].includes(slave.collar))) { + } else if ((["bell collar", "bowtie", "neck corset", "neck tie"].includes(slave.collar))) { r += `${slave.slaveName} has been given a ${slave.collar}.`; } else { r += `${slave.slaveName} has been given a ${slave.collar} collar.`; @@ -225,6 +224,49 @@ globalThis.DefaultRules = (function() { } } + /** + * @param {App.Entity.SlaveState} slave + * @param {App.RA.RuleSetters} rule + */ + function ProcessMask(slave, rule) { + // apply faceAccessory to slave + if ((rule.faceAccessory !== undefined) && (rule.faceAccessory !== null)) { + if (slave.faceAccessory !== rule.faceAccessory) { + r += "<br>"; + slave.faceAccessory = rule.faceAccessory; + if (slave.faceAccessory === "none") { + r += `${slave.slaveName} has had their mask removed.`; + } else { + r += `${slave.slaveName} has been given a ${slave.faceAccessory}.`; + } + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * @param {App.RA.RuleSetters} rule + */ + function ProcessGag(slave, rule) { + // apply mouthAccessory to slave + if ((rule.mouthAccessory !== undefined) && (rule.mouthAccessory !== null)) { + if (slave.mouthAccessory !== rule.mouthAccessory) { + r += "<br>"; + if ((rule.mouthAccessory === "massive dildo gag" && slave.skill.oral <= 50)) { + slave.mouthAccessory = "none"; + r += `${slave.slaveName} lacks the oral skill to successfully keep the massive dildo gag in ${his} throat. `; + } else { + slave.mouthAccessory = rule.mouthAccessory; + } + if (slave.mouthAccessory === "none") { + r += `${slave.slaveName} has been given no gag.`; + } else { + r += `${slave.slaveName} has been given a ${slave.mouthAccessory}.`; + } + } + } + } + /** * @param {App.Entity.SlaveState} slave * @param {App.RA.RuleSetters} rule diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 381f9e6605cabbdec98ea673e30f7015c99b242a..6dac7d2d3868405278ef5dbf1095aa4115ccab17 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -1789,25 +1789,36 @@ App.Entity.SlaveState = class SlaveState { * * "uncomfortable leather" * * "tight steel" * * "shock punishment" - * * "dildo gag" * * "heavy gold" * * "pretty jewelry" * * "nice retirement counter" * * "bell collar" * * "leather with cowbell" * * "bowtie" + * * "neck tie" * * "neck corset" * * "stylish leather" * * "satin choker" * * "preg biometrics" - * * "massive dildo gag" * * "silk ribbon" + */ + this.collar = "none"; + /** + * may accept strings, use at own risk + * * "none" + * * "porcelain mask" + */ + this.faceAccessory = "none"; + /** + * may accept strings, use at own risk + * * "none" + * * "dildo gag" + * * "massive dildo gag" * * "ball gag" * * "bit gag" * * "ring gag" - * * "porcelain mask" */ - this.collar = "none"; + this.mouthAccessory = "none"; /** * may accept strings, use at own risk * * "none" diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js index 86a273ae8a5ed236e7445f7f2351bc0f2d87d426..b880d2d4ee5b41a0d5af05c249c98c77f94ca153 100644 --- a/src/js/descriptionWidgets.js +++ b/src/js/descriptionWidgets.js @@ -1727,3 +1727,42 @@ App.Desc.sexualHistory = function(slave) { return r; }; + +App.Desc.faceAccessory = function(slave) { + const {He, his} = getPronouns(slave); + switch (slave.faceAccessory) { + case "porcelain mask": + return `${He} is wearing a beautiful porcelain mask to hide ${his} unsightly facial features.`; + case "cat ears": + return `${He} is wearing an adorable pair of cat ears.`; + } +}; + +App.Desc.mouthAccessory = function(slave) { + const {He, His, him, he, his, himself, girl} = getPronouns(slave); + let r = ``; + switch (slave.mouthAccessory ) { + case "ball gag": + r += `${He} is wearing a mouth filling, `; + if (slave.makeup === 3 || slave.makeup === 6 || slave.makeup === 8) { + r += `${slave.hColor} `; + } else { + r += `red `; + } + r += `ball-shaped gag that prevents ${him} from uttering a word while keeping ${him} uncomfortably aware of ${his} status.`; + break; + case "bit gag": + r += `${He} is wearing a jaw spreading, bar-shaped gag that prevents ${him} from speaking while keeping $him uncomfortably aware of ${his} status.`; + break; + case "dildo gag": + r += `${He} is wearing a sturdy leather collar that continues up to restrict ${his} jaw as well. It holds a ring gag in ${his} mouth, into which slots a formidable inward-facing dildo that reaches down ${his} throat. It can be removed to facefuck ${him}.`; + break; + case "massive dildo gag": + r += `${He} is wearing a sturdy leather collar that continues up to restrict ${his} jaw as well. It acts as an anchor for an enormous inward-facing dildo that reaches deep down ${his} throat. The sheer size of the phallus forces ${his} mouth as wide as it will go and considerably bulges ${his} throat. Fortunately for ${him}, it is designed to allow ${him} to be able to breathe through ${his} nose; though when removed, the poor ${girl} finds ${himself} incapable of closing ${his} mouth for some time.`; + break; + case "ring gag": + r += `${His} ring gag uncomfortably keeps ${him} from closing ${his} mouth; drool visibly pools around ${his} tongue, and trickles down ${his} chin unless ${he} can keep ${his} head back.`; + break; + } + return r; +}; diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 0bda43a6d0514d9952b5887b240c41b42c5d86a9..3d088d06c33badba2e534ed3da2d00e131d5267d 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -816,7 +816,7 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { } /* closes mute exempt */ if (eventSlave.devotion > 20) { - if (["ball gag", "bit gag", "dildo gag", "massive dildo gag"].includes(eventSlave.collar)) { + if (eventSlave.mouthAccessory !== "none") { State.variables.RESSevent.push("gagged slave"); } } @@ -1025,7 +1025,7 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { if (eventSlave.voice > 0) { if (eventSlave.lips <= 95) { - if (!["ball gag", "bit gag", "dildo gag", "massive dildo gag"].includes(eventSlave.collar)) { + if (eventSlave.mouthAccessory === "none") { if (eventSlave.accent === 3) { if (eventSlave.devotion <= 50) { if (eventSlave.trust > -10) { @@ -2226,7 +2226,7 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) { } /* closes mute exempt */ if (eventSlave.devotion > 20) { - if (["ball gag", "bit gag", "dildo gag", "massive dildo gag"].includes(eventSlave.collar)) { + if (eventSlave.mouthAccessory !== "none") { State.variables.RESSevent.push("gagged slave"); } } diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 27554ebb74a037bebae672b5144a0a41b47c159f..08d195385554f6056bd3aad5df7c7d06573944b0 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -1573,6 +1573,8 @@ globalThis.rulesAssistantOptions = (function() { 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 GlovesList()); @@ -1822,6 +1824,21 @@ globalThis.rulesAssistantOptions = (function() { } } + class MaskList extends ListSelector { + constructor() { + super("Mask", isItemAccessible.array(App.Data.misc.faceAccessory )); + this.setValue(current_rule.set.faceAccessory ); + this.onchange = (value) => current_rule.set.faceAccessory = value; + } + } + + class GagList extends ListSelector { + constructor() { + super("Gag", isItemAccessible.array(App.Data.misc.mouthAccessory )); + this.setValue(current_rule.set.mouthAccessory ); + this.onchange = (value) => current_rule.set.mouthAccessory = value; + } + } class ShoeList extends ListSelector { constructor() { super("Shoes", isItemAccessible.array(App.Data.misc.shoes)); diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js index ec2449ca055dfaa70f4d45ff3fee40002ac328dd..e0c1fc79590a7d520cf59aff383473fc0054520e 100644 --- a/src/js/slaveSummaryHelpers.js +++ b/src/js/slaveSummaryHelpers.js @@ -945,6 +945,24 @@ App.UI.SlaveSummaryImpl = function() { helpers.makeMappedSpan(c, data.long.accessory.collar, slave.collar); } + /** + * @param {App.Entity.SlaveState} slave + * @param {Node} c + * @returns {void} + */ + function long_mask(slave, c) { + helpers.makeMappedSpan(c, data.long.accessory.faceAccessory, slave.faceAccessory); + } + + /** + * @param {App.Entity.SlaveState} slave + * @param {Node} c + * @returns {void} + */ + function long_mouth(slave, c) { + helpers.makeMappedSpan(c, data.long.accessory.mouthAccessory, slave.mouthAccessory); + } + /** * @param {App.Entity.SlaveState} slave * @param {Node} c @@ -1673,6 +1691,8 @@ App.UI.SlaveSummaryImpl = function() { porn_prestige: long_porn_prestige, clothes: long_clothes, collar: long_collar, + mask: long_mask, + mouth: long_mouth, belly: long_belly, arms: long_arms, legs: long_legs, diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index 10cd93fc06b6bc01c312d62c32d83937d4a113e2..adb622a4bb353e13c67ef96a9e73d187990b23a9 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -663,6 +663,8 @@ App.UI.SlaveSummaryRenderers = function() { } b.clothes(slave, dressingBlock); b.collar(slave, dressingBlock); + b.mask(slave, dressingBlock); + b.mouth(slave, dressingBlock); b.belly(slave, dressingBlock); if (hasAnyArms(slave)) { b.arms(slave, dressingBlock); diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js index a4e164f4b5b78184c147bd750533030f89995935..c30d8c5bf8ea0cee0929d01a6990a5b7e44e9318 100644 --- a/src/js/statsChecker/statsChecker.js +++ b/src/js/statsChecker/statsChecker.js @@ -766,13 +766,15 @@ globalThis.canTalk = function(slave, checkLanguage = true) { return false; } else if (slave.lips > 95) { return false; - } else if (slave.collar === "dildo gag") { + } else if (slave.mouthAccessory === "dildo gag") { return false; - } else if (slave.collar === "massive dildo gag") { + } else if (slave.mouthAccessory === "massive dildo gag") { return false; - } else if (slave.collar === "ball gag") { + } else if (slave.mouthAccessory === "ball gag") { return false; - } else if (slave.collar === "bit gag") { + } else if (slave.mouthAccessory === "bit gag") { + return false; + } else if (slave.mouthAccessory === "ring gag") { return false; } return true; diff --git a/src/npc/interaction/fDance.tw b/src/npc/interaction/fDance.tw index c02b251217cac39298301e0494713f3bfccaa1d7..7a1c6a83e086ed8bbe6af87e1a6d84f2e1a2afea 100644 --- a/src/npc/interaction/fDance.tw +++ b/src/npc/interaction/fDance.tw @@ -164,68 +164,80 @@ $His face is but $he is to terrified of you to see what happens if $he resists <<else>> and refuses to comply. In order to make $him obey, a leash is attached from - <<switch getSlave($AS).collar>> - <<case "uncomfortable leather">> - the steel ring on $his leather collar - <<case "dildo gag">> - a ring on $his gag strap - <<case "massive dildo gag">> - a ring on $his gag strap - <<case "preg biometrics">> - $his collar - <<case "silk ribbon">> - $his silk ribbon - <<case "tight steel">> - $his steel collar - <<case "porcelain mask">> - <<if getSlave($AS).nosePiercing == 2>> - $his nose ring - <<elseif getSlave($AS).nipplesPiercing == 2>> - $his nipple chain - <<else>> - a collar that is placed around $his neck - <</if>> - <<case "shock punishment">> - $his shock collar - <<case "neck corset">> - an O-ring at the from of $his neck corset - <<case "stylish leather">> - $his collar - <<case "satin choker">> - $his choker collar - <<case "heavy gold">> - $He is wearing a heavy gold collar, an outstanding bit of ostentation. - <<case "pretty jewelry">> - $his ornate collar - <<case "bell collar">> - the ring attaching $his bell to $his collar, and - <<case "leather with cowbell">> - the ring attaching $his bell to $his collar, and - <<case "bowtie">> - $his bowtie collar - <<case "ancient Egyptian">> - <<if getSlave($AS).nosePiercing == 2>> - $his nose ring - <<elseif getSlave($AS).nipplesPiercing == 2>> - $his nipple chain - <<else>> - $his wesekh - <</if>>. - <<case "ball gag">> - a ring on the back of $his gag - <<case "bit gag">> - the ring on the side of $his bit - <<case "cruel retirement counter" "nice retirement counter">> - $his retirement counter - <<case "default">> - <<if getSlave($AS).nosePiercing == 2>> - $his nose ring - <<elseif getSlave($AS).nipplesPiercing == 2>> - $his nipple chain - <<else>> - a collar that is placed on $his neck for the occasion, and - <</if>> - <</switch>> + <<if getSlave($AS).collar != "none">> + <<switch getSlave($AS).collar>> + <<case "uncomfortable leather">> + the steel ring on $his leather collar + <<case "preg biometrics">> + $his collar + <<case "silk ribbon">> + $his silk ribbon + <<case "tight steel">> + $his steel collar + <<case "shock punishment">> + $his shock collar + <<case "neck corset">> + an O-ring at the from of $his neck corset + <<case "stylish leather">> + $his collar + <<case "satin choker">> + $his choker collar + <<case "heavy gold">> + $He is wearing a heavy gold collar, an outstanding bit of ostentation. + <<case "pretty jewelry">> + $his ornate collar + <<case "bell collar">> + the ring attaching $his bell to $his collar, and + <<case "leather with cowbell">> + the ring attaching $his bell to $his collar, and + <<case "bowtie">> + $his bowtie collar + <<case "bowtie">> + $his neck tie + <<case "ancient Egyptian">> + <<if getSlave($AS).nosePiercing == 2>> + $his nose ring + <<elseif getSlave($AS).nipplesPiercing == 2>> + $his nipple chain + <<else>> + $his wesekh + <</if>>. + <<case "cruel retirement counter" "nice retirement counter">> + $his retirement counter + <<case "default">> + <<if getSlave($AS).nosePiercing == 2>> + $his nose ring + <<elseif getSlave($AS).nipplesPiercing == 2>> + $his nipple chain + <<else>> + a collar that is placed on $his neck for the occasion, and + <</if>> + <</switch>> + <<elseif getSlave($AS).mouthAccessory != "none">> + <<switch getSlave($AS).mouthAccessory>> + <<case "dildo gag">> + a ring on $his gag strap + <<case "massive dildo gag">> + a ring on $his gag strap + <<case "ball gag">> + a ring on the back of $his gag + <<case "bit gag">> + the ring on the side of $his bit + <<case "ring gag">> + a bar in $his mouth slightly wider than $his ring gag + <</switch>> + <<elseif getSlave($AS).faceAccessory != "none">> + <<switch getSlave($AS).faceAccessory>> + <<case "porcelain mask">> + <<if getSlave($AS).nosePiercing == 2>> + $his nose ring + <<elseif getSlave($AS).nipplesPiercing == 2>> + $his nipple chain + <<else>> + a collar that is placed around $his neck + <</if>> + <</switch>> + <</if>> to the pole in order to keep $him from getting down. Whenever $he stops dancing the chain is tightened a bit more, <<switch getSlave($AS).collar>> <<case "uncomfortable leather">> diff --git a/src/npc/interaction/fKiss.tw b/src/npc/interaction/fKiss.tw index 55b7b267b2bcca0ad49ce1939c854a2b6eb101d7..a377816d00d355bea8c05d580d192c8996859fc9 100644 --- a/src/npc/interaction/fKiss.tw +++ b/src/npc/interaction/fKiss.tw @@ -5,34 +5,34 @@ <<setPlayerPronouns>> You tell <<= getSlave($AS).slaveName>> to -<<switch getSlave($AS).collar>> +<<switch getSlave($AS).mouthAccessory>> +<<case "none">> + <<if canWalk(getSlave($AS))>> + approach you. + <<else>> + have another slave help $him to your desk. + <</if>> <<case "dildo gag">> <<if hasAnyArms(getSlave($AS))>> remove $his dildo gag and approach you. <<else>> have another slave remove $his dildo gag and set $him down on your desk. <</if>> - <<set _tempGag = getSlave($AS).collar, getSlave($AS).collar = "none">> + <<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">> <<case "massive dildo gag">> <<if hasAnyArms(getSlave($AS))>> pull $his enormous dildo gag out of the depths of $his throat and approach you. <<else>> have another slave pull the enormous dildo gag out of the depths of $his throat and set $him down on your desk. <</if>> - <<set _tempGag = getSlave($AS).collar, getSlave($AS).collar = "none">> -<<case "ball gag" "bit gag">> + <<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">> +<<default>> <<if hasAnyArms(getSlave($AS))>> undo $his gag and approach you. <<else>> have another slave undo $his gag and set $him down on your desk. <</if>> - <<set _tempGag = getSlave($AS).collar, getSlave($AS).collar = "none">> -<<default>> - <<if canWalk(getSlave($AS))>> - approach you. - <<else>> - have another slave help $him to your desk. - <</if>> + <<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">> <</switch>> <<run Enunciate(getSlave($AS))>> @@ -323,5 +323,5 @@ Then, you gently raise $his <<if getSlave($AS).face > 95>>heartrendingly beautif <</if>> <<if def _tempGag>> - <<set getSlave($AS).collar = _tempGag>> + <<set getSlave($AS).mouthAccessory = _tempGag>> <</if>> diff --git a/src/npc/interaction/fLips.tw b/src/npc/interaction/fLips.tw index 5c674dfa777d8631e0ba946634f91965fcd7ba9d..0cc558174b3adf3aa96660106ca3088ce231c021 100644 --- a/src/npc/interaction/fLips.tw +++ b/src/npc/interaction/fLips.tw @@ -26,7 +26,7 @@ You tell <<= getSlave($AS).slaveName>> to $He's delighted at the prospect of $his favorite activity. <</if>> -<<switch getSlave($AS).collar>> +<<switch getSlave($AS).mouthAccessory>> <<case "dildo gag">> <<if hasAnyArms(getSlave($AS))>> $He removes the dildo from $his throat, leaving the ring gag in place. @@ -48,6 +48,13 @@ You tell <<= getSlave($AS).slaveName>> to As an amputee, $he requires your assistance to get the gag unfastened. <</if>> Able to breathe through $his mouth for the first time in a while, $he gasps gratefully, knowing the respite will be brief. +<<case "ring gag">> + <<if hasAnyArms(getSlave($AS))>> + $He unfastens $his gag. + <<else>> + As an amputee, $he requires your assistance to get the gag unfastened. + <</if>> + Able to flew $his jaw for the first time in a while, $he swallows gratefully, knowing the respite will be brief. <</switch>> <<if (getSlave($AS).lipsTat == "tribal patterns")>> @@ -120,10 +127,10 @@ You tell <<= getSlave($AS).slaveName>> to <<elseif getSlave($AS).devotion < -20>> $He tries to back away, so you <<if ($PC.dick != 0)>> - <<if getSlave($AS).collar == "dildo gag">> + <<if getSlave($AS).mouthAccessory == "dildo gag">> grab $him; $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth is already held invitingly open by $his gag, and $he's prevented from biting. You push $him down to <<if hasAnyLegs(getSlave($AS))>>$his knee<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>the ground<</if>> with $his head against the couch next to your desk so you can give $him a good hard throat fuck. When you cum down $his <<= getSlave($AS).skin>> throat $he retches through $his tears. <<if $PC.vagina != -1>>$He has a mere moment to get $his breath back before you press your pussy against $his unwilling mouth.<</if>> - <<elseif getSlave($AS).collar == "massive dildo gag">> + <<elseif getSlave($AS).mouthAccessory == "massive dildo gag">> grab $him; $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth is left agape, unable to close after being forced so widely open for so long, so $he is unlikely to bite. You push $him down to <<if hasAnyLegs(getSlave($AS))>>$his knee<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>the ground<</if>> with $his head against the couch next to your desk so you can give $him a good hard throat fuck. When you cum down $his <<= getSlave($AS).skin>> throat $he retches through $his tears. <<if $PC.vagina != -1>>$He has a mere moment to get $his breath back before you press your pussy against $his unwilling mouth.<</if>> <<else>> diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js index a1b984d2f947c61a89190d2b613eb6c4f34d19e0..3edc3d395cd2a3dbb622d1c610c7efc7f2d61d89 100644 --- a/src/npc/surgery/surgery.js +++ b/src/npc/surgery/surgery.js @@ -1104,6 +1104,8 @@ globalThis.beginFuckdoll = function(slave) { slave.choosesOwnClothes = 0; slave.clothes = "a Fuckdoll suit"; slave.collar = "none"; + slave.faceAccessory = "none"; + slave.mouthAccessory = "none"; if ((!hasAnyLegs(slave)) || (slave.shoes !== "none")) { slave.shoes = "heels"; } diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw index 0449dcf8102d1587e143f62490162e08fedb306d..c69a68d7bdb3ea609b87f64eca017a2cf397ab43 100644 --- a/src/pregmod/widgets/bodyswapWidgets.tw +++ b/src/pregmod/widgets/bodyswapWidgets.tw @@ -194,6 +194,8 @@ <<set $args[0].dietMilk = $args[1].dietMilk>> <<set $args[0].clothes = $args[1].clothes>> <<set $args[0].collar = $args[1].collar>> + <<set $args[0].faceAccessory = $args[1].faceAccessory >> + <<set $args[0].mouthAccessory = $args[1].mouthAccessory >> <<set $args[0].shoes = $args[1].shoes>> <<set $args[0].makeup = $args[1].makeup>> <<set $args[0].nails = $args[1].nails>> diff --git a/src/uncategorized/REFI.tw b/src/uncategorized/REFI.tw index df85f4d12a76f15326e0951bf1779262215daf52..c1c752a72dc98a46542cd906627bde1795b08cb5 100644 --- a/src/uncategorized/REFI.tw +++ b/src/uncategorized/REFI.tw @@ -865,10 +865,10 @@ There was a glint of envy <<if canSee($activeSlave)>>in $his eyes when $he saw<< <<= VCheck.Vaginal()>> <<else>> $He hasn't recovered before $he feels - <<switch $activeSlave.collar>> + <<switch $activeSlave.mouthAccessory>> <<case "dildo gag" "massive dildo gag">> the relief of the dildo gag being drawn from $his throat before - <<case "ball gag" "bit gag">> + <<case "ball gag" "bit gag" "ring gag">> you unhook $his gag before <</switch>> the still more urgent pain of <<if $PC.dick != 0>>your dick getting shoved as deep down $his throat as you can<<else>>an enormous dildo forcing $his jaw wide and working its way down $his throat<</if>>, @@ -1000,10 +1000,10 @@ There was a glint of envy <<if canSee($activeSlave)>>in $his eyes when $he saw<< <<= VCheck.Vaginal()>> <<else>> $He hasn't recovered before $he feels - <<switch $activeSlave.collar>> + <<switch $activeSlave.mouthAccessory>> <<case "dildo gag" "massive dildo gag">> the relief of the dildo gag being drawn from $his throat before - <<case "ball gag" "bit gag">> + <<case "ball gag" "bit gag" "ring gag">> you unhook $his gag before <</switch>> the still more urgent pain of <<if $PC.dick != 0>>your dick getting shoved as deep down $his throat as you can<<else>>an enormous dildo forcing $his jaw wide and working its way down $his throat<</if>>, diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index fa3e61a47de0a40fc137528f92b171909eb9dd64..209656ddc88a234a04905ddece54ad9e20ff0f06 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -2908,12 +2908,11 @@ $He comes to a stop right beside your elbow, waiting for further direction, just <<case "tittymonster inspection">> You enter your office from other business a few minutes after the scheduled start of <<= App.UI.slaveDescriptionDialog($activeSlave)>>'s inspection. The <<if $boobAccessibility == 1>>accessibility aids for slaves with immobilizing breasts<<else>>slaves who helped $him in<</if>> have gone, leaving $him waiting for you in front of your desk. The sight is an arresting one. $He's kneeling, but $his boobs are so enormous that they're resting on the ground in front of $him, completely concealing $his body below the chest<<if $activeSlave.belly >= 120000>>, save for the protruding mass of $his <<if $activeSlave.pregType > 8>>hyper pregnant<<elseif $activeSlave.pregType > 4>><<print pregNumberName($activeSlave.pregType, 1)>>-filled<<else>>overly distended<</if>> belly<</if>>. With $his arm<<if hasBothArms($activeSlave)>>s<</if>> tucked back, and $his torso, <<if $activeSlave.belly < 120000>><<if $activeSlave.bellyPreg > 100>>pregnancy,<<elseif $activeSlave.belly > 100>>swollen stomach,<<else>>abdomen,<</if>><</if>> and legs hidden, $he appears to consist of a <<if $activeSlave.face > 95>>gorgeous<<elseif $activeSlave.face > 50>>beautiful<<elseif $activeSlave.face >= 10>>pretty<<elseif $activeSlave.face >= 0>>nice<<else>>homely<</if>>, $activeSlave.faceShape face, a -<<switch $activeSlave.collar>> -<<case "none" "dildo gag" "ball gag" "bit gag" "massive dildo gag">> - bare -<<default>> +<<if $activeSlave.collar == "none">> + none +<<else>> collared -<</switch>> +<</if>> neck, $activeSlave.skin, <<if $activeSlave.muscles > 95>>hugely muscled<<elseif $activeSlave.muscles > 30>>strong<<elseif $activeSlave.shoulders > 0>>broad<<elseif $activeSlave.shoulders < 0>>feminine<<elseif $activeSlave.muscles > 5>>toned<<else>>soft<</if>> shoulders, and below that, breasts<<if $activeSlave.belly >= 120000>> parted by $his _belly dome of a stomach<</if>>. $He greets you <<if $activeSlave.devotion > 50>>devotedly, behaving for all the world like $he's pleased to be<<elseif $activeSlave.devotion >= -20>>properly, with just a hint of unhappiness about being<<else>>with more than a hint of resentment over being<</if>> pinned to the floor by $his own tits. <<case "bonded love">> @@ -4155,13 +4154,15 @@ beside your desk to await further orders. It occurs to you, gazing down at your <<case "gagged slave">> You cross paths with <<= App.UI.slaveDescriptionDialog($activeSlave)>> as $he returns from $activeSlave.assignment after a long day. One of the things most readily apparent about $activeSlave.slaveName is the -<<if ($activeSlave.collar == "ball gag")>> +<<if ($activeSlave.mouthAccessory == "ball gag")>> ball gag keeping $his mouth filled, -<<elseif ($activeSlave.collar == "bit gag")>> +<<elseif ($activeSlave.mouthAccessory == "bit gag")>> cruel bit gag keeping $his jaw locked, -<<elseif ($activeSlave.collar == "dildo gag")>> +<<elseif ($activeSlave.mouthAccessory == "ring gag")>> + cruel ring gag keeping $his mouth stretched open, +<<elseif ($activeSlave.mouthAccessory == "dildo gag")>> dildo gag filling $his mouth and throat, -<<elseif ($activeSlave.collar == "massive dildo gag")>> +<<elseif ($activeSlave.mouthAccessory == "massive dildo gag")>> dildo gag hugely distending $his throat, <</if>> the existence of which is a constant reminder to $him of $his submission to you and your immense power over $him. @@ -19380,7 +19381,7 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <<link "Give $him something else to gag on">> <<replace "#result">> - As pleasant an image as $activeSlave.slaveName's mouth filled by a $activeSlave.collar is, one of $his mouth's primary purposes is still to provide you with ample <<if $PC.dick != 0>>blowjobs<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>cunnilingus<</if>>. With $activeSlave.slaveName already kneeling, it is merely a matter of undoing $his gag before you can put $his mouth to work. + As pleasant an image as $activeSlave.slaveName's mouth filled by a $activeSlave.mouthAccessory is, one of $his mouth's primary purposes is still to provide you with ample <<if $PC.dick != 0>>blowjobs<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>cunnilingus<</if>>. With $activeSlave.slaveName already kneeling, it is merely a matter of undoing $his gag before you can put $his mouth to work. <<if $activeSlave.skill.oral >= 100>> Though $he has spent much time gagged, $his mastery at giving oral is unaffected. <<elseif $activeSlave.skill.oral > 60>> @@ -19412,20 +19413,22 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <</link>> <br><<link "Remove the gag for a few minutes">> <<replace "#result">> - You wordlessly remove the $activeSlave.collar and watch as $activeSlave.slaveName opens and closes $his mouth testingly, as if $he has forgotten what it feels like to do so without obstruction. Though you eventually return to the gag to its rightful place in $his mouth, $he @@.mediumaquamarine;trusts you more@@ for granting $him a few moments respite from the gag. + You wordlessly remove the $activeSlave.mouthAccessory and watch as $activeSlave.slaveName opens and closes $his mouth testingly, as if $he has forgotten what it feels like to do so without obstruction. Though you eventually return to the gag to its rightful place in $his mouth, $he @@.mediumaquamarine;trusts you more@@ for granting $him a few moments respite from the gag. <<set $activeSlave.trust += 4>> <</replace>> <</link>> <br><<link "Torment $him with the gag">> <<replace "#result">> - Though having a $activeSlave.collar constrict $his mouth is torment enough, you take the time to linger and add to $his torturous existence. $activeSlave.slaveName soon discovers that the straps of a gag can always be made tighter, the - <<if ($activeSlave.collar == "ball gag")>> + Though having a $activeSlave.mouthAccessory constrict $his mouth is torment enough, you take the time to linger and add to $his torturous existence. $activeSlave.slaveName soon discovers that the straps of a gag can always be made tighter, the + <<if ($activeSlave.mouthAccessory == "ball gag")>> ball can always be made larger, - <<elseif ($activeSlave.collar == "bit gag")>> + <<elseif ($activeSlave.mouthAccessory == "bit gag")>> the bit can always be made thicker, - <<elseif ($activeSlave.collar == "dildo gag")>> + <<elseif ($activeSlave.mouthAccessory == "ring gag")>> + the ring can always be made wider, + <<elseif ($activeSlave.mouthAccessory == "dildo gag")>> the dildo can always be made larger, - <<elseif ($activeSlave.collar == "massive dildo gag")>> + <<elseif ($activeSlave.mouthAccessory == "massive dildo gag")>> the dildo can always be made wider and longer, <</if>> and the punishments rendered for daring to show any discomfort can always be harsher and stricter. Come the end of your session with $him, $activeSlave.slaveName <<if $activeSlave.fetish == "masochist">> is mortified by the intensity of $his orgasms, @@.hotpink;and more convinced than ever that $he's a pain slut,@@ and yet<</if>> @@.gold;scuttles away quickly, having learnt a harsh lesson about your power over $his body.@@ diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw index 7481e8a2993a5674152e1d566ab0eb4f06196905..e975241557b4f9072f6df7b7420ce4c531bb3ed9 100644 --- a/src/uncategorized/dairyReport.tw +++ b/src/uncategorized/dairyReport.tw @@ -365,7 +365,7 @@ <<set $slaves[$i].diet = "healthy">> <</if>> <<if $dairyRestraintsSetting > 1>> - <<set $slaves[$i].collar = "none", $slaves[$i].choosesOwnClothes = 0, $slaves[$i].clothes = "no clothing", $slaves[$i].vaginalAccessory = "none", $slaves[$i].vaginalAttachment = "none", $slaves[$i].dickAccessory = "none", $slaves[$i].buttplug = "none", $slaves[$i].chastityAnus = 0, $slaves[$i].chastityPenis = 0, $slaves[$i].chastityVagina = 0>> + <<set $slaves[$i].collar = "none", $slaves[$i].faceAccessory = "none", $slaves[$i].mouthAccessory = "none", $slaves[$i].choosesOwnClothes = 0, $slaves[$i].clothes = "no clothing", $slaves[$i].vaginalAccessory = "none", $slaves[$i].vaginalAttachment = "none", $slaves[$i].dickAccessory = "none", $slaves[$i].buttplug = "none", $slaves[$i].chastityAnus = 0, $slaves[$i].chastityPenis = 0, $slaves[$i].chastityVagina = 0>> <</if>> <<switch $dairyDecoration>> <<case "Arabian Revivalist" "Aztec Revivalist" "Chattel Religionist" "Chinese Revivalist" "Degradationist" "Edo Revivalist" "Egyptian Revivalist" "Roman Revivalist" "Subjugationist" "Supremacist">> diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw index 1ae369626da629dd78ddb72c359497420ce333a4..82cb1109e2488a930f43cb0df1d06e543e66a0ea 100644 --- a/src/uncategorized/longSlaveDescription.tw +++ b/src/uncategorized/longSlaveDescription.tw @@ -1902,6 +1902,8 @@ $He is <<if $activeSlave.fuckdoll == 0>> <<collarDescription>> + <<= App.Desc.faceAccessory($activeSlave)>> + <<= App.Desc.mouthAccessory($activeSlave)>> <<if ($activeSlave.relationship > 4)>> <<if hasAnyArms($activeSlave)>> $He has a simple gold band on the little finger of $his <<if !hasLeftArm($activeSlave)>>right<<else>>left<</if>> hand. diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw index 384aa92f8749652c400a601dfe98500dd5098eaf..d438ff3b6ba13708e9d7bff4bcabd42b04c5579e 100644 --- a/src/uncategorized/randomNonindividualEvent.tw +++ b/src/uncategorized/randomNonindividualEvent.tw @@ -187,7 +187,7 @@ <</if>> <<elseif ($slaves[$i].fetish == "cumslut")>> <<if ($cumslutID == 0)>> - <<if !["dildo gag", "massive dildo gag", "ball gag", "bit gag"].includes($slaves[$i].collar)>> + <<if ["ring gag", "none"].includes($slaves[$i].mouthAccessory)>> <<set $cumslutID = $slaves[$i].ID>> <</if>> <</if>> diff --git a/src/uncategorized/reBoomerang.tw b/src/uncategorized/reBoomerang.tw index ed98acb50cd33914c9753acec6f6229369d93d0f..1343e924d6501ee9ad55bc9f81b5b830a210a314 100644 --- a/src/uncategorized/reBoomerang.tw +++ b/src/uncategorized/reBoomerang.tw @@ -18,7 +18,7 @@ Your work is interrupted by $assistant.name with an alert from the entrance to t brings up the relevant feeds. There's a naked body crumpled pathetically against one wall of the entryway, beneath the communications panel. It's <<= SlaveFullName($activeSlave)>>, whom you sold _weeks weeks ago. $He's looking up into one of the cameras plaintively. "Plea<<s>>e take me back," $he whispers, not wanting to draw the attention of passersby, and knowing that $his faint words will be picked up and amplified for you. -<<set $activeSlave.collar = "none", $activeSlave.choosesOwnClothes = 0, $activeSlave.clothes = "no clothing", $activeSlave.buttplug = "none", $activeSlave.vaginalAccessory = "none", $activeSlave.dickAccessory = "none", $activeSlave.chastityAnus = 0, $activeSlave.chastityPenis = 0, $activeSlave.chastityVagina = 0>> +<<set $activeSlave.collar = "none", $activeSlave.faceAccessory = "none", $activeSlave.mouthAccessory = "none", $activeSlave.choosesOwnClothes = 0, $activeSlave.clothes = "no clothing", $activeSlave.buttplug = "none", $activeSlave.vaginalAccessory = "none", $activeSlave.dickAccessory = "none", $activeSlave.chastityAnus = 0, $activeSlave.chastityPenis = 0, $activeSlave.chastityVagina = 0>> <<run setHealth($activeSlave, jsRandom(-40, -25), $activeSlave.health.shortDamage + jsRandom(0, 10), $activeSlave.health.longDamage + jsRandom(0, 10))>> /* ------------------ pregnancy setup start here----------------- */ diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 83550af2493902931580e114b76664d95b73c113..8aa14a826137b1ac7578e65d03365a90ba471c7a 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -169,6 +169,10 @@ <span id="collar"></span> /*<script>App.UI.Wardrobe.collar(getSlave(V.activeSlave.ID))</script>*/ + <span id="faceAccessory"></span> + + <span id="mouthAccessory"></span> + <span id="armAccessory"></span> /*<script>App.UI.Wardrobe.armAccessory(getSlave(V.activeSlave.ID))</script>*/ diff --git a/src/utility/descriptionWidgetsStyle.tw b/src/utility/descriptionWidgetsStyle.tw index 66c9faa27605e2950b953bd49ab01a52efdba21a..7263bf0f8be8aca102c60e14991ba052068e8c36 100644 --- a/src/utility/descriptionWidgetsStyle.tw +++ b/src/utility/descriptionWidgetsStyle.tw @@ -3744,10 +3744,6 @@ $His <<switch $activeSlave.collar>> <<case "uncomfortable leather">> $He is wearing an uncomfortable leather collar with a useful steel ring in front. - <<case "dildo gag">> - $He is wearing a sturdy leather collar that continues up to restrict $his jaw as well. It holds a ring gag in $his mouth, into which slots a formidable inward-facing dildo that reaches down $his throat. It can be removed to facefuck $him. - <<case "massive dildo gag">> - $He is wearing a sturdy leather collar that continues up to restrict $his jaw as well. It acts as an anchor for an enormous inward-facing dildo that reaches deep down $his throat. The sheer size of the phallus forces $his mouth as wide as it will go and considerably bulges $his throat. Fortunately for $him, it is designed to allow $him to be able to breathe through $his nose; though when removed, the poor $girl finds $himself incapable of closing $his mouth for some time. <<case "preg biometrics">> <<if $activeSlave.pregSource > 0>> <<set _daddy = findFather($activeSlave.pregSource), _daddy = _daddy.slaveName>> @@ -3809,8 +3805,6 @@ $His $He is wearing a tight silk ribbon fitted to $his neck, it is oddly elegant. <<case "tight steel">> $He is wearing a tight steel collar whose restricting metal touch $he cannot escape. - <<case "porcelain mask">> - $He is wearing a beautiful porcelain mask to hide $his unsightly facial features. <<case "shock punishment">> $He is wearing a utilitarian collar with a punishment device at $his throat to administer agonizing shocks. <<case "neck corset">> @@ -3829,12 +3823,10 @@ $His $He is wearing a comfortable leather collar with a small steel cowbell at $his throat. <<case "bowtie">> $He is wearing the collar from a white formal shirt, and a black bowtie, though these conceal an actual collar that works perfectly well for restraint. + <<case "neck tie">> + $He is wearing a neck tie, though it conceals an actual collar that works perfectly well for restraint. <<case "ancient Egyptian">> $He is wearing a beautiful golden wesekh, a collar that spreads from $his neck out onto both shoulders and down $his front. - <<case "ball gag">> - $He is wearing a mouth filling, <<if $activeSlave.makeup == 3 || $activeSlave.makeup == 6 || $activeSlave.makeup == 8>>$activeSlave.hColor<<else>>red<</if>> ball-shaped gag that prevents $him from uttering a word while keeping $him uncomfortably aware of $his status. - <<case "bit gag">> - $He is wearing a jaw spreading, bar-shaped gag that prevents $him from speaking while keeping $him uncomfortably aware of $his status. <<case "cruel retirement counter" "nice retirement counter">> $He is wearing a <<if $activeSlave.collar == "cruel retirement counter">>heavy metal collar<<else>>nice collar, almost a necklace,<</if>> with a small numerical display reading <<if $activeSlave.indenture > -1>>